libav (Linux および Windows の C++ プログラムから) を使用して、ファイルからビデオ ストリームをデコードしています。
次に、逆多重化とデコードを分離する必要があります。1 つのクラスが avformat_open_input() と av_read_frame() を呼び出してから、別のクラスによって読み取られるキューに AVPackets を渡します。そこで、avcodec_alloc_context3() を使用して、avcodec_decode_video2() に必要な AVCodecContext を取得します。MPEG2 ビデオ ストリームでテストしたところ、動作しました。
H264 ストリームをデコードしようとすると問題が発生します: avcodec_decode_video2() は常に -1 を返し、「フレームなし」を出力します。このストリームをデコードするには追加のデータ (SPS/PPS) が必要であることを理解しているので、デコーダーのデマルチプレクサーから元の AVCodecContext を複製しようとしましたが、うまくいきません:
- extradata フィールドの内容をコピーし、デコーダーのデフォルト値とは異なる他のすべての値を設定する: -1 が返される
- 同じコンテキストを使用する (つまり、ポインターを渡す) と、クラッシュが発生します
CODEC_FLAG2_CHUNKS も設定してみました。avcodec_decode_video2() は常に packet.size - 3 (??) を返し、frameFinished が 1 に設定されることはありません。
私の意見では、AVPackets をデコードするために元の CodecContext からの設定が必要になるたびに発生する一般的な問題があります。その問題を解決する方法についてのヒントをいただければ幸いです。
編集:問題を書き留めておくと、問題の解決に役立つ場合があります...コンテキスト構造体 (avcodec_copy_context) のコピーを使用し、コピーを受け取った後にのみコーデックを開くと、デコードされたフレームが得られます。それが安全であるか、それを行うための最良の方法であるかを誰かが知っていますか?