如何在H265码流中识别I帧?C++视频存储场景技术问询
H.265 I帧识别方法
要识别H.265中的I帧,核心是解析NAL单元(NALU)的类型字段,具体步骤如下:
1. 定位NAL单元起始
通过你已知的00 00 00 01(4字节起始码)或00 00 01(3字节起始码,部分场景使用),找到每个NAL单元的起始位置。
2. 解析NALU头的类型字段
每个NAL单元起始码后的第一个字节是NALU头,我们需要提取这个字节的低6位(二进制第0-5位)来确定NAL单元类型:
- 对该字节执行按位与操作:
nalu_header_byte & 0x3F(0x3F对应二进制00111111,用于保留低6位) - 得到的结果就是NAL单元类型编号(NUT)
3. 判断I帧对应的NAL单元类型
以下类型编号对应的NAL单元属于I帧:
16:非IDR帧的I帧切片(独立编码,但需依赖序列开头的SPS/PPS)19:IDR帧的I帧切片(特殊I帧,后续所有帧不依赖之前的帧)20:带RAP的IDR帧切片(可靠的序列起始点)
其中IDR帧(类型19、20)是更适合作为存储起始的选择,因为它无需依赖之前的任何帧即可解码;非IDR的I帧(类型16)虽然也是I帧,但需确保存储文件中包含对应的SPS和PPS才能正常解码。
额外注意
存储I帧时,建议先写入对应的SPS(NAL类型33,对应你已知的十六进制67,因为0x67 & 0x3F = 0x21 = 33)和PPS(NAL类型34,对应十六进制68,0x68 & 0x3F = 0x22 = 34),否则单独的I帧无法被解码器正确解析。
内容的提问来源于stack exchange,提问作者K_peanutButter
相关产品推荐
相关产品推荐

