我在流程中使用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.data.size());
if (ret < 0) {
//qWarning("[VideoDecoderFFmpegBase] %s", av_err2str(ret));
return false;
}
if (!got_frame_ptr) {
qWarning("no frame could be decompressed: %s %d/%d", av_err2str(ret), d.undecoded_size, packet.data.size());
return !packet.isEOF();
}
当我运行它时,我收到一个错误(我进入if(!got_frame_ptr)
)并且在打印中我得到的返回值是:
203,3053,5120
(或者更准确的是我的印刷品:
Warning: "no frame could be decompressed: Error number 203 occurred 0/203"
Warning: "no frame could be decompressed: Error number 3053 occurred 0/3053"
Warning: "no frame could be decompressed: Error number 5120 occurred 0/5120"
(av_err2str(ret)
只打印装饰ret,仅此而已))
avcodec_decode_video2
docomentatin说:
On error a negative value is returned, otherwise the number of bytes used or zero if no frame could be decompressed.
我不是在avcodec_decode_video2返回负值的情况下,但我在got_frame_ptr得到零,而不是got_frame_ptr将与ret
像doc一样。说我得到这个奇怪的值(203,3053,5120)。
我的问题是:
此错误代码的含义是什么? (我在ffmpeg doc上搜索,我没有找到关于每个数值应该代表什么的好记录)
为什么我从这个函数中得到这个值?是ffmpeg bug吗?或者我当然不理解ffmpeg?
答案 0 :(得分:2)
不完成解压缩帧并不是错误,帧解码往往会延迟几帧以启用帧多线程。
[编辑]
换句话说,如果ret >= 0 && got_frame_ptr == 0
,只需继续正常并假设它成功但输出被延迟。使用NULL
数据包刷新队列时,延迟数据将在最后返回。