Как записать поток RTP / H264 в файл - PullRequest
10 голосов
/ 06 марта 2012

Я не смог найти решение для моего предыдущего вопроса , поэтому я решил попробовать его шаг за шагом.

Теперь я хочу сохранить поток RTP / H264 в виде файла.

На данный момент я нашел следующее:

(во-первых, мой RTP / H264 - это FU-A в форме)

| RTP HEADER 12bytes long | FU INDICATOR 1byte | FU HEADER 1byte | FU payload |

Как я понял документ RFC 6184, я запускаю NAL с пакетом, у которого '1' в первом бите заголовка FU, и добавляю следующие пакеты, которые устанавливают '0' в первом бите, до последнего пакета, который имеет «1» во втором бите заголовка FU.

Я думаю, что это, как получить полный NAL до пакетирования FU-A, а также то, что я обнаружил, что мне нужно поместить «стартовые биты» (0x00000001) в начало каждого полного NAL.

Но пока не повезло. Ниже часть журнала

 ========= the new NAL is as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
 ========= adding the next NAL as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
 ========= adding the next NAL as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
 ========= adding the next NAL as 716
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]7C/1111100 [5]85/10000101 [6]B8/10111000 [7]40/1000000 ...
 ========= a NAL is summed up as 4866
 ========= the new NAL is as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ...
 ========= adding the next NAL as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ...
 ========= adding the next NAL as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ...
 ========= adding the next NAL as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ...
 ========= adding the next NAL as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ...
 ========= adding the next NAL as 139
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E2/11100010 [7]20/100000 ...
 ========= a NAL is summed up as 7061
 ========= the new NAL is as 1377
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]41/1000001 [5]E4/11100100 [6]40/1000000 [7]1A/11010 ...
 ========= a NAL is summed up as 1369
 ========= the new NAL is as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E6/11100110 [7]60/1100000 ...
 ========= adding the next NAL as 94
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]E6/11100110 [7]60/1100000 ...
 ========= a NAL is summed up as 1472
 ========= the new NAL is as 447
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]41/1000001 [5]E8/11101000 [6]80/10000000 [7]16/10110 ...
 ========= a NAL is summed up as 439
 ========= the new NAL is as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EA/11101010 [7]A0/10100000  ...
 ========= adding the next NAL as 1174
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EA/11101010 [7]A0/10100000 ...
 ========= a NAL is summed up as 2552
 ========= the new NAL is as 1400
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EC/11101100 [7]C0/11000000 ...
 ========= adding the next NAL as 1364
 [0]0/0 [1]0/0 [2]0/0 [3]1/1 [4]5C/1011100 [5]81/10000001 [6]EC/11101100 [7]C0/11000000 ...
 ========= a NAL is summed up as 2742
 ========= the new NAL is as 1400
 ...

мой вопрос,

  1. если я могу получить полные NAL из фрагментированных пакетов с помощью FU-A, как я могу сделать это как файл, который может запускаться VLC или другим проигрывателем?

  2. Я все еще в замешательстве, если мне нужно сохранить индикатор FU и заголовок FU или нет. Кто-то сказал, что мне нужно принимать их только для самого первого пакета (начиная с «1» в заголовке FU)

Любой совет будет по достоинству оценен.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 02 октября 2012

Блоки FU, STAP и MTAP NAL относятся только к пакетированию RTP, поскольку они предназначены для облегчения сетевого транспорта.Другими словами, не рассчитывайте, что декодер правильно их проанализирует.В конечном счете, вам необходимо повторно собрать блоки NAL, как в случае пакетов FU, или разбить их на несколько блоков NAL в случае STAP / MTAP.

Как только у вас есть блок NAL (и это включает PPS,SPS, SEI, разделы срезов и все другие типы в диапазоне 1-23), а затем вы можете записать на диск вместе со стартовыми кодами «0001» согласно приложению B H.264.

Размещение H.264 приложение B поток в контейнер, такой как MPEG-4, может быть выполнен с помощью различных инструментов командной строки (я уверен, что ffmpeg может это сделать).

5 голосов
/ 08 марта 2012
  1. Один из вариантов - преобразовать данные в формат файла, такой как mp4 или avi, чтобы иметь возможность воспроизводить их с VLC.AFAIR avi плохо подходил для H.264 (не помню причину).Существуют бесплатные библиотеки, такие как libmp4 или, если вы работаете в Windows с помощью DirectShow, mp4mux * Geraint .

    Другой вариант - использовать ffmpeg для преобразования.264 файла в mp4

    ffmpeg -i test.264 test.mp4

    Предполагается, что файл .264 содержит единицы NAL, разделенные кодами запуска.

  2. С RFC6184

    Полезная нагрузка FU состоит из фрагментов полезной нагрузки фрагментированного блока NAL, так что если полезные нагрузки блока фрагментации последовательных FU последовательно сцепляются, полезная нагрузкафрагментированного блока NAL может быть реконструирован.Октет типа блока NAL фрагментированного блока NAL как таковой не включен в полезную нагрузку блока фрагментации, а информация о октете типа блока NAL фрагментированного блока NAL передается в полях F и NRI октета индикатора FUблок фрагментации и в поле типа заголовка FU.Полезная нагрузка FU МОЖЕТ иметь любое количество октетов и МОЖЕТ быть пустой.

    Вам потребуется восстановить исходный блок NAL перед записью его в файл .264, если вы выберете второй подход, описанный в 1.

...