【问题标题】:Error in ffmpeg when reading from UDP stream从 UDP 流读取时 ffmpeg 出错
【发布时间】:2013-07-23 06:09:50
【问题描述】:

我正在尝试使用 ffmpeg 处理来自 UDP 流的帧。一切都会正常运行一段时间,但av_read_frame() 最终将始终返回AVERROR_EXIT(请求立即退出)或-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 帧内出现错误,但如果我在阅读之前休眠,它会运行一分钟左右,然后退出并出现错误。我意识到这是 hacky 并假设有更好的解决方案。底线:有没有办法动态检查'av_read_frame()'是否准备好被调用?或抑制错误的方法?

我在下面做的伪代码。提前感谢您的帮助!

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;             
    }
}

【问题讨论】:

    标签: c++ c ffmpeg udp video-streaming


    【解决方案1】:

    传入的帧需要在回调函数中处理。所以这个机制应该是这样的,只要有一个新的帧,就会调用一个回调。这样就无需手动微调延迟。

    免责声明:我没有使用过 ffmpeg API。

    【讨论】:

    • 我会全力以赴,但我似乎无法在 ffmpeg 的 C API 中找到这样做的方法。 av_read_frame() 应该是一个阻塞函数,它将重复调用中断回调,直到找到一个帧。我认为在这种情况下,我应该能够尽可能频繁地调用它。我怀疑真正的问题在于控制台上打印的 mpeg2video 错误,但我找不到任何线索来说明它们的含义。
    • @six6and1one 你终于找到问题了吗?我遇到了类似的问题。
    猜你喜欢
    • 2014-01-28
    • 2012-07-30
    • 2017-04-07
    • 1970-01-01
    • 2015-08-24
    • 2013-12-28
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多