MPEG-ES H.264 Видео из RTP в MPEG-TS - PullRequest
8 голосов
/ 16 декабря 2010

Я реализую спецификацию ATSC-153, которая в основном транслирует базовый профиль видео H.264 в IP / UDP / RTP в соответствии с RFC 3984. Фрагменты кадров пересматриваются и по большей части воспроизводятся на встроенном процессоре, с которым я работаю, хотя и с некоторым повреждением, которое происходит по какой-то причине, которую я пытаюсь отследить. Я пытаюсь инкапсулировать это в MPEG-TS для рендеринга в Windows (VLC) для некоторого сравнения, и по некоторым причинам у меня возникают трудности. VLC, TSReader и MPEG2Repair по какой-то причине не могут найти видео. Шаги, которые я делаю, являются следующими, которые одинаковы для кадров SPS или PPS H.264, которые я получаю.

  1. Создайте PAT / PMT, PID PMT 0x11, тип видео 0x1b, PID видео 0x280, а pid PCR 0x1fff (без pcr). На самом деле, я через это каждые 15 кадров или около того.

  2. Я добавляю к кадру разделитель модуля доступа, номер NAL 9. Я думаю, что это должно быть добавлено ко всем кадрам H.264 в транспорте. Основной тип изображения равен 1 (0x30 байт), что соответствует I, P базового профиля.

  3. Я добавляю к этому кадр заголовка PES, который имеет PTS из заголовка RTP.

  4. Я добавляю 4-байтовый заголовок TS. В начале кадра я установил бит PUS. Я сохраняю 4-битный счетчик для последовательности.

  5. Любые оставшиеся байты, не делимые на 184, я помещаю в пакет TS с полем адаптации (установленной длиной, установленным байтом флага, равным 0), добавленным (или заполненным) к остальным байтам. *

Я уверен, что поток начинается с кадра SPS. Насколько я понимаю (что может быть не очень), это должно содержать реальную картину. Кадры SPS занимают 15 Кбайт или около того в потоке. Вот дамп первого пакета TS:

000  47 42 80 15 00 00 01 E0 00 00 81 80 05 21 AA BB
010  9A 91 00 00 00 01 09 30 00 00 00 01 67 42 C0 14
020  9A 44 0D 0F 9F F8 00 08 00 08 04 00 00 00 01 68
030  DE 24 88 00 00 00 01 E6 87 26 D6 AC FA 58 78 24
040  0E EB B5 5B 02 AF 6C EB E1 E4 9F 35 BD 61 56 F8
050  4A 4E 58 00 00 01 65 88 80 20 20 9E 1D 60 20 61
060  15 D8 02 70 F9 29 C0 00 40 C6 23 3A 76 CA 78 9A
070  4D 7D 79 C1 6E 94 3E A8 76 50 4B F7 B5 B0 40 2B
080  52 48 93 B1 A2 4A 4F 3D 14 F1 B8 7E FA 98 91 FE
090  DC EB 0F 11 BF EB D1 B8 E0 3F 5A C2 91 2D FA 83
0A0  03 EF 51 10 18 D6 D4 77 90 78 97 D5 BF 94 61 6D
0B0  69 53 AF 5B 42 FE D7 A3 9D 21 81 FC 

В приведенном выше пакете фактический полученный видеокадр начинается со смещения 0x18. Все до этого я добавил. 00 00 00 01 67 должен указывать SPS.

Для кадра PPS, который обычно работает от 3 КБ до 4 КБ, дамп из него следующий:

000  47 42 80 19 00 00 01 E0 00 00 81 80 05 21 AA BB
010  F8 51 00 00 00 01 09 30 00 00 00 01 41 9A 01 05
020  0F FF F4 3D FE 9B 0F 5E BE 18 15 20 00 50 0D 51
030  58 32 47 F5 E7 86 1B 43 A6 FC F5 CA 64 A6 7F CF
040  CB 94 C8 1F F2 FF 51 F7 7D DD DF 51 97 C7 C2 97
050  77 77 77 BB B4 8B E9 B8 F9 70 D7 75 7A FF D8 64
060  E8 C1 CE 06 83 58 20 24 00 06 66 70 BC DB C3 8D
070  8E 6D FC 8C 5D EE 0D CC 63 61 13 BB F3 0F 0D 9F
080  28 82 54 E4 A2 1C 21 55 BF F3 C1 86 7D 90 47 52
090  5F C2 C6 E2 A7 3B 5E E0 A1 5B A2 C3 24 05 97 17
0A0  A1 B2 04 22 78 F0 6F 0C DA 85 DC 7C E3 69 85 2B
0B0  AC 02 02 01 9C 5B 11 DC B5 85 44 CE 

В данный момент я могу только ожидать, что мне не хватает чего-то необходимого, я что-то сделал неправильно или что-то с повторной сборкой RFC 3984 настолько ужасно неправильно, что декодеры не распознают это как видео.

Итак, я начну с того, что задам первые два вопроса. Есть что-нибудь из спецификаций, которые мне не хватает? Правильно ли я это реализовал, как видно из дампов?

Большое спасибо.

1 Ответ

5 голосов
/ 28 декабря 2010

Ну, в общем, я понял это.Проблема была с PMT, который я не предоставил дамп.Инкапсуляции выше верны.Как только я исправил PMT, поток воспроизводится на целевой плате.

...