我试图在存储在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)非零,违反了必须为零的规则
我在哪里绊倒?
我在这里做出错误的假设吗?
答案 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单元。