我正在尝试使用ffmpeg处理来自UDP流的帧。一切都会正常运行一段时间,但av_read_frame()
将始终返回AVERROR_EXIT
(Immeditate exit requested)或-5
(错误号码-5发生),而流应该仍然正常运行。在错误发生之前,它总是将以下消息打印到控制台
[mpeg2video @ 0caf6600] ac-tex damaged at 14 10
[mpeg2video @ 0caf6600] Warning MVs not available
[mpeg2video @ 0caf6600] concealing 800 DC, 800 AC, 800 MV errors in I frame
(消息中的数字因运行而异)
我怀疑这个错误与过快地调用av_read_frame
有关。如果我让它尽可能快地运行,我通常会在10-20帧内出现错误,但是如果我在阅读之前进行了一次睡眠,它将运行一分钟左右,然后退出并出现错误。我意识到这很黑,并假设有更好的解决方案。结论:有没有办法动态检查'av_read_frame()'是否可以调用?或者一种压制错误的方法?
我在下面做的Psuedo代码。在此先感谢您的帮助!
void getFrame()
{
//wait here?? seems hacky...
//boost::this_thread::sleep(boost::posix_time::milliseconds(25));
int av_read_frame_error = av_read_frame(m_input_format_context, &m_input_packet);
if(av_read_frame_error == 0){
//DO STUFF - this all works fine when it gets here
}
else{
//error
char errorBuf[AV_ERROR_MAX_STRING_SIZE];
av_make_error_string(errorBuf, AV_ERROR_MAX_STRING_SIZE, av_read_frame_error);
cout << "FFMPEG Input Stream Exit Code: " << av_read_frame_error << " Message: " << errorBuf << endl;
}
}
答案 0 :(得分:0)
需要在回调函数中处理传入帧。因此,机制应该是每当有新帧时都会调用回调。这样就不需要手动微调延迟。
免责声明:我没有使用过ffmpeg API。