2016-04-26 4 views
0

Я пытаюсь обвести голову вокруг заголовков NALU H.264 в следующих данных, хранящихся в контейнере mov.H.264 NALU Byte Alignment

Пример из файла:

00 00 00 02 09 30 00 00 00 0E 06 01 09 00 02 08 
24 68 00 00 03 00 01 80 00 00 2B 08 21 9A 01 01 
64 47 D4 B2 5C 45 76 DA 72 E4 3B F3 AE A9 56 91 
B2 3F FE CE 87 1A 48 13 14 A9 E0 12 C8 AD E9 22 
... 

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

0x00 0x00 0x00 0x02 -> 00000000 00000000 00000000 00000010 

Поэтому я переместил эти и последующие байты в правый один бит, что приводит к следующему коду начальной последовательности и битам заголовка для первого заголовка:

0000000 00000000 00000000 00000001 [0 00 00100] 

Однако я прихожу отключился, когда я достигаю следующую последовательность байт в примере:

0x00 0x00 0x00 0x0E 

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

00000000 00000000 00000000 00001110 00000110 00000001 00001001 00000000 

После выравнивания байт я получаю следующий байт заголовка:

00000 00000000 00000000 00000001 [1 10 00000] 

Первый бит в заголовке (forbidden_zero_bit) отлична от нуля, который нарушает правила, что она должна быть равна нулю

Где я спотыкаюсь?

Я делаю неправильные предположения здесь?

ответ

2

Как уже было сказано MOV-контейнер (или MP4) не использует кодировку В приложения B с кодами начала. Он использует кодировку в стиле MP4, где NAL имеют префикс поля NALUnitLength. Это поле может иметь разный размер (и этот размер указывается где-то еще в контейнере), но обычно это 4 байта. В вашем случае NALUnitLength, вероятно, составляет 4 байта, а 3 NAL из дампа имеют размеры: 2 байта (00 00 00 02), 14-байтовые (00 00 00 0E) и 11016-байты (00 00 2B 08).

+0

Спасибо nobody555, эта дополнительная информация помогает многое и имеет больше смысла. Мне нужно будет подтвердить это с помощью данных о размерах выборки для моего собственного бенифита, но пока это ясно это и имеет смысл сейчас. Приветствия. – Pobbel

+0

Я подтвердил, что это действительно соответствует размерам атомов, как описано. Я не могу найти ссылку на эту кодировку в ссылке разработчика MOV. Https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html Является ли эта кодирующая часть ITU-T H.264 или, может быть, ISO/IEC 14496-15? – Pobbel

+0

Это не часть спецификаций ITU-T H.264.Что касается ISO/IEC 14496-15, возможно, это все, но у меня нет доступа к нему (это не бесплатно), и поэтому я не могу это проверить. – nobody555

1

Стартовые коды используются в «формате потока байтов» (приложение B.264) и байт выровнены. Декодер должен идентифицировать начальный код путем проверки последовательностей байтов без смещений бит.

Контейнеры MOV, MP4 не используют стартовые коды, однако они имеют собственную структуру (атомы, коробки) с наборами параметров NAL, без префиксов, в атомах описания образца, а затем сами данные отдельно отдельно в качестве исходных блоков NAL.

То, что вы цитировали, предположительно является фрагментом атомов MOV, которые соответствуют байтам файловой структуры, а не единицам NAL.

+0

Спасибо, Роман. Да, данные начинаются с атома «mdat». Мне придется еще кое-что прочитать по кодировке H.264 в формате MOV. – Pobbel