1

我正在使用 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 标志。我试过了,但似乎没有帮助。

4

0 回答 0