2013-07-23 2 views
1

Я пытаюсь обрабатывать кадры из потока 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;    
    } 
} 

ответ

0

Входящие кадры должны обрабатываться в функции обратного вызова. Таким образом, механизм должен быть таким, чтобы обратный вызов вызывался всякий раз, когда появился новый фрейм. Таким образом, нет необходимости вручную настраивать задержку вручную.

Отказ от ответственности: Я не использовал API-интерфейсы ffmpeg.

+0

Я был бы всем за это, но я не могу найти способ сделать это в API-интерфейсе ffmpeg. 'av_read_frame()' _supposed_ является блокирующей функцией, которая будет повторно вызывать обратный вызов прерывания, пока не найдет фрейм. Я бы подумал, что в таком случае я могу назвать это так часто, как хочу. Я подозреваю, что реальная проблема связана с ошибками mpeg2video, напечатанными на консоли, но я не могу найти никаких подсказок о том, что они означают. – six6and1one

Смежные вопросы