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