C++ ffmpeg avcodec_decode_video2功能错误代码
我在函数C++ ffmpeg avcodec_decode_video2功能错误代码,c++,ffmpeg,C++,Ffmpeg,我在函数avcodec\u decode\u 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); }
avcodec\u decode\u 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(packet.isEOF()){
avfpkt;
av_初始_数据包(&eofpkt);
eofpkt.data=NULL;
eofpkt.size=0;
ret=avcodec\U decode\U VIDEO 2(d.codec\U ctx、d.frame和got\U frame\U ptr和eofpkt);
}否则{
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、 未编码的_size=qMin(packet.data.size()-ret,packet.data.size());
如果(ret<0){
//qWarning(“[VideoDecoderFmPegBase]%s”,av_err2str(ret));
返回false;
}
如果(!获取帧\u ptr){
qWarning(“无法解压缩任何帧:%s%d/%d”,av_err2str(ret),d.undecoded_size,packet.data.size());
return!packet.isEOF();
}
当我运行它时,我得到一个错误(我进入if(!got_frame\u ptr)
),在打印时我得到的ret值是:
203,3053,5120
(或更准确地说,这是我的印刷品:
警告:“无法解压缩任何帧:发生错误号203 0/203”
警告:“无法解压缩任何帧:发生错误号3053 0/3053”
警告:“无法解压缩任何帧:出现错误编号5120 0/5120”
(av_err2str(ret)
只需打印装饰过的ret,仅此而已)
avcodec\u decode\u video2
docometatin说:
出错时返回负值,否则返回使用的字节数,如果无法解压缩帧,则返回零。
我不认为avcodec\U decode\U VIDEO 2会返回负值,但我在got\U frame\U ptr时得到零,而不是got\U frame\U ptr将与doc一样的值相同。说我得到这个奇数值(20330535120)
我的问题是:
g 不完成帧解压缩不是错误,帧解码往往会延迟几帧以启用帧多线程 [编辑] 换句话说,如果
ret>=0&&got\u frame\u ptr==0
,则继续正常操作,并假设操作成功,但输出延迟。当使用NULL
数据包刷新队列时,延迟的数据将在末尾返回