libstagefright を使用して h264 圧縮フレームをデコードしようとしています。MP4 ファイルがありません。代わりに、フレームごとにデコードしたいと考えています。リンクからサンプルを調べています. このサンプルでは、ffmpeg を使用して mp4 ファイルを解析します。ffmpeg の avcodeccontext を使用して、必要なメタデータを設定および検索します。ここで、kKeyAVCC、kKeyWidth、kKeyHeight、kKeyIsSyncFrame、および kKeyTime を設定します。これらの各パラメーターについては明確ではありません。それで、私が知りたいのは、これらすべてのパラメータを設定する必要があるかどうかだけですか? これらのパラメータの目的と、フレームごとのデコード用のメタデータ用に設定するものは何ですか。kKeyTime を設定しないと、omxcodec がメディアバッファの読み取り時にクラッシュします。また、読み取り操作が成功した場合、MediaBuffer の派生読み取りメソッドで設定したメタデータ値を取得していません。フレームのビデオ寸法と INFO_FORMAT_CHANGED のエラー コードを取得します。
1 に答える
OMXCodec::Create
新しいコーデックが作成されると、メソッドの一部としてメタデータがパーサーからデコーダーに渡されます。あなたの実装MetaData
では、プレーンなバニラandroid
実装で指定された形式でメタデータを渡すように注意したと思います。
たとえば、ビデオ トラックのメタデータを取得するために呼び出されるAwesomePlayer::initVideoDecoder
in を参照してください。これは の一部ではなく、別のオブジェクトとして渡されるmVideoTrack->getFormat()
ことに注意してください。MediaBuffer
デコーダーが作成されると、configureCodec
呼び出されます。このメソッドでは、OMXCodec
さまざまな構成パラメーターを読み取り、デコーダーを初期化します。
kKeyAVCC
Codec Specific Data
orに対応しますが、csd
これは基本的には基になるストリームのSPS
andです。PPS
H.264
kKeyWidth
と、ビデオ フレームのとにkKeyHeight
対応します。デコーダーを初期化するために、さらにいくつかの追加パラメーターを設定できます。たとえば、decoder の出力に固有のものを設定する場合は、 を通じて同じものを設定できます。width
height
colorFormat
kKeyColorFormat
デコーダーが作成されたら、個々のフレームを標準openmax
インターフェースを介して渡す必要があります。デコーダーはOMXCodec::read
、入力バッファーと出力バッファーをフラッディングするメソッドの呼び出しで開始されます。
入力バッファーは、パーサー モジュール (この場合は特定のモジュール) からOMXCodec::drainInputBuffer
a を読み取るメソッドによって満たされます。MediaBuffer
のコンテンツは、コンポーネントMediaBuffer
の に取り込まれたバッファにコピーされます。このデータとともに、このバッファの も渡されます。タイムスタンプ情報は、.input port
OMX
timestamp
kKeyTime
MediaBuffer
したがって、 で渡されるすべてのフレームに対して、デコーダの出力ポートに反映される下層のデコーダにもMediaBuffer
有効な が渡されるようにする必要があります。timestamp
あなたの質問では、 について質問していましたkKeyIsSyncFrame
。このフラグはEncoder
、コールバックの一部として設定されます。FillBufferDone
つまり、エンコーダーが のようなキー フレームをエンコードするIDR frame
と、エンコーダーの出力ポートのコールバックの一部として、この特定のフラグを介してこの情報が伝達されます。 デコードの場合、これは関係ありません。
ログを有効にしてさらにいくつかのログを投稿できればOMXCodec
、より正確な回答を提供しやすくなる可能性があります。
PS AndroidフレームワークにはStagefright
、パーサーとデコーダーを作成し、レンダリングなしでコマンドラインデコードを実行するというコマンドラインユーティリティがあります。これは、独自のパーサーをプラグインするための良いリファレンスになる可能性があります。