25
0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a

据我所知,0000 01是识别 NAL 单元的起始前缀代码。“09 ....”是什么意思?它是标题类型字节吗?

4

4 回答 4

36

0x000001 是 NAL 起始前缀码(也可以是 0x00000001,取决于编码器的实现)。0x09为0b00001001,即F=0,NRI=0,type为0b01001。该特定类型是访问单元分隔符。请注意,紧随其后的是另一个由 0x67 定义的 NAL 单元,这是一个 7 的 NAL 类型,即序列参数集。

还有图片参数集:

00 0001 68...

...以及关键帧的开始:

0000 0001 65...

于 2010-05-18T21:39:21.187 回答
14

确定您正在查看哪种 NAL 的关键参考是http://www.itu.int/rec/T-REC-H.264-201304-S。具体来说,第 63 页上的表格(截至 2014 年 1 月)列出了所有有效的 NAL 类型。

要弄清楚您要查看的内容,请查看前 4 个字节。如果 NAL 在“附件 B”框架中,它们将是00 00 0100 00 00 01。这个序列在 H.264 比特流中是被禁止/抑制的,所以如果你看到它,你肯定知道你正在查看 NAL 的开头。NAL 类型是 1 之后的 5 个低位。在代码中:

int nalType = p[2] == 1 ? (p[3] & 0x1f) : (p[4] & 0x1f);

同样在 H.264 行话中,IDR 表示 I 帧,非 IDR 表示 P 或 B 帧。

有了上面的信息,我们可以查看上面的流并看到一个访问单元分隔符,然后是一个 SPS、PPS 和第一个 I-Frame。

于 2014-01-13T20:36:38.963 回答
9
    0000 0109 1000 0001 6742 0020 e900 800c
    3200 0001 68ce 3c80 0000 0001 6588 801a

-> 000001| 09 (AUD)| 10 | 000001 | 67(SPS) | xxxx (SPS data)
   xx | 000001 | 68 (PPS)| xxxx (PPS data)

AUD、SPS、PPS 是 NALU(网络抽象层单元)的类型,NALU 大约有 31 种类型。

09 AUD 表示访问单元分隔符。

访问单元分隔符 (AUD)。AUD 是一个可选的 NALU,可用于分隔基本流中的帧。它不是必需的(除非容器/协议另有说明,如 TS),并且通常不包括在内以节省空间,但无需完全解析每个 NALU 即可找到帧的开始。

检查此答案以获取更多信息。

我还有一个关于如何解码 h264 流(在 iOS 中)的问题。

于 2016-10-24T09:34:28.170 回答
2

这定义了数据包类型。格式为:

+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI|  Type   |
+---------------+

你确定这是一个 h.264 NAL 标头吗?根据您提供的内容,这似乎不是您提供的上下文的标题。

于 2009-11-06T06:08:39.010 回答