2016-10-04 20 views
0

デコードされた映像や音声データを記述する構造AVFrameがあります。「不透明」ポインタ

これは、ボイドポインタopaqueを持っています。ドキュメンテーションは、それが「ユーザーの一部の個人データについて」と主張しています。

これはどういう意味ですか? 追加データをフレーム単位のメタデータとして転送するために使用できますか?

答えて

3

これは、ユーザ専用のフィールドです(ffmpegライブラリとは対照的に)。 ffmpegはこのフィールドには何も触れませんので、自由に使用することができます。しかし、いくつかのffmpeg関数は、このフィールドの値をコピーすることを含む、AVFrameのコピーを作成する(またはAVFrameから別のリファレンスに移動する)場合があります。このフィールドが指すデータの有効期間を管理することは、やや難しいかもしれません。

あなただけのいくつかのフレーム毎のメタデータを処理する必要がある場合、あなたは

+0

あなたは 'av_frame_get_metadata' /' av_frame_set_metadata'を使用することになっセットアップについてコメントすることはできますか? 'libav'バージョン6内には存在しないようです:9.18-0ubuntu0.14.04.1 –

+0

@ R2-D2これを[tag:ffmpeg]とタグ付けしてあなたのタイトルに言及しましたが、あなたは実際にはFFmpeg ](http://stackoverflow.com/questions/9477115/what-are-the-differences-and-similarities-between-ffmpeg-libav-and-avconv/9477756#9477756)。私は間違っているかもしれませんが、私はLibav forkが 'av_frame_set_metadata'を持っているとは思いません。少なくともあなたが使っている古代の資料はおそらくそうではありません。 – LordNeckbeard

+0

Libavはメタデータパッチセットを採用しませんでした。最近のlibavのバージョンには、同様のことをするために使用できる(ab)サイドデータがあります。もっと重要なのは、libav v9は古く、メタデータやサイドデータがなく、バッファ参照が不足していることさえあります。これは、メタデータライフタイムとAVFrameの存続時間をリンクできるので、 'opaque'を使用する方が簡単であることを意味するpre-refcounted frames APIです。このlibavバージョンでは、あなたの唯一の選択肢です。 –

3

が@Andrey Turkinが言ったことにはほとんどを展開するには(av_frame_get_metadata/av_frame_set_metadataを参照)AVFrameで利用可能なメタデータストレージを既存検討する必要があります、目的はにありますアプリケーション固有のオブジェクトデータをAVFrame構造体に追加します。具体的な使用例は、アプリケーションがメモリを割り当てるときです(get_buffer2コールバックを使用)。このメモリはちょうどポインタかもしれませんが、時にはGPU内のメモリやそのようなものかもしれません。それにもかかわらず、アプリケーションがデータを所有し、割り当てられたメモリ/ピクチャバッファに関連付けられたオブジェクトを作成する場合、デコーダがavcodec_decode_video2()関数内の特定のAVFrameを返すとき、通常、関連オブジェクトへのアクセスが必要となります。の不透明フィールド。

+1

今日、AVBrameではこれらのユースケースでは通常、不透明なフィールド(多分その他のフィールドも)を使用し、AVFrameでは使用しません。 –

+0

私が正しく理解していれば、ビデオデータをエンコードしている間、 'opaque 'が指し示すユーザデータは結果のファイル/ストリームには表示されません。 –

+1

はい。 ffmpegはそのフィールドを読み書きしません。フレーム作成時にNULLに設定し、フレームをコピーするときにその値をコピーするように設定します。 –