H.264 NALU字节对齐

时间:2016-04-26 11:22:12

标签: parsing video h.264

我试图在存储在mov容器中的以下数据中绕过H.264 NALU标题。

文件示例:

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 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

起始码以“字节流格式”(H.264附录B)使用,并且本身是字节对齐的。解码器应该通过检查字节序列来识别起始码,而不进行位移。

MOV,MP4容器不使用起始码,但它们在样本描述原子中有自己的参数集NAL单位(原子,盒子),没有前缀,然后再将数据本身分别作为原始NAL单位。< / p>

你所引用的可能是MOV原子的一个片段,它对应于文件结构字节而不是NAL单元。