2011-08-02 11 views
16

私はmpeg4ビデオストリームのカスタム実装にビデオデコーダ(FFMPEG/AVCodecを使用)を書いています。このビデオストリームの特質は、同じ親に基づいて多くのPフレームを生成する多くの「息子」ストリームに分割できるということです。デコードしようとしているビデオストリームは、実際には「ビデオツリー」の一種です。このような何か:デコーダの完全なコピーを作成するにはどうしたらいいですか?

I <--P <--P <---------------------P <-------------- P <------------ P 
      \ <--P <--P <--P  \ <--P <--P  \ <--P <--P 

私はすでに私は1つのパスに従うことを決定したときに正常に動作し、基本的なデコーダを書いてきた私は、ビデオ・ツリーに複数のパスをたどるしようとすると、問題があります。この時点で、2つの異なるビデオストリームをフォローするためにデコーダを「フォーク」する必要があります。分割はキーフレームの後だけでなく、Pフレームの後でも発生する可能性があるので、AVCodecContext(私はavcodec_copy_contextを使用します)を複製する必要がありますが、新しいデコーダをクリーンな状態から作成するようです。デコードされたPフレームは空のビデオフレームに「適用」される。 おそらくavcodec_copy_contextを使用してコンテキストをコピーするだけでは不十分です...任意の提案ですか?どのようにしてコンテキストとデコーダの完全な状態を複製できますか? 参照を使用してストリームをデコードする他の方法はありますか? ありがとう!

+0

AVCodecContextのディープコピーを作成する方法を見つけたことがありますか? – zahirdhada

答えて

3

documentationによると、「結果の宛先コーデックコンテキストは未開封です。つまり、このAVCodecContextを使用してビデオ/オーディオデータをデコード/エンコードする前にavcodec_open()を呼び出す必要があります。

他のデコーダのポイントに到達するには、ストリームを開いて同じ位置(av_seek_frame)に移動しなければならないと思います。

また、後でフォークする必要がある場合は、最初からいくつかのデコーダを並列に維持することもできます。これはパラレルで少数のパスしか必要ない場合にはオプションになります。

たとえば、1つのデコーダのみを使用して、この例では、いつでも単一のパスを表示するだけでよい場合は、DVDメニュー構造を使用してください。

+0

生のライブストリームをデコードしているので、 'AVFormatContext'を持っていないので、' av_seek_frame() 'は動作しません。私も、複数のデコーダを並行して考えましたが、それは非効率的です。他のアイデアはありますか?ありがとう.. – zahirdhada

+0

[このユースケース](https://www.mail-archive.com/[email protected]/msg08024.html)を参照していますか?私はストリーム全体を保存し、最初からすべてのパスで作業します。または、ストリームをよりフレンドリーでシーク可能なフォーマットに再エンコードしようとします。 – azt

+0

はい、それは私の使用例です。 – zahirdhada

関連する問題