Подробное объяснение протокола 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 Такой Кроме того, он использует небольшой объем памяти метода.
  • 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
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]