В этой статье в основном объясняется протокол RTMP и используется Wireshark для захвата и анализа пакетов RTMP.
RTMP — это аббревиатура от «Протокол обмена сообщениями в реальном времени». Этот протокол основан на TCP и представляет собой набор протоколов, включающий базовый протокол RTMP и несколько его вариантов, таких как RTMPT/RTMPS/RTMPE.
RTMP — это сетевой протокол, предназначенный для передачи данных в реальном времени. Он в основном используется для передачи аудио, видео и данных между платформой Flash/AIR и серверами потокового мультимедиа/интерактивными серверами, поддерживающими протокол RTMP. Программное обеспечение, поддерживающее этот протокол, включает Adobe Media Server/Ultrant Media Server/red5 и т. д. RTMP, как и HTTP, относится к прикладному уровню четырехуровневой модели TCP/IP.
Протокол обмена сообщениями в реальном времени RTMP (протокол обмена сообщениями в реальном времени) — это открытый протокол, разработанный Adobe Systems для передачи аудио, видео и данных между Flash-плеерами и серверами.
Протокол RTMP форматирует данные во время передачи. Чтобы лучше обеспечить мультиплексирование, пакетирование и справедливость информации во время фактической передачи, отправитель разделит сообщение на фрагменты с идентификаторами сообщения. Каждый фрагмент может быть отдельным сообщением или может быть отдельным. часть сообщения. Принимающая сторона восстановит фрагмент до полного сообщения на основе длины данных, содержащихся в фрагменте, идентификатора сообщения и длины сообщения, тем самым реализуя отправку и получение информации. (Сообщение, Чанк)
Он существует во многих вариантах:
RTMP-сервер: Nginx+rtmp (Windows) Push-стриминг: ffmpeg Плеер: VLC (виртуальная машина Linux) Захват пакетов: Wireshark
RTMP-сервер: настройки среды Nginx+rtmp (windows) при необходимости можно получить самостоятельно:
Связь:https://pan.baidu.com/s/1AcIVERWUPbJL1zu8yCcAzw Код извлечения: mtdf
Дважды щелкните файл nginx8080.exe.
В диспетчере задач вы можете увидеть, что nginx начал работать.
Виртуальная сетевая карта сетевого адаптера VMware VMnet8 (виртуальная сеть NAT), используемая виртуальной машиной, взаимодействует с хостом (Windows), поэтому здесь мы просто берем сетевую карту VMware Network Adaptor VMnet8.
Нажмите команду потоковой передачи:
ffmpeg -re -i SampleVideo_1280x720_20mb.mp4 -vcodec libx264 -acodec aac -r 30 -g 150 -f flv -y rtmp://192.168.36.176:1935/live/test1
Эта команда использует инструмент FFmpeg для преобразования входного видеофайла SampleVideo_1280x720_20mb.mp4 в формат FLV и его потоковой передачи на указанный URL-адрес rtmp://192.168.36.176:1935/live/test1 по протоколу RTMP;
-re
:Действительночасмодель(real-time)Чтение входного файла,Имитируйте реальную скорость передачи данных.-i SampleVideo_1280x720_20mb.mp4
:Укажите имя входного файладля SampleVideo_1280x720_20mb.mp4。-vcodec libx264
:выбирать H.264 Кодер как для видеокодера;-acodec aac
:выбирать AAC Кодер представляет собой аудиокодер;-r 30
:Установить выходное видеоиз Частота кадровдля 30 кадров в секунду;-g 150
:Установить интервал ключевых кадровдля 150 рамка. Ключевой кадр или декодирование видео из начальной точки, более короткий интервал ключевого кадра может улучшить производительность видео при быстрой перемотке вперед/назад;-f flv
:Укажите вывод ФорматдляFLV(Flash Video);-y
:Автоматически перезаписывать выходные файлы,если сохранить файл с тем же именем, что и существующий и он будет заменен;rtmp://192.168.36.176:1935/live/test1
:Укажите выводиз URL адрес,к RTMP передача протокола в 192.168.36.176 сервериз 1935 конецротиз live Приложения серединаиз test1 потокв:
rtmp://ip:port/application/channelname ip:локальная машина ip адрес
Нажмите процесс:
① Откройте сторону виртуальной машины. VLC клиент,СМИ -> Открытая сетевая строка потока
,входить rtmp://192.168.36.176:1935/live/test1
② Нажмите «Воспроизвести», и вы увидите, что поток успешно загружен.
③. Проверьте Wireshark на стороне Windows, и вы увидите нужное нам сообщение RTMP.
в 192.168.36.176
для хозяина ip
адрес,192.168.137.128
На стороне виртуальной машины ip
адрес, мы смотрим только RTMP Просто отправьте сообщение.
я поймал это RTMP сообщение,этотвнутрижитьодин Удобно скачиватьпозжеиспользоватьприезжатьчас Возьми сразу на анализ:RTMP-сообщение
Мы изучаем протокол RTMP на основе пакетов, которые мы перехватили с помощью Wireshark выше.
Прямая трансляция: Видео и Audio После кодирования кодировщиком происходит чередование Временная метка: временная метка Видео (потоковое видео) : ----------------------------------(Каждый - Представляет собой видеопакет) Аудио: ++++++++++++++++++++ (каждый + Представляет аудиопакет) Mp4 Формат : ###----++------+++------, файл имеет только одну информацию заголовка (если заголовок файла потерян при передаче по сети, аудио и видео потоки посередине невозможно расшифровать) Ts Формат:[#----+] [#----+] [#----+], каждый пакет имеет информацию заголовка (подходит для передачи по сети) RTMP:Message:[----+] [----+] [----+];Chunk Чанк (сообщение слишком длинное, разбито на фрагменты) кусок). (RTMP Передача с использованием из Форматда flv) Flv: [----+] [----+] [----+];
RTMP протоколдапротокол прикладного уровня,да зависит от надежности нижележащего уровня и протокола транспортного уровня (обычно да TCP)обеспечить передачу информацииизнадежностьиз。существоватьбаза Втранспортный уровеньпротоколиз Связь Создание завершеноназад,RTMP протокол Также хочуклиентисерверпроходить “RTMP рукопожатие" установить канал транспортного уровня на основе RTMP Connection Связь,существовать Connection По ссылке будет передаваться некоторая управляющая информация, например SetChunkSize
,SetACKWindowSize
。
в CreateStream Команда создаст Stream Связь, используемая для передачи определенных аудио- и видеоданных, и управления этой передачей некоторой информации. командная информация.
RTMP протоколпередача инфекциичасвстречак данным(Прямая трансляция, загрузка локальных видеофайлов)Будь собой из Формат (Сообщение/Чанк),этот Этот вид сообщения Форматиз мы называем RTMP Message,Фактическая передача данных лучше обеспечивает мультиплексирование, пакетирование и справедливость информации.,отправлятьконецвстреча Пучок Message разделен на Message ID из Chunk,Каждыйиндивидуальный Chunk возможныйдаодининдивидуальныйодиниз Сообщение, возможно Message из части существование получает окончание будет основано на chunk середина Включатьиз data длина, сообщение id и message из Длина ручки chunk снижениестать полнымиз Сообщение, тем самым реализуя отправку и получение информации.
хотеть Учреждатьодининдивидуальныйэффективныйиз RTMP Connection Ссылка, прежде всего “RTMP рукопожатие"
RTMP В самом договоре этого не предусмотрено. 6 индивидуальный Message из Конкретный порядок передачи, но RTMP Разработчики протокола должны гарантировать это Который сейчас час:
Теоретически, если вышеуказанные условия соблюдены, как организовать 6 индивидуальный Message из порядка все да может, но фактическое выполнение серединадля существования гарантировано Основываясь на функции подтверждения сертификата и аутентификации, постарайтесь уменьшить количество сообщений. Как правило, порядок отправки тот же, и можно передать немного. wireshark Понять ffmpeg Отправьте пакет для проверки.
Chunk Stream предназначен для передачи RTMP Chunk изпотокиз логически из абстрактных, связанных с клиент-сервером RTMP из информациясуществоватьэтотиндивидуальныйпотоктоп общение。этотиндивидуальныйпотокначальствоиз Операция такжеданассосредоточиться на RTMP протоколизфокус。
[Информация управления, информация аудио- и видеопотоков]
этотвнутрииз Message да означает Долженпротокол Форматиз, который можно разделить на Chunk Отправьте сообщение, содержащее из Поле следующего содержания:
Timestamp
:Новости изчас Временная метка(но Нетодин Конечнодакогдавпередчасмежду),4 индивидуальныйбайт;Длина
:даобратитесь к Message Полезная нагрузка (нагрузка сообщения) — длина аудио- и видеоинформации, 3 индивидуальныйбайт;TypeId(тип Id)
:Новости из Тип Id,1 индивидуальныйбайт;Message Stream ID (изпоток сообщения ID)
:Каждыйиндивидуальный Новости изтолькоодинлоготип,разделен на Chunk иснижение Chunk для Message изчас Ходудав соответствии сэтотиндивидуальный ID Чтобы определить, да ли то же самое индивидуальное сообщение Chunk из,4 отдельные байты и хранятся в формате с прямым порядком байтов.RTMP существование Отправка и получение данныхизчас не означает да Message для единицы из, а да означает Message Разделить на Chunk отправить пока и долженсуществоватьодининдивидуальный Chunk Только после завершения отправки процесс может быть завершен. отправку Внизодининдивидуальный Chunk。Каждыйиндивидуальный Chunk средний с MessageID представлять Где оно находится?индивидуальный Сообщение, принять конец также будет следовать за этим индивидуальным id Грядущий генерал chunk собран в Message。
Вопрос: Почему RTMP к Message Разделить на дифференцированном Chunk Шерстяная ткань? отвечать:проходить Расколоть,данные Большее количествоиз Message Можно Разделить намализ “Message”,Таким образом, вы можете избежать постоянной отправки сообщений с низким приоритетом и блокировки изданных сообщений с высоким приоритетом.,Например, видео существуют из процесса передачи середина.,будет включать видеокадры,аудиокадри RTMP Управляющая информация, если непрерывная отправка аудиоданных или управляющих данных слов может привести к блокировке видеокадров, а затем вызвать наиболее неприятный феномен задержки при просмотре видео. То же, что часверно меньше, чем данныеиз Сообщение, вы можете передать Chunk Header из Поле для сжатия информации, тем самым уменьшая объем передаваемой информации
Chunk изразмера по умолчаниюда 128 байт,существоватьпередача инфекциипроцесссередина,человеком по имени Set Chunk Size Информацию управления можно установить Chunk количество данныхмаксимально,существоватьотправлятьконециприниматьконецвстреча Хранить отдельноодининдивидуальный Chunk Размер. Вы можете установить это индивидуальное значение отдельно, чтобы изменить свою собственную сторону для отправки. Chunk из Максимальный размер.
Больше Chunk Сниженные расчеты на одного человека chunk изчас пространство таким образом уменьшилось CPU иззанимать скорость использования, но да это будет занимать больше изчаса При отправке данных между существующими, особенно в условиях сети с низкой пропускной способностью, существует вероятность блокировки передачи более важной информации позже. Меньший Chunk Может уменьшить подобную проблему блокировки, но небольшая Chunk Будет введено слишком много дополнительной информации (Чанк серединаиз Заголовок), небольшое количество многократных передач также может вызвать прерывания передачи, что приводит к невозможности в полной мере использовать преимущества широкой полосы пропускания, поэтому она не подходит для передачи с высокой скоростью передачи данных.
существование на самом деле отправить час следует действительно отправлять изданные с разными Chunk Size Попробуй и получи подходящую информацию с помощью анализа пакета «Понять» и других средств. Chunk Размер и существующий процесс передачи середина могут быть динамически скорректированы на основе информации о полосе пропускания и фактической информации о размере. Chunk размера, тем самым максимизируя CPU утилизации и снизить вероятность блокировки информации.
Содержит chunk stream ID
(потокряд Id)и chunk type
(chunk из типа), чанк stream id Обычно сокращается как CSID, используемый для уникальной идентификации конкретного фрагмента канала; type Определить будущее Message Header из Формат。Basic Header длина майда 1,2 или 3 индивидуальныйбайт,в chunk type издлинадазафиксированныйиз(занимать 2 Бит, обратите внимание, что единица измерения бит, бит), Базовый Header длина зависит от CSID Из-за размера существования достаточно для хранения этих двух отдельных Полеиз, исходя из того, что лучше всего использовать как можно меньше байтов, чтобы уменьшить введение Header Увеличить количество изданных.
RTMP протокол поддерживает определяемые пользователем [3, 65599] из CSID,0,1,2 Зарезервировано протоколом для представления специальной информации. 0 представлять Basic Header Всего занято 2 индивидуальныйбайт,CSID Между [64,319],1 представлятьзаниматьиспользовать 3 индивидуальныйбайт,CSID Между [64, 65599], 2 представлять Должен chunk да управляющая информация и информация о некоторых командах.
chunk type изфиксированной длиныдля 2 немного, поэтому CSID издлинада(6=8-2)、(14=16-2)、(22=24-2)серединаизодининдивидуальный。когда Basic Header для 1 индивидуальныйбайтчас,CSID занимать 6 Бит, 6 Биты могут представлять до 64 индивидуальный номер, так что в этом случае CSID существовать[0,63] между,vОпределяется пользователем из диапазона для[3,63];когда Basic Header для 2 индивидуальныйбайтчас,CSID занимать 14 немного, в этот момент протокол будет chunk type Все остальные биты существующего байта установлены в значение для 0,оставатьсяизодининдивидуальныйбайт Приходитьповерхность Показывать CSID-64, поэтому есть 8 отдельные двоичные биты для хранения CSID,8 Биты могут обозначать [0, 255] в общей сложности. 256 индивидуальный номер, так что в этом случае CSID существовать[64,319],в 319=255+64;когда Basic Header для 3 индивидуальныйбайтчас,CSID занимать 22 бит, этот часпротокол установит [2, 8] байта для 1. Остальное из 16 индивидуальныйбайтповерхность Показывать CSID-64,поэтому есть 16 индивидуальныйбиты для хранения CSID,16 Биты могут обозначать [0, 65535] в общей сложности. 65536 индивидуальный номер, так что в этом случае CSID существовать[64,65599],в 65599=65535+64, нужно обратить внимание на изда, Базовый Header да использует метод хранения с малым концом, чем дальше назад находятся байты, тем выше порядок величины, поэтому по этому принципу 3 отдельный байт, каждый бит значения для вычисления CSID час,отвечать Долженда:<Нет.трииндивидуальныйбайтизценить>x256+<второйиндивидуальныйбайтизценить>+64
можно увидеть 2 индивидуальныйбайти 3 индивидуальныйбайтиз Basic Header Все, что ты можешьповерхность Показыватьиз CSID да имеет пересечение из [64, 319], но реальный час реализации все равно должен использоваться в соответствии с принципом наименьших байтов из 2 индивидуальныйбайтизповерхность Показывать Способ Приходитьповерхность Показывать[64,319]из CSID
Содержит Отправить изактуальная информация(возможныйдавесьиз,такжевозможныйдаодинчасть)изописыватьинформация.Message Header из Формати Длина зависит от Basic Header из chunk тип, общий 4 какая разница из Формат,Зависит отначальство Упоминается в лицоприезжатьиз Basic Header серединаиз fmt Поле Контроль. Следующие байты расположены в порядке от большего к меньшему: достоинствоэтот 4 формат семени Message Header。
Type=0
type=0
час Message Header заниматьиспользовать 11 индивидуальныйбайт,Остальные три могут показывать изданные поверхности, все они могут показывать поверхность.,носуществовать chunk stream изначинатьиз Нет.одининдивидуальный chunk и информация заголовка серединаизчаста, обратная временная метка (т. е. значение и предыдущее индивидуальное chunk По сравнению с сокращением, обычно это происходит, когда существование отступает и играет изчас) Форма изчаса должна использоваться, когда этотт.timestamp
(час Временная метка):заниматьиспользовать 3 отдельные байты, поэтому он может отображаться до поверхности 16777215=0xFFFFFF=,когдаэтоизценить Превосходитьэтотиндивидуальныймаксимумценитьчас,этоттрииндивидуальныйбайт Столичная обстановкадля 1. этот вид настоящего из timestamp будет переведен в Extended Timestamp поле,принимающая сторона судит timestamp Поле 24 индивидуальный Битдудля 1 пойду, когда Extended timestamp середина анализирует фактическую промежуточную метку исхода.
message length
(информацияданныеиздлина) :заниматьиспользовать 3 отдельные байты, поверхность указывает длину фактически отправленных изданных сообщений, таких как аудиокадры, видеокадры и т. д., в байтах. Вниманиеэтотрида Message длина, также да chunk Принадлежат к из Message изобщийданныедлина ,вместо chunk сам Data изданныеиздлина。message type id
(Новости из Тип id):заниматьиспользовать 1 отдельные байты, поверхность указывает фактически отправленный тип изданных, например 8 представлять Аудиоданные、9 представлятьвидеоданные。msg stream id
(Новости изпоток id) :заниматьиспользовать 4 индивидуальныйбайт,поверхность Показывать Должен chunk Местосуществоватьизпотокиз ID (Примечание: я до сих пор не совсем понимаю этот индивидуальный ID Что именно это означает? stream идентификатор,поскольку basic header уже есть chunk stream id Понятно,для Чтоэтотвсплывать сноваиндивидуальный msg stream id, упомянутый ниже, «без представления msg stream id из 4 индивидуальныйбайт,поверхность Показыватьэтот chunk и в последний раз из chunk Таким образом, существованиеизпоток одно и то же", - сказал данидле верныйпоток Связь, тогда смысл таков: да сказано msg stream id и chunk stream id Что это значит? ) ,и Basic Header из CSID Такой же, он использует метод small end Storage.Type=1
type=1
час Message Header заниматьиспользовать 7 индивидуальныйбайт,пропускать Понятноповерхность Показывать msg stream id из 4 индивидуальныйбайт,поверхность Показыватьэтот chunk и в последний раз из chunk Это то же самое, что и поток, и передающая сторона имеет только отдельный поток.timestamp delta
:заниматьиспользовать 3 индивидуальныйбайт,Уведомлениеэтотвнутрии type=0 час другой,хранилищеиздаиначальствоодининдивидуальный chunk Разница между изчас. похожий упомянутый выше из временная метка, когда его значение превышает 3 индивидуальныйбайт Все, что ты можешьповерхность Показыватьизмаксимумценитьчас,трииндивидуальныйбайт Столичная обстановкадля 1. Фактическая разница между марками будет переведен в Extended Timestamp Полесередина,приниматьконецсуществоватьсуждение timestamp delta Поле 24 индивидуальный Битдудля 1 пойду, когда Extended timestamp середина анализирует время машины и определяет разницу между последней отметкой времени.Type=2
type=2
час Message Header заниматьиспользовать 3 индивидуальныйбайт,Относитесь к type=1 В формате отсутствует поверхность, указывающая длину сообщения. 3 индивидуальный байт индикация иповерхности тип сообщения из 1 индивидуальныйбайт,поверхность Показыватьэтот chunk и Последняя отправкаиз chunk Все существующиеизпоток, длина сообщения и тип сообщения одинаковы. Оставшиеся из этого отдельные байты поверхности показывают timestamp дельта, используйте то же самое type=1。Type=3
Выше мы упоминали, что в chunk Там будет временная метка timestamp разница между марками timestamp дельта, и они не будут существовать одновременно, только одно из двух больше, чем 3 отдельные байты могут отображать максимальное значение 0xFFFFFF=16777215 час,талантвстречаиспользоватьэтотиндивидуальный Поле Приходитьповерхность Показыватьнастоящийизчас Временная метка,В противном случаеэтотиндивидуальный Поледля 0。Расширятьчас Временная метказанимать 4 отдельные байты, максимальное значение, которое может быть отображено, — да 0xFFFFFFFF=4294967295。
Если расширенные метки времени включены, метка времени Полеили timestamp delta Установить все для 1,поверхность Показыватьотвечать Долженидти Расширятьчас Временная метка Поле Приходить提取настоящийизчас Временная меткаилразница между марками。Обратите внимание, что временная метка расширенного часа хранит полное значение изда, вместоминусчас Временная меткаилразница между маркамиизценить。
использоватьсемьяслойлапшаначальствонастоящий想Отправить изипротоколне имеющий отношенияизданные,длинасуществовать (0,chunkSize]
между.
Пример 1
Пример 2
существовать RTMP из chunk поток будет использовать некоторые специальные значения для протоколирования управляющих сообщений правительства, они Message Stream ID Необходимый 0(представлятьконтрольпотокинформация),CSID Необходимый 2,Message Type ID (Примечание: сообщение type ID существовать message header внутри) может для 1, 2, 3, 5, 6, конкретное послание будет объяснено ниже. Управляющие сообщения, полученные до конца, будут игнорироваться. chunk Отметка времени серединаизчаса, вступает в силу сразу после получения. (Примечание: я понимаю, что контрольное сообщение изпротокол должно быть «Долженда поставить существование». chunk data внутрииз)
Set Chunk Size(Message Type ID=1)
:настраивать chunk середина Data Максимальное количество байт, которое может переносить Поле, по умолчанию — для 128Б, процесс связи середина можно настроить отправкой сообщения Должен. chunk Size по размеру (не менее 128B), и каждая из сторон общения будет поддерживать индивидуальный chunkSize, два конца chunkSize данезависимыйиз。напримеркогда A хочу B отправлятьодининдивидуальный 200B из Сообщение, но по умолчанию chunkSize да 128B, поэтому сообщение «Должен» разделено на Data соответственно для 128B и 72B издваиндивидуальный chunk Отправить, если это час, сначала отправьте индивидуальную настройку chunkSize для 256B из Сообщить и отправить еще раз Data для 200B из чанк, больше не разделенный локально Message,B принял Set Chunk Size изпротокол контрольного сообщения, время будет скорректировано изпринять из chunk из Данные по размеру, нет необходимости разделять два отдельных chunk композициядляодининдивидуальный Message。 , но на самом деле все больше, чем 16777215=0xFFFFFF Значения из не используются, поскольку для chunk size не может быть больше, чем Message издлина,поверхность Показывать Message длина Поледафор 3 индивидуальныйбайтповерхность Показыватьиз,Максимальное значение может быть только для 0xFFFFFF.
Abort Message(Message Type ID=2)
:когдаодининдивидуальный Message разделенныйдлямногоиндивидуальный кусок, принимающая сторона получила только его часть chunk час, (примечание: в этом нет подлежащего, насколько я понимаю, это изда «Отправить конец, отправить контрольное сообщение Должен») Отправить управляющее сообщение Должен, поверхность означает «Отправить конец», больше не передавать одно и то же. Message из кусок, примите конец после получения этого индивидуального сообщения и отбросьте это неполное из chunk。Data данныесередина只需хотетьодининдивидуальный CSID,поверхность Показыватьвыбросить Должен CSID из Все полученоиз chunk。Acknowledgement(Message Type ID=3)
:когдаполучатьверноконецизинформацияразмер и т. д.Вокноротразмер(Window Size)часприниматьконецхотетьраз馈одининдивидуальный ACK Сообщите отправляющей стороне об окончании, и вы сможете продолжить отправку данных. Размер окна на да означает, что получено, принять конец возврата из ACK Максимальное количество байт, которое можно отправить, равно из, и возвращается из. ACK середина будет отправлена вместе с предыдущим индивидуальным ACK Количество байт, полученных после. (Примечание: на самом деле я мало что в этом понимаю. Возможно, подтвержу информацию по размеру окна индивидуального размера, но пока не буду вдаваться в подробности.)Window Acknowledgement Size(Message Type ID=5)
:отправлятьконецсуществоватьловитьполучатьприниматьконецвозвращатьсяиздваиндивидуальный ACK Максимальное количество байт, которое может быть отправлено во времяSet Peer Bandwidth(Message Type ID=6)
:пределверноконециз Выходная полоса пропускания。приниматьконецловитьполучать Долженинформацияназадвстречапроходитьнастраиватьинформациясерединаиз Window ACK Size Приходитьпределужеотправлятьноеще нетпринялобратная связьиз Новости изразмер Приходитьпределотправлятьконецизотправлятьпропускная способность。еслиинформациясерединаиз Window ACK Size и Последнее отправлено в Отправить конециз size Если у вас есть разные слова, вам следует вернуть одно индивидуальное. Window Acknowledgement Size из Контрольное сообщение.Hard(Limit Type=0)
:приниматьконецотвечать Должен Воля Window Ack Size Установить для сообщения серединаиз значениеSoft(Limit Type=1)
:приниматьконец Можеткговорить Window Ack Size Предположим, что значение для сообщения серединаиз, вы также можете сохранить исходное значение (предпосылка исходного значения). Size Небольшое и Должен управляющее сообщение серединаиз Window Ack Size)Dynamic(Limit Type=2)
:еслиначальство Второсортныйиз Set Peer Bandwidth информациясерединаиз Limit Type для 0, нажми и в этот раз Hard Обработать, в противном случае игнорировать это сообщение и не устанавливать его. Window Ack Size。Различные типы сообщений RTMP
Command Сообщение (командное сообщение, Сообщение Type ID=17 или 20)
:поверхность Показыватьсуществоватьклиентисервермеждупередачаизсуществоватьверноконецвыполнить какое-то действиеиз Заказинформация(Примечание:Простой Приходитьобъяснять Сразудауведомитьверно方хотетьначинать Что ты делаешь?из Заказ),Например, подключить поверхность указывает на соединение верконец, верноконецесли соглашается подключиться из запишет и отправит информацию об окончании и вернет сообщение об успешном подключении, опубликует Поверхность указывает на то, что нужно начать направлять поток к верной стороне, принять конец. После получения приказа будьте готовы принять верныйконец для отправки сообщения изпоток. Command Message Конкретные особенности. когда Использование информации AMF0 Кодирование часа, Сообщение Type ID=20,AMF3 Кодированиечас Message Type ID=17。Data Message(данныеинформация,Message Type ID=15 или 18)
:передачаодиннемного юанейданные(MetaData,Например, название видео,разрешение и т. д.)илииспользоватьсемья Настроитьизодиннекоторыйинформация。когдаинформацияделатьиспользовать AMF0 Кодирование часа, Сообщение Type ID=18,AMF3 Кодированиечас Message Type ID=15。Shared Object Сообщение (общийподелиться сообщением, Сообщение Type ID=16 или 19)
:поверхность Показыватьодининдивидуальный Flash Значок типа изверно состоит из набора ключевых значений верноиз и используется для мультиклиентного и мультиэкземплярного использования. когда Использование информации AMF0 Кодирование часа, Сообщение Type ID=19,AMF3 Кодированиечас Message Type ID=16。Audio Сообщение (аудиосообщение, Сообщение Type ID=8)
:Аудиоданные。Video Сообщение (видеообращение, Сообщение Type ID=9)
:видеоданные。Aggregate Message (Сбор информации, Сообщение Type ID=22)
:многоиндивидуальный RTMP ребенок Новости изсобиратьUser Control Message События (сообщение управления пользователем, Сообщение Type ID=4)
:информироватьверно Партийное исполнение Долженинформациясередина Включатьизиспользоватьсемьяконтрольсобытие,например Stream Begin Событие уведомляет сторону о потоке информации о начале передачи. Как упоминалось ранее, из протокола управляющей информации (Protocol Control Message)другой,этотдасуществовать RTMP протоколслойиз,вместосуществовать RTMP chunk потокпротоколслойиз,этотиндивидуальныйлегко спутать。Долженинформациясуществовать chunk потоксерединаотправлятьчас,Message Stream ID=0,Chunk Stream Id=2,Message TypeId=4。Отправьте конец и отправьте час с помощью команды из имени.,Например, подключить,TransactionID Поверхность указывает на эту команду из логотипа, Команда Object поверхность показывает соответствующие параметры. Примите команду назад после получения команды конец, и будет возвращено одно из следующих трех сообщений серединаиз: _result Сообщение указывает, что команда принята, и партнер может продолжить выполнение процесса, _error Сообщение правительства отклонено. Должен выполнить команду на выполнение операции, метод. name Сообщение существования для команды отправлено окончание выполнения из имени функции ранее. эти три вида ответа из сообщений должны содержать полученное из командного сообщения серединаиз TransactionId Подойдите к поверхности, чтобы указать, к какой отдельной команде относится этот ответ.
Можеткраспознаватьдляотправлять Заказ Новости изверно Как тамдвадобрый,да NetConnection, поверхность указывает на двойной конец верхнего соединения, да Поверхность NetStream отображает информацию о потоке из канала передачи, контролирует информацию о потоке из состояния, например Play Воспроизвести поток, Пауза пауза.
Используется для управления статусом соединения между двумя концами.,В то же время он также обеспечивает асинхронный удаленный вызов метода (RPC) для выполнения определенного метода.,Следующие общие сведения относятся к командам уровня соединения.
connect
:использовать Вклиент Ксерверотправлять连ловить请求,Новости структура следующая
Новости изразотвечатьиметьдвадобрый,_result Указывает на принятие соединения, _error Указывает, что соединение не удалось.
Call
:использовать Всуществоватьверноконецвыполнить функцию,То есть часто говорят, что RPC: удаленный вызов процесса,Новости структура следующая:
еслиинформациясерединаиз TransactionID Нетдля 0 словами, верноконец требует для ответа команду «верно Должен». Структура сообщения следующая:
Create Stream
:创建передача具体информацияизряд,Это позволяет передать конкретную информацию.,Блок передачи информации для ChunkNetstream Учреждатьсуществовать NetConnection выше, через NetConnection из createStream Создание команды, используемой для передачи конкретного аудио, видео и т. д. информация.существовать К протоколу транспортного уровня может быть подключен только один индивидуальный пользователь. NetConnection,ноодининдивидуальный NetConnection Можно построить несколько индивидуальных NetStream Установить различные исходные данные по каналу передачи. Некоторые часто используемые из них перечислены ниже: NetStream Команды, сервер передаст команду после ее получения. onStatus из команды ответить клиенту, поверхность означает когда раньше NetStream из статуса.
Команда onStatus и структура сообщения следующие:
:
играть
: От клиента к серверу делается запрос на получение данных от сервера-конца (если передается информация из видео, а затем запрашивается начало воспроизведения потока). Его можно вызывать несколько раз, и этот образец сформирует группу получателей потока данных. Обратите внимание, что есть индивидуальный reset Поле,поверхность Показыватьда Прикрой этовпередизтранслироватьпоток(настраиватьдля true) также перезапускает игру до конца (при условии, что false)。
play2 (играть)
: иначальстволапшаиз play Команда другая изда, play2 Команда может переключить изпоток, когда существует прежний изпоток, на те же данные, но с другой скоростью передачи данных, серверконец будет поддерживать несколько скоростей передачи файлов для использования клиентом. play2 команда на переключение.
deleteStream (удалить поток)
:использовать Вклиентинформироватьсерверконецместныйизопределенныйиндивидуальныйпотоквернослон былудалить,Нет необходимости передавать этот маршрут еще раз.getAudio (получать аудио)
:уведомитьсерверконец Долженклиентда否хотетьотправлять Аудио,receiveAudio Структура команды следующая:
получения видео (получение видео)
:уведомитьсерверконец Долженклиентда否хотетьотправлятьвидео,receiveVideo Структура команды следующая:
publish(Толкатьданные)
:Зависит отклиент Ксервер Инициировать push-запроспотокприезжатьсервер。publish Структура команды следующая:
искать (позиция потокаиз позиции)
: Найдите видео или аудио в определенной отдельной позиции с точностью до миллисекунд. искать Структура команды следующая:
пауза
:клиентинформировать Служитьконецостанавливатьсяиливосстанавливатьсятранслироватьпомещать。pause Структура команды следующая:
если Pause для true То есть, если поверхность указывает запрос клиента на паузу, служба «конец паузы» действительно должна изпоток вернуться. NetStream.Pause.Notify из onStatus Команда, сообщающая клиенту, когда предыдущий поток находится в состоянии паузы, когда Pause для false , сервер вернет NetStream.Unpause.Notify из команды, чтобы сообщить клиенту время до восстановления потока. если ответ на команду службы конецверно Должен не удался и возвращено _error информация.
Следующий анализ открывает индивидуальный RTMP поток СМИприезжать Видеть Аудиоданныеначинатьтранслироватьпомещатьизвесь процесс。
RTMP Соглашение предусматривает, транслироватьпомещатьодининдивидуальныйпоток СМИиметьдваиндивидуальныйвперед Упоминание шагов:
в,Сетевое подключение к серверу приложения и клиентскому базовому соединению. Сеть потоковпредприятия имеет канал для отправки мультимедийных данных. Между сервериклиентом может быть установлено только одно сетевое соединение.,Но можно создать множество сетевых потоков на основе Должен-соединений. Их взаимосвязь показана на рисунке:
транслироватьпомещатьодининдивидуальный RTMP Протоколизпоток мультимедиа должен пройти следующие индивидуальные шаги: рукопожатие, установление соединения, установление потока, воспроизведение. RTMP Все связи начинаются с рукопожатия. Фаза установления соединения используется для установления соединения между клиентисерверами. Сетевое подключение" ;Этап установления потока используется для установления клиент-сервера между «Сетевой поток»; стадия воспроизведения используется для передачи видео- и аудиоданных.
Давайте проанализируем вышеизложенное wireshark Понятьприезжатьизсообщение。
rtmp Соединение начинается с рукопожатия. Он содержит три блока фиксированного размера с именем для C0,C1,C2; Конец службы отправляет отдельный блок с именем для. S0,S1,S2。
Последовательность рукопожатия следующая:
Схема рукопожатия показана ниже:
Сочетание приведенной выше теории вернее, чем наше Понять изсообщение:
① Клиент отправляет серверу подтверждение C0+C1.
② Сервер отвечает клиенту рукопожатием S0+S1+S2.
③ Клиент отправляет серверу подтверждение C2.
Понять краткое описание пакета:
сомневаться: C2 и S2, Какой из них следует отправить первым? ? ? [Конкретных положений в соглашении нет]
Включает следующие шаги:
клиент Отправить командное сообщение серединаиз «Подключиться» (подключиться) к серверу, Запросите индивидуальный экземпляр приложения-службы для установления соединения.
После того, как сервер получает сообщение с командой подключения, он отправляет размер окна подтверждения, размер полосы пропускания и размер блока приема (Window Acknowledgement Размер) протокольное сообщение клиенту, с указанием времени соединения с командой соединения середина, упомянутой в приложении.
сервер Отправить командное сообщение серединаиз "результат" (_result), Уведомление о состоянии подключения клиента
Клиент отправляет серверу сообщение протокола размера подтверждения окна.
Включает следующие шаги: