You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 19:15:06