中断后无法从流中读取帧

时间:2013-08-15 22:14:40

标签: c multithreading ffmpeg

我正在使用FFmpeg来读取和解码网络视频流。我在专用线程上发生了读/解码的事情。偶尔,我想加入那个主题。为此,我尝试指定一个中断回调和标志,以指示读取应该是非阻塞的。我有大部分基础工作,但是在中断后我遇到了 av_read_frame 的问题。这是基本结构:

void read()
{
    AVPacket pkt;

    while (shouldRead)
    {
        if (av_read_frame(formatCtx, &pkt)
        {
            // succesfully read frame
        }
        else
        {
            // failed to read frame
        }
    }
}

int interrupt_cb(void* param)
{
    return shouldInterrupt;
}

void initialize() 
{
    formatCtx = avformat_alloc_context();
    formatCtx->flags |= AVFMT_FLAG_NONBLOCK;
    formatCtx->flags |= AVIO_FLAG_NONBLOCK;
    formatCtx->interrupt_callback.callback = interrupt_cb;

    // ...other initialization stuff (e.g. avformat_open_input, etc.)
}

初始化后,一切看起来都很好 - 我很高兴地看着阅读框架。但是,如果我尝试通过将 shouldInterrupt 设置为 true 来中断,则所有后续的 av_read_frame 调用都会失败。此外,永远不会再次调用中断回调。深入研究代码,我看到formatCtx-> packet_buffer为空。鉴于此,读取失败是有道理的。那么中断后如何恢复阅读呢?我宁愿不必彻底拆除以恢复读取和解码。

更新:我最近发现还有一个AVIO_FLAG_NONBLOCK标志。我试过了,但似乎没有帮助。

0 个答案:

没有答案