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 フラグもあることがわかりました。私はそれを試しましたが、役に立たなかったようです。