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