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.)
}

初期化後、すべて問題ないように見えます。私は喜んでフレームを読んでいます。ただし、shouldInterrupttrueに設定して中断しようとすると、後続のav_read_frame呼び出しはすべて失敗します。また、割り込みコールバックが再度呼び出されることはありません。コードを少し掘り下げると、formatCtx->packet_buffer が空であることがわかります。それを考えると、読み取りが失敗することは理にかなっています。中断後に読み取りを再開するにはどうすればよいですか?読み取りとデコードを再開するために完全に破棄する必要はありません。

更新: 最近、AVIO_FLAG_NONBLOCK フラグもあることがわかりました。私はそれを試しましたが、役に立たなかったようです。

4

0 に答える 0