H.264 Nalu 咬合对齐
H.264 NALU Byte Alignment
我正在尝试了解存储在 mov 容器中的以下数据中的 H.264 NALU headers。
来自文件的示例:
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
...
到目前为止,我假设 bit-stream 不是字节对齐的,因为起始代码序列向左偏移了一位:
0x00 0x00 0x00 0x02 -> 00000000 00000000 00000000 00000010
所以我将这些字节和后续字节向右移动了一位,这导致了以下起始序列代码和第一个 header 的 header 位:
0000000 00000000 00000000 00000001 [0 00 00100]
然而,当我到达示例中的以下字节序列时,我就解脱了:
0x00 0x00 0x00 0x0E
我假设它是另一个起始序列代码,但字节对齐方式不同。
00000000 00000000 00000000 00001110 00000110 00000001 00001001 00000000
字节对齐后,我得到以下 header 字节:
00000 00000000 00000000 00000001 [1 10 00000]
header(forbidden_zero_bit)中的第一位是non-zero,这违反了它必须为零的规则
我哪里出错了?
我是不是做出了错误的假设?
"Byte stream format"(H.264 附件 B)中使用了起始码,并且它们本身是字节对齐的。解码器应该通过检查字节序列来识别起始码,而不需要移位。
MOV、MP4 容器不使用起始码,但它们有自己的结构(原子、框),带有参数集 NAL 单元,没有前缀,在样本描述原子中,然后数据本身再次作为原始 NAL 单元.
你引用的可能是对应于文件结构字节而不是NAL单元的MOV原子片段。
正如已经回答的那样,MOV 容器(或 MP4)不使用带有起始码的 Annex B 编码。它使用 MP4 风格的编码,其中 NAL 以 NALUnitLength 字段为前缀。该字段可以有不同的大小(并且该大小在容器中的其他地方发出信号)但通常是 4 个字节。在您的情况下,NALUnitLength 可能是 4 个字节,您转储的 3 个 NAL 的大小为:2 字节(00 00 00 02)、14 字节(00 00 00 0E)和 11016 字节(00 00 2B 08)。
我正在尝试了解存储在 mov 容器中的以下数据中的 H.264 NALU headers。
来自文件的示例:
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
...
到目前为止,我假设 bit-stream 不是字节对齐的,因为起始代码序列向左偏移了一位:
0x00 0x00 0x00 0x02 -> 00000000 00000000 00000000 00000010
所以我将这些字节和后续字节向右移动了一位,这导致了以下起始序列代码和第一个 header 的 header 位:
0000000 00000000 00000000 00000001 [0 00 00100]
然而,当我到达示例中的以下字节序列时,我就解脱了:
0x00 0x00 0x00 0x0E
我假设它是另一个起始序列代码,但字节对齐方式不同。
00000000 00000000 00000000 00001110 00000110 00000001 00001001 00000000
字节对齐后,我得到以下 header 字节:
00000 00000000 00000000 00000001 [1 10 00000]
header(forbidden_zero_bit)中的第一位是non-zero,这违反了它必须为零的规则
我哪里出错了?
我是不是做出了错误的假设?
"Byte stream format"(H.264 附件 B)中使用了起始码,并且它们本身是字节对齐的。解码器应该通过检查字节序列来识别起始码,而不需要移位。
MOV、MP4 容器不使用起始码,但它们有自己的结构(原子、框),带有参数集 NAL 单元,没有前缀,在样本描述原子中,然后数据本身再次作为原始 NAL 单元.
你引用的可能是对应于文件结构字节而不是NAL单元的MOV原子片段。
正如已经回答的那样,MOV 容器(或 MP4)不使用带有起始码的 Annex B 编码。它使用 MP4 风格的编码,其中 NAL 以 NALUnitLength 字段为前缀。该字段可以有不同的大小(并且该大小在容器中的其他地方发出信号)但通常是 4 个字节。在您的情况下,NALUnitLength 可能是 4 个字节,您转储的 3 个 NAL 的大小为:2 字节(00 00 00 02)、14 字节(00 00 00 0E)和 11016 字节(00 00 2B 08)。