0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a
据我所知,0000 01是识别 NAL 单元的起始前缀代码。“09 ....”是什么意思?它是标题类型字节吗?
0000 0109 1000 0001 6742 0020 e900 800c
3200 0001 68ce 3c80 0000 0001 6588 801a
据我所知,0000 01是识别 NAL 单元的起始前缀代码。“09 ....”是什么意思?它是标题类型字节吗?
0x000001 是 NAL 起始前缀码(也可以是 0x00000001,取决于编码器的实现)。0x09为0b00001001,即F=0,NRI=0,type为0b01001。该特定类型是访问单元分隔符。请注意,紧随其后的是另一个由 0x67 定义的 NAL 单元,这是一个 7 的 NAL 类型,即序列参数集。
还有图片参数集:
00 0001 68...
...以及关键帧的开始:
0000 0001 65...
确定您正在查看哪种 NAL 的关键参考是http://www.itu.int/rec/T-REC-H.264-201304-S。具体来说,第 63 页上的表格(截至 2014 年 1 月)列出了所有有效的 NAL 类型。
要弄清楚您要查看的内容,请查看前 4 个字节。如果 NAL 在“附件 B”框架中,它们将是00 00 01或00 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。
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 中)的问题。
这定义了数据包类型。格式为:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
你确定这是一个 h.264 NAL 标头吗?根据您提供的内容,这似乎不是您提供的上下文的标题。