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

关于FFmpeg avcodec_decode_video2函数错误码及使用的技术咨询

关于FFmpeg中avcodec_decode_video2函数的错误码解析

先把你贴的调用代码整理成更清晰的格式,方便后续分析:

if (packet.isEOF()) { 
    AVPacket eofpkt; 
    av_init_packet(&eofpkt); 
    eofpkt.data = NULL; 
    eofpkt.size = 0; 
    ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, &eofpkt); 
} else { 
    ret = avcodec_decode_video2(d.codec_ctx, d.frame, &got_frame_ptr, (AVPacket*)packet.asAVPacket()); 
} 
// qDebug("pic_type=%c", av_get_picture_type_char(d.frame->pict_type)); 
d.undecoded_size = qMin(packet.data.size() - ret, packet.da...

接下来咱们逐个拆解这个函数返回值的含义,包括正常情况和错误码:

  • 正数返回值:这不是错误,代表成功从输入AVPacket中消耗的字节数。如果输入的packet包含多帧数据,这个值会小于packet的size,剩下的字节就是你代码里d.undecoded_size要处理的未解码数据,后续可以把这部分数据继续喂给解码器。
  • 返回0:通常说明输入的packet里没有可解码的有效数据(比如空包、数据不完整),但这属于正常情况,你可以继续喂入下一个packet。特别提醒:当你传入代码里那种EOF包(data为NULL、size为0)时,返回0可能表示解码器已经输出完所有缓存的帧了。
  • 负数返回值(真正的错误):常见的几种错误码及含义:
    • AVERROR(EAGAIN):解码器需要更多数据才能继续解码,你得继续喂入新的AVPacket(包括EOF包)才行,这种情况在非阻塞模式下比较常见。
    • AVERROR_EOF:解码器已经处理完所有输入数据,并且输出了内部缓存的所有帧,后续不用再调用这个解码函数了。
    • AVERROR(EINVAL):大概率是参数出问题了,比如解码器上下文没初始化好、传入的AVPacket格式不对,或者解码器已经关闭了你还在调用它。
    • AVERROR(ENOMEM):内存分配失败,解码器没法分配足够内存来处理帧数据,这种情况可能需要检查内存占用或者调整解码器参数。
    • 其他平台相关错误:比如AVERROR(EIO)这类IO错误,不过在纯内存数据解码场景里很少碰到。

最后针对你代码里的EOF包处理补充两个关键点:

  • 传入EOF包时,解码器会把内部缓存的所有帧都输出出来,直到got_frame_ptr变为0,这时候返回值可能是0或者AVERROR_EOF,都是正常的结束流程。
  • 一定要注意got_frame_ptr的状态:不管返回值是正数还是0,只有当got_frame_ptr为1时,d.frame里才是有效的解码后帧数据,这时候你才能安全地读取pict_type这类字段,否则直接访问可能会出问题。

内容的提问来源于stack exchange,提问作者gaby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:58:14