为什么avcodec_encode_video2生成的关键帧头为0x41而非0x65?
问题解答
H.264 NALU帧类型判断规则
H.264码流的NALU头为1字节,结构为F(1bit) + NRI(2bit) + nal_unit_type(5bit),你通过0x41 & 31提取低5位得到NALU类型的计算方式完全正确,结果为1,对应非IDR编码分片。
- 你观测到的第一帧
0x65,计算0x65 & 31 = 5,对应IDR帧,属于标准的立即刷新关键帧,解码时无需依赖任何其他帧,且会清空之前所有的参考帧缓存,是完全独立的解码节点。 nal_unit_type = 1仅能说明该帧不是IDR帧,无法直接判定是否为关键帧,需要进一步解析分片头的slice_type字段才能确认:- 若
slice_type为I/SI类型(取值为2/7),则该帧为非IDR I帧,无需依赖其他帧即可解码,属于关键帧 - 若
slice_type为P/B类型,则该帧需要依赖参考帧解码,不属于关键帧
- 若
你的编码场景下的实际结论
你设置AVCodecContext.gop_size参数后,x264等编码器默认配置下仅在每个GOP的起始位置插入IDR帧,两个IDR帧之间默认不会插入非IDR I帧,你持续观测到的0x41帧几乎都是P帧,不属于关键帧。
如果需要准确判断编码输出的帧是否为关键帧,直接查看编码输出的AVPacket结构体的flags字段是否携带AV_PKT_FLAG_KEY标记即可,这是FFmpeg侧最准确的判断方式,无需手动解析码流。
内容的提问来源于stack exchange,提问作者JavaFresher
相关产品推荐
相关产品推荐

