Подробное объяснение протокола RTMP и анализа захвата пакетов от Wiresahrk.
Подробное объяснение протокола RTMP и анализа захвата пакетов от Wiresahrk.

Предисловие

В этой статье в основном объясняется протокол RTMP и используется Wireshark для захвата и анализа пакетов RTMP.


1. Введение в RTMP

1. Введение в 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 форматирует данные во время передачи. Чтобы лучше обеспечить мультиплексирование, пакетирование и справедливость информации во время фактической передачи, отправитель разделит сообщение на фрагменты с идентификаторами сообщения. Каждый фрагмент может быть отдельным сообщением или может быть отдельным. часть сообщения. Принимающая сторона восстановит фрагмент до полного сообщения на основе длины данных, содержащихся в фрагменте, идентификатора сообщения и длины сообщения, тем самым реализуя отправку и получение информации. (Сообщение, Чанк)

2. Вариация

Он существует во многих вариантах:

  • RTMP или существует TCP Указанный выше порт используется по умолчанию. 1935 год;
  • RTMPE существует RTMP, добавляющий функцию шифрования;
  • RTMPT инкапсуляциясуществовать HTTP Помимо запросов, он может проникать через межсетевые экраны http–rtmp;
  • RTMPS похожий РТМПТ, добавлено TLS/SSL из Функции безопасности;

2. Wireshark перехватывает сообщения RTMP.

RTMP-сервер: Nginx+rtmp (Windows) Push-стриминг: ffmpeg Плеер: VLC (виртуальная машина Linux) Захват пакетов: Wireshark

1. Создайте RTMP-сервер.

RTMP-сервер: настройки среды Nginx+rtmp (windows) при необходимости можно получить самостоятельно:

Связь:https://pan.baidu.com/s/1AcIVERWUPbJL1zu8yCcAzw Код извлечения: mtdf

2. Запустите RTMP-сервер.

Дважды щелкните файл nginx8080.exe.

В диспетчере задач вы можете увидеть, что nginx начал работать.

3. Откройте Wireshark

Виртуальная сетевая карта сетевого адаптера VMware VMnet8 (виртуальная сеть NAT), используемая виртуальной машиной, взаимодействует с хостом (Windows), поэтому здесь мы просто берем сетевую карту VMware Network Adaptor VMnet8.

4. потоковая передача ffmpeg

Нажмите команду потоковой передачи:

Язык кода:javascript
копировать
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 адрес

  • port:RTMP Работасуществовать TCP Выше порт используется по умолчанию. 1935
  • Application:ссылка nginx.conf,этотвнутрида live
  • channelname:Настроить

Нажмите процесс:

5. Потоковая передача VLC

① Откройте сторону виртуальной машины. 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-сообщение

3. Подробное объяснение протокола RTMP.

Мы изучаем протокол RTMP на основе пакетов, которые мы перехватили с помощью Wireshark выше.

1、Предисловие

Прямая трансляция: Видео и Audio После кодирования кодировщиком происходит чередование Временная метка: временная метка Видео (потоковое видео) : ----------------------------------(Каждый - Представляет собой видеопакет) Аудио: ++++++++++++++++++++ (каждый + Представляет аудиопакет) Mp4 Формат : ###----++------+++------, файл имеет только одну информацию заголовка (если заголовок файла потерян при передаче по сети, аудио и видео потоки посередине невозможно расшифровать) Ts Формат:[#----+] [#----+] [#----+], каждый пакет имеет информацию заголовка (подходит для передачи по сети) RTMP:Message:[----+] [----+] [----+];Chunk Чанк (сообщение слишком длинное, разбито на фрагменты) кусок). (RTMP Передача с использованием из Форматда flv) Flv: [----+] [----+] [----+];

2. Общее введение

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 снижениестать полнымиз Сообщение, тем самым реализуя отправку и получение информации.

3, рукопожатие

хотеть Учреждатьодининдивидуальныйэффективныйиз RTMP Connection Ссылка, прежде всего “RTMP рукопожатие"

  • клиент для отправки на сервер C0,C1,C2(чтобы)трииндивидуальный chunk
  • Отправить на сервер S0,S1,S2(чтобы)трииндивидуальный кусок, и тогда может быть осуществлена ​​эффективная передача информации

RTMP В самом договоре этого не предусмотрено. 6 индивидуальный Message из Конкретный порядок передачи, но RTMP Разработчики протокола должны гарантировать это Который сейчас час:

  • клиент Ожидает получения S1 можно отправить позже C2
  • клиент Ожидает получения S2 можно отправить позже Другая информация (управляющая информация, реальные аудио и видео и т. д. данные)
  • Сервер должен дождаться получения C0, прежде чем отправлять S1.
  • Сервер должен дождаться получения C1 можно отправить позже S2
  • Сервер должен дождаться получения C2 можно отправить позже Другая информация (управляющая информация, реальные аудио и видео и т. д. данные)

Теоретически, если вышеуказанные условия соблюдены, как организовать 6 индивидуальный Message из порядка все да может, но фактическое выполнение серединадля существования гарантировано Основываясь на функции подтверждения сертификата и аутентификации, постарайтесь уменьшить количество сообщений. Как правило, порядок отправки тот же, и можно передать немного. wireshark Понять ffmpeg Отправьте пакет для проверки.

4、RTMP Chunk Stream

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 утилизации и снизить вероятность блокировки информации.

③, Формат фрагмента (формат блока)
1) Базовый заголовок (основная информация заголовка)

Содержит 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

2) Message Header (заголовок сообщения)

Содержит Отправить изактуальная информация(возможныйдавесьиз,такжевозможныйдаодинчасть)изописыватьинформация.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=
    2^{24} -1

    ,когдаэтоизценить Превосходитьэтотиндивидуальныймаксимумценитьчас,этоттрииндивидуальныйбайт Столичная обстановкадля 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
    • 0 байт! ! ! Ну это поверхностипоказатьэтотиндивидуальный chunk из Message Header индивидуальныйда точно такой же, как и предыдущий, поэтому, естественно, нет необходимости передавать его еще раз. когда это то же самое, что существование Type=0 из chunk назад час,поверхность Показыватьивпередодининдивидуальный chunk Штампы между изчасами все те же даиз. Какие даты и даже временные метки часов совпадают? ткань?Сразудаодининдивидуальный Message Разделить на Понятномногоиндивидуальный chunk,этотиндивидуальный chunk иначальствоодининдивидуальный chunk Принадлежат к тому же Водининдивидуальный Message。икогдаэтоисуществовать Type=1 или Type=2 из chunk назад час,поверхность Показыватьивпередодининдивидуальный chunk из-за разницы между штампами да то же самое. Например, первый человек chunk из Type=0,timestamp=100,второйиндивидуальный chunk из Type=2,timestamp delta=20,поверхность Показыватьчас Временная меткадля 100+20=120,Нет.трииндивидуальный chunk из Тип=3,означает timestamp delta=20,час Временная меткадля 120+20=140。
3) Extended Timestamp (расширенная временная метка)

Выше мы упоминали, что в chunk Там будет временная метка timestamp разница между марками timestamp дельта, и они не будут существовать одновременно, только одно из двух больше, чем 3 отдельные байты могут отображать максимальное значение 0xFFFFFF=16777215 час,талантвстречаиспользоватьэтотиндивидуальный Поле Приходитьповерхность Показыватьнастоящийизчас Временная метка,В противном случаеэтотиндивидуальный Поледля 0。Расширятьчас Временная метказанимать 4 отдельные байты, максимальное значение, которое может быть отображено, — да 0xFFFFFFFF=4294967295。

Если расширенные метки времени включены, метка времени Полеили timestamp delta Установить все для 1,поверхность Показыватьотвечать Долженидти Расширятьчас Временная метка Поле Приходить提取настоящийизчас Временная меткаилразница между марками。Обратите внимание, что временная метка расширенного часа хранит полное значение изда, вместоминусчас Временная меткаилразница между маркамиизценить

4) данные фрагмента

использоватьсемьяслойлапшаначальствонастоящий想Отправить изипротоколне имеющий отношенияизданные,длинасуществовать (0,chunkSize] между.

5) таблица фрагментов
  • Пример 1
    • Первый содержит первый индивидуум Message из chunk из Chunk Type для 0, потому что для не имеет предыдущей ссылки из chunk,timestamp для 1000,поверхность Показыватьчас Временная метка。type для 0 из(Примечание:отвечать Долженда message header)header заниматьиспользовать 11 индивидуальныйбайт,предполагалось chunkstreamId для 3<127,поэтому Basic Header заниматьиспользовать 1 отдельные байты, плюс Data из 32 индивидуальныйбайт,поэтому Нет.одининдивидуальный chunk общий 44=11+1+32 индивидуальныйбайт
    • второйиндивидуальный chunk и Нет.одининдивидуальный chunk из CSID,TypeId,Data из имеют одинаковую длину, поэтому используйте Chunk Type=2,timestamp delta=1020-1000=20,поэтомувторойиндивидуальный chunk заниматьиспользовать 36=3+1+32 индивидуальныйбайт。
    • Нет.трииндивидуальный chunk ивторойиндивидуальный chunk из CSID,TypeId,Data издлинаразница между марками Все Взаимнотакой же,Следовательно, Chunk Type =3 опустить все Message Header изMessage,заниматьиспользовать 33=1+32 индивидуальныйбайт。
    • четвертыйиндивидуальный chunk и Нет.трииндивидуальный chunk Ситуация такая же, используется и в занятии. 33=1+32 индивидуальныйбайт。
  • Пример 2
    • заметил Data из Length=307 > 128,поэтому этотиндивидуальный Message На сколько частей нужно разделить chunk отправлять,Нет.одининдивидуальный chunk из Тип=0, Временная метка=1000, медведь 128 индивидуальныйбайт(Примечание:Chunk изразмера по умолчаниюда 128 Байты)из Данные, поэтому используется общийзанимать 140=11+1+128 индивидуальныйбайт。
    • второйиндивидуальный chunk также отправить 128 индивидуальныйбайт,другой Полетакжетакой же Нет.одининдивидуальный кусок, поэтому используйте Chunk Type=3,этотчасчас Временная меткатакжедля 1000,общийзаниматьиспользовать 129=1+128 индивидуальныйбайт。
    • Нет.трииндивидуальный chunk Отправить из Data издлинадля 307-128-128=51 индивидуальный байт, такжепринятый Type=3,общийзаниматьиспользовать 1+51=52 индивидуальныйбайт
④. Управляющее сообщение протокола.

существовать 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。
    • к Вниздляпредставлять Set Chunk Size Новости из chunk из Data: в Нет.один Кусочек Необходимый 0,chunk Size занимать 31 индивидуальный Кусочек,Максимально возможноепредставлять 2147483647=0x7FFFFFFF=
    2^{31}-1

    , но на самом деле все больше, чем 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。

5、RTMP message

Различные типы сообщений 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。
① Командное сообщение (Командное сообщение, идентификатор типа сообщения = 17 или 20).

Отправьте конец и отправьте час с помощью команды из имени.,Например, подключить,TransactionID Поверхность указывает на эту команду из логотипа, Команда Object поверхность показывает соответствующие параметры. Примите команду назад после получения команды конец, и будет возвращено одно из следующих трех сообщений серединаиз: _result Сообщение указывает, что команда принята, и партнер может продолжить выполнение процесса, _error Сообщение правительства отклонено. Должен выполнить команду на выполнение операции, метод. name Сообщение существования для команды отправлено окончание выполнения из имени функции ранее. эти три вида ответа из сообщений должны содержать полученное из командного сообщения серединаиз TransactionId Подойдите к поверхности, чтобы указать, к какой отдельной команде относится этот ответ.

Можеткраспознаватьдляотправлять Заказ Новости изверно Как тамдвадобрый,да NetConnection, поверхность указывает на двойной конец верхнего соединения, да Поверхность NetStream отображает информацию о потоке из канала передачи, контролирует информацию о потоке из состояния, например Play Воспроизвести поток, Пауза пауза.

1) Команды NetConnection (команды уровня соединения)

Используется для управления статусом соединения между двумя концами.,В то же время он также обеспечивает асинхронный удаленный вызов метода (RPC) для выполнения определенного метода.,Следующие общие сведения относятся к командам уровня соединения.

  • connect:использовать Вклиент Ксерверотправлять连ловить请求,Новости структура следующая

Новости изразотвечатьиметьдвадобрый,_result Указывает на принятие соединения, _error Указывает, что соединение не удалось.

  • Call:использовать Всуществоватьверноконецвыполнить функцию,То есть часто говорят, что RPC: удаленный вызов процесса,Новости структура следующая:

еслиинформациясерединаиз TransactionID Нетдля 0 словами, верноконец требует для ответа команду «верно Должен». Структура сообщения следующая:

  • Create Stream:创建передача具体информацияизряд,Это позволяет передать конкретную информацию.,Блок передачи информации для Chunk
2) Команды NetStream (команды потокового подключения)

Netstream Учреждатьсуществовать 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 информация.

4. Процесс воспроизведения потокового мультимедиа RTMP

1. Введение

Следующий анализ открывает индивидуальный RTMP поток СМИприезжать Видеть Аудиоданныеначинатьтранслироватьпомещатьизвесь процесс。

RTMP Соглашение предусматривает, транслироватьпомещатьодининдивидуальныйпоток СМИиметьдваиндивидуальныйвперед Упоминание шагов:

  • первый шаг, Установите сетевое соединение ( NetConnection);
  • Второй шаг,Учреждатьодининдивидуальныйсетьпоток( NetStream)。

в,Сетевое подключение к серверу приложения и клиентскому базовому соединению. Сеть потоковпредприятия имеет канал для отправки мультимедийных данных. Между сервериклиентом может быть установлено только одно сетевое соединение.,Но можно создать множество сетевых потоков на основе Должен-соединений. Их взаимосвязь показана на рисунке:

транслироватьпомещатьодининдивидуальный RTMP Протоколизпоток мультимедиа должен пройти следующие индивидуальные шаги: рукопожатие, установление соединения, установление потока, воспроизведение. RTMP Все связи начинаются с рукопожатия. Фаза установления соединения используется для установления соединения между клиентисерверами. Сетевое подключение" ;Этап установления потока используется для установления клиент-сервера между «Сетевой поток»; стадия воспроизведения используется для передачи видео- и аудиоданных.

Давайте проанализируем вышеизложенное wireshark Понятьприезжатьизсообщение。

2. Рукопожатие

rtmp Соединение начинается с рукопожатия. Он содержит три блока фиксированного размера с именем для C0,C1,C2; Конец службы отправляет отдельный блок с именем для. S0,S1,S2。

Последовательность рукопожатия следующая:

  • Рукопожатие начинается с отправки клиента C0、 C1 кусок. серверполучен C0 или C1 Отправить позже S0 и S1。
  • когдаклиент Собрать все S0 и S1 назад, Начать отправку C2。 когда сервер закрыт C0 и C1 назад, Начать отправку S2。
  • когдаклиентисерверсоответственнополучать S2 и C2 назад, Рукопожатие завершено.

Схема рукопожатия показана ниже:

Сочетание приведенной выше теории вернее, чем наше Понять изсообщение:

① Клиент отправляет серверу подтверждение C0+C1.

② Сервер отвечает клиенту рукопожатием S0+S1+S2.

③ Клиент отправляет серверу подтверждение C2.

Понять краткое описание пакета:

  • Шаг первый: клиент Отправить C0+C1
  • Шаг 2. Сервер отправляет S0+S1+S2.
  • Шаг 3. Отправьте клиенту C2.

сомневаться: C2 и S2, Какой из них следует отправить первым? ? ? [Конкретных положений в соглашении нет]

3. Установите сетевое соединение (NetConnection).

Включает следующие шаги:

  • ① Клиент инициирует запрос на соединение.
  • ②、клиентизация сервера должна соответствовать размеру окна.
  • ③、сервер Установите размер полосы пропускания отправки.
  • ④、сервер Установите размер принимающего блока для клиентов.
  • ⑤. Сервер отвечает на результат соединения.
  • ⑥、клиент Установить размер блока сервераизReceive
① Клиент инициирует запрос на соединение.

клиент Отправить командное сообщение серединаиз «Подключиться» (подключиться) к серверу, Запросите индивидуальный экземпляр приложения-службы для установления соединения.

② Сервер устанавливает размер окна ответа клиента, размер полосы пропускания отправки и размер блока приема.

После того, как сервер получает сообщение с командой подключения, он отправляет размер окна подтверждения, размер полосы пропускания и размер блока приема (Window Acknowledgement Размер) протокольное сообщение клиенту, с указанием времени соединения с командой соединения середина, упомянутой в приложении.

③ Сервер отвечает на результат создания потока.

сервер Отправить командное сообщение серединаиз "результат" (_result), Уведомление о состоянии подключения клиента

④ Клиент устанавливает размер блока приема сервера.

Клиент отправляет серверу сообщение протокола размера подтверждения окна.

4. Создайте сетевой поток (NetStream)

Включает следующие шаги:

  • клиент отправляет командное сообщение серединаиз «Создать поток» (createStream) Заказать серверконец.
  • серверконец получил "Создать поток" Заказназад, Отправить командное сообщение серединаиз"результат" (_result), Уведомление о статусе клиентпотокиз
  • клиент Получает указанную длину потока от сервера.
① Клиент инициирует запрос на создание потока.
② Сервер отвечает на результат создания потока.
③ Клиент получает длину указанного потока от сервера.

5. Играйте

  • клиент Отправить командное сообщение серединаиз "Play" (play) Заказ на сервер.
  • Сервер отправляет управляемое пользователем сообщение серединаиз «начало потока», чтобы сообщить идентификатор клиентапоток.
  • Отправить сервер для воспроизведения аудио и видео данных
① Клиент отправляет запрос на воспроизведение.
② Сервер отправляет начало потока.
③ Сервер отправляет аудио и видео данные клиенту.

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода