5

libstagefright を使用して h264 圧縮フレームをデコードしようとしています。MP4 ファイルがありません。代わりに、フレームごとにデコードしたいと考えています。リンクからサンプルを調べています. このサンプルでは、​​ffmpeg を使用して mp4 ファイルを解析します。ffmpeg の avcodeccontext を使用して、必要なメタデータを設定および検索します。ここで、kKeyAVCC、kKeyWidth、kKeyHeight、kKeyIsSyncFrame、および kKeyTime を設定します。これらの各パラメーターについては明確ではありません。それで、私が知りたいのは、これらすべてのパラメータを設定する必要があるかどうかだけですか? これらのパラメータの目的と、フレームごとのデコード用のメタデータ用に設定するものは何ですか。kKeyTime を設定しないと、omxcodec がメディアバッファの読み取り時にクラッシュします。また、読み取り操作が成功した場合、MediaBuffer の派生読み取りメソッドで設定したメタデータ値を取得していません。フレームのビデオ寸法と INFO_FORMAT_CHANGED のエラー コードを取得します。

4

1 に答える 1

9

OMXCodec::Create新しいコーデックが作成されると、メソッドの一部としてメタデータがパーサーからデコーダーに渡されます。あなたの実装MetaDataでは、プレーンなバニラandroid実装で指定された形式でメタデータを渡すように注意したと思います。

たとえば、ビデオ トラックのメタデータを取得するために呼び出されるAwesomePlayer::initVideoDecoderin を参照してください。これは の一部ではなく、別のオブジェクトとして渡されるmVideoTrack->getFormat()ことに注意してください。MediaBuffer

デコーダーが作成されると、configureCodec呼び出されます。このメソッドでは、OMXCodecさまざまな構成パラメーターを読み取り、デコーダーを初期化します。

kKeyAVCCCodec Specific Dataorに対応しますが、csdこれは基本的には基になるストリームのSPSandです。PPSH.264

kKeyWidthと、ビデオ フレームのとにkKeyHeight対応します。デコーダーを初期化するために、さらにいくつかの追加パラメーターを設定できます。たとえば、decoder の出力に固有のものを設定する場合は、 を通じて同じものを設定できます。widthheightcolorFormatkKeyColorFormat

デコーダーが作成されたら、個々のフレームを標準openmaxインターフェースを介して渡す必要があります。デコーダーはOMXCodec::read、入力バッファーと出力バッファーをフラッディングするメソッドの呼び出しで開始されます。

入力バッファーは、パーサー モジュール (この場合は特定のモジュール) からOMXCodec::drainInputBuffera を読み取るメソッドによって満たされます。MediaBufferのコンテンツは、コンポーネントMediaBufferの に取り込まれたバッファにコピーされます。このデータとともに、このバッファの も渡されます。タイムスタンプ情報は、.input portOMXtimestampkKeyTimeMediaBuffer

したがって、 で渡されるすべてのフレームに対して、デコーダの出力ポートに反映される下層のデコーダにもMediaBuffer有効な が渡されるようにする必要があります。timestamp

あなたの質問では、 について質問していましたkKeyIsSyncFrame。このフラグはEncoder、コールバックの一部として設定されます。FillBufferDoneつまり、エンコーダーが のようなキー フレームをエンコードするIDR frameと、エンコーダーの出力ポートのコールバックの一部として、この特定のフラグを介してこの情報が伝達されます。 デコードの場合、これは関係ありません

ログを有効にしてさらにいくつかのログを投稿できればOMXCodec、より正確な回答を提供しやすくなる可能性があります。

PS AndroidフレームワークにはStagefright、パーサーとデコーダーを作成し、レンダリングなしでコマンドラインデコードを実行するというコマンドラインユーティリティがあります。これは、独自のパーサーをプラグインするための良いリファレンスになる可能性があります。

于 2013-02-16T02:52:09.033 に答える