2013-03-08 17 views
7

私は、AndroidのMediaCodecクラスを使用してH.264ビデオをデコードする方法を理解しようとしています。まず、H.264ファイルからNALユニットを手作業で解析し、MediaCodecにデコードするようにしています。私はファイルからNALユニットを正しく解析していると思います(ファイル内の0x00 0x00 0x01シーケンスの検索はNALユニットの開始を示します)。しかし、MediaCodecは常にタイムアウトし、dequeueOutputBufferを呼び出すたびに-1を返します。 ()。デコードのためにH.264 NALユニットをMediaCodecに供給する方法の詳細を知っている人はいますか?私はそれをNALユニットに送る前に0x00 0x00 0x01シーケンスを取り除くはずですか?特定のNALユニットタイプを無視/削除する必要がありますか?各NALユニットの前に、抽出されたSPSとPPS情報(0x00 0x00 0x01シーケンスの有無に関わらず)を付加する必要がありますか?私はここでたくさんのアイデアで遊んでいて、どれもがパンニングしていません。この分野のガイダンスは非常に高く評価されます。H.264 NALユニットをAndroid MediaCodecにデコードするにはどうすればよいですか?

答えて

4

私が経験した限り、デコーダはsps/pps情報を供給しない限り、dequeueOutputBuffer()で-1を返します。これを行うと、デコーダーはdequeueOutputBuffer()でINFO_OUTPUT_FORMAT_CHANGEDフラグ(-2)を返し、デコードされたフレームを正しく返します。

デコーダが-1を返す場合は、フラグBUFFER_FLAG_CODEC_CONFIGを使用してsps/pps情報をデコーダに追加してみてください。

+1

また、 'MediaFormat'に追加することもできます。両方のアプローチの例はCTS EncodeDecodeTestで見ることができます。 https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.javaの567行目と855行目を参照してください。 – fadden

0

AFAIKあなたは最初のバッファーとしてSPS/PSSを送り出すだけでなく、ヘッダーを取り出す必要がありますが、-1を得ることは大きな問題ではありません。他のNALの前にSPS/PPSによってフィードされない場合、一部のデバイスがクラッシュする

関連する問題