关于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
相关产品推荐
相关产品推荐

