FLV Видеопакеты, отправленные по протоколу rtmp, передаются с помощью ffmpeg против OBS - PullRequest
0 голосов
/ 12 сентября 2018

Я использую модуль node-media-server npm для размещения моего сервера RTMP.Я захватил видео пакеты с сервера и заметил, что видео пакеты, переданные с ffmpeg -f gdigrab -offset_x 1920 -framerate 60 -video_size hd1080 -i desktop -crf 0 -preset ultrafast -f flv rtmp://localhost, начинаются с

  • 2200 0085 или
  • 2200 0084 и
  • 1200 0085 и
  • самый первый пакет начинается с 1200 0084.

И когда я передаю поток на свой rtmp-сервер с OBS, я перехватываю видео пакеты, которые начинаются с

  • 2701 0000 0000 00 и
  • самый первый пакет начинается с 1701 0000 0000.

Я пытаюсь захватить эти пакеты,сохраните его и отправьте эти пакеты «игрокам», когда они подключатся к моему серверу.Я понял, что он работает с пакетами, снятыми с ffmpeg И видео преобразовано в формат flv с ffmpeg.

Однако проигрыватели не воспроизводят видео пакеты, передаваемые с OBS.Тем не менее, проигрыватель хорошо играет, когда мой rtmp-сервер просто «передает» то, что он получает, а не «воспроизводит» захваченные пакеты.Но звук играет хорошо.

Я хотел бы знать, что представляют эти начальные шестнадцатеричные числа (указывает ли это, что OBS не использует формат файла flv).

1 Ответ

0 голосов
/ 15 сентября 2018

(1)

"... И когда я передаю поток на свой RTMP-сервер с OBS, я перехватываю видео пакеты, которые начинаются с

  • 27 01 00 00 00 00 00 и

  • самый первый пакет начинается с 17 01 00 00 00 00

Я хотел бы знать, что представляют эти начальные шестнадцатеричные числа (указывает ли это, что OBS не использует формат файла FLV). "

Эти байтовые значения верны для формата FLV (см. раздел «Кодирование видео» в разделе «Структура FLV» .

Допустим, пакеты начинаются с байта XY 01 00 00 ...

  • X - это тип кадра ... X == 1 для ключевых кадров (I-кадр) и X == 2 для поддержки P / B-кадров.

  • Y - тип кодека ... Y == 7 для кодека H.264 (MPEG).

Вы заметите, что в FLV, сгенерированном FFmpeg, тип кодека Y равен 2. По умолчанию FFmpeg выводит FLV с кодеком Sorenson Spark (с низким качеством изображения).

Чтобы получить FFmpeg для вывода H264 внутри FLV, используйте -c:v libx264, пример:

ffmpeg -f gdigrab -offset_x 1920 -framerate 60 -video_size hd1080 -i desktop -c:v libx264 -crf 0 -preset ultrafast -f flv rtmp://localhost


(2)

"Однако проигрыватели не воспроизводят видеопакеты, передаваемые с помощью OBS."

Я предполагаю, что OBS означает Open Broadcaster Software ? Есть ли способ предоставить короткий образец выходного файла FLV для анализа? Или же попробуйте захватить каждый байт (в порядке появления), отправленный потоковым процессом. Если я проигрыватель / декодер, какие первые 100 байтов я получаю по вашей ссылке RTMP?

Можете ли вы быть уверены, что данные FLV, отправленные игрокам, содержат правильные данные Например:

Подача в плеер / декодер ...

  • заголовок FLV, за которым следует
  • A / V метаданные (разрешение, FPS, длительность и т. Д.).

Затем следует (отдельные кадры) ...

  • (на кадр) Настройка тега A / V, которая содержит видеопакеты ( например: 09... до 27 01 00 00... etc).

В основном убедитесь, что данные FLV верны для работы. Что игрок говорит об аудиокодеке?

Также ваш звук отправляется в формате MP3? Это единственный способ, которым я могу представить ваше «Звук воспроизводится хорошо» , так как каждый из кадров MP3 имеет свой собственный заголовок, и такие данные могут быть распознаны среди ваших байтов, отправленных на проигрыватель ( например: Плеер игнорирует неизвестные байты, но понимает части MP3 и декодирует их в ваши динамики. Аудио AAC, отправленное с заголовком ADTS, также может работать, но заголовок ADTS никогда не должен находиться внутри контейнера мультимедиа (не FLV, MP4 или AVI).

(3) Я рекомендую вам загрузить hex Editor для вашей ОС (при использовании Windows попробуйте HxD ).

Сравните байты обоих FLV-файлов из FFmpeg против OBS. Ищите типичную структуру как ...
(это заголовок FLV и метаданные):

46 4C 56 01 01 00 00 00 09 00 00 00 00 12 00 01     FLV............. 
25 00 00 00 00 00 00 00 02 00 0A 6F 6E 4D 65 74     %..........onMet
61 44 61 74 61 08 00 00 00 0C 00 08 64 75 72 61     aData.......dura
74 69 6F 6E 00 40 46 D9 99 99 99 99 9A 00 05 77     tion.@FÙ™™™™š..w
69 64 74 68 00 40 77 00 00 00 00 00 00 00 06 68     idth.@w........h
65 69 67 68 74 00 40 75 00 00 00 00 00 00 00 0D     eight.@u........
76 69 64 65 6F 64 61 74 61 72 61 74 65 00 40 8A     videodatarate.@Š
0B F6 00 00 00 00 00 09 66 72 61 6D 65 72 61 74     .ö......framerat
65 00 40 48 1A 20 84 C4 02 3E 00 0C 76 69 64 65     e.@H. „Ä.>..vide
6F 63 6F 64 65 63 69 64 00 40 1C 00 00 00 00 00     ocodecid.@......

И затем аудио / видеокадр упаковывается в тег AV (данные начинаются 09, если видео, 08, если аудио):

09 XX XX XX XX XX XX 00 00 00 00, за которыми следуют данные кадра 27 01 00 00 XX 00 00 XX XX XX XX etc

...