Я пытаюсь обрабатывать кадры из потока UDP с помощью ffmpeg. Все будет нормально работать, но av_read_frame()
всегда будет возвращать либо AVERROR_EXIT
(запрошенный запрос Immeditate), либо -5
(номер ошибки -5 произошел), в то время как поток все еще работает нормально. Непосредственно перед ошибка всегда печатает следующее сообщение на консольОшибка в ffmpeg при чтении из потока UDP
[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;
}
}
Я был бы всем за это, но я не могу найти способ сделать это в API-интерфейсе ffmpeg. 'av_read_frame()' _supposed_ является блокирующей функцией, которая будет повторно вызывать обратный вызов прерывания, пока не найдет фрейм. Я бы подумал, что в таком случае я могу назвать это так часто, как хочу. Я подозреваю, что реальная проблема связана с ошибками mpeg2video, напечатанными на консоли, но я не могу найти никаких подсказок о том, что они означают. – six6and1one