2016-11-01 7 views
1

Android NDKのレビューサンプルに基づいて、ハードウェアデコーダ(OMX.xxx)を使用するためにMediaCodecまたはOpenMAXALインタフェース。C++を使用したAndroidモバイル(Snapdragon 820)のPlayerのMediaCodec(NDK)とOpenMAXの比較

私の質問は以下のとおりです。

  1. が、これはモバイル(Android上のSnapdragon 820)上のハードウェアデコーダを使用するための最良の方法ですか?

  2. OMX over MediaCodecを使用する利点はありますか?現在のAndroidヘッダーは、実際にはMPEG2/.ts MIMEタイプしかサポートしていません。私はあなたがOpenMaxを介してビデオ(mp4など)のストリーミングのデコードをサポートできることを期待しています - それは正しい評価ですか?

私の要件は次のとおりです。 1.一般的なコンテナのストリーミングオーディオとビデオの再生をサポートします。 2.デコード用にモバイルハードウェア(GPU + DSP)を活用します。 3.フレーム単位で画像処理を行います。 4.オーディオとビデオの独自のタイムシンクを書き込まないでください。

私はffmpegを使って基本的なプレーヤーを書いていますが、ハードウェアデコーダを使用できないので、それをフォローしません。

私は上記を達成する他のすべてのフレームワーク(無料または商用)には公開されています。

ケータン

答えて

4

一般に、MediaCodecは推奨されるものです。

Android 4.1でMediaCodecが利用できるようになる前に、OpenMAX AL APIがAndroid 4.0のストップギャップ対策として追加されました。それは実際には非難されています(たとえそれが何かを公式に宣言しているかどうかわかりませんが)。

これらは、わずかに異なるレベルの抽象化で動作します。ほとんどの場合、MediaCodecの仕事は少なくなります。

OpenMAX ALでは、デコードして再生するためのデータのMPEG TSストリームを提供する必要があります。他のコンテナ形式はサポートしていません。デコードされたデータに直接アクセスすることはできませんが、直接再生されます。しかし、それはオーディオとビデオの同期の世話をする。 OpenMAX ALの

長所:

  • あなたの入力がMPEG TSである場合、あなたは避ける全体の余分なステップ
  • が自動的

短所同期を処理:他に

  • すべてを

MediaCodecでは、デコードする個々のデータパケットを提供する必要があります。コンテナ形式はまったくサポートされていませんが、呼び出し側がその処理を行うはずです。デコードされた出力データに直接アクセスできますが、それを提示するには、手動で同期を処理する必要があります。 (Android 6.0には、MediaSyncという新しいクラスがありますが、これはこれを手助けすることができます。MediaCodecの)

長所:

  • ジェネリック、
  • 柔軟な任意の容器と同様に動作(MPEG TSに再パッキングを必要としない)MediaCodecの

短所:

  • 手動で同期を処理する必要があります。
  • 非常に低いレベルで、多くの作業が必要です

個々のデータパケットを抽出するには、MediaExtractorクラスがあります。このクラスは、静的ファイルのいくつかの一般的なファイル形式に役立ちます。私はそれがストリーミングに使用できるとは思わない。断片化されたMP4。

MPEG TS以外の形式のストリーミング再生をしたい場合は、自分でパケットを抽出して処理する必要があります(または、libavformatなどの他のライブラリを使用してください)。 OpenMAX ALを使用している場合は、個々のパケットをMPEG TS(libavformatなどを使用して)にパッケージ化する必要があります。 MediaCodecを使用する場合は、再生中にオーディオとビデオの同期を処理する必要があります。

デコードされたフレームの処理が必要な場合は、MediaCodecがおそらく唯一の方法です。デコードされた画像データを生のYUVとして取得するか、シェーダーを使用して変更できるGLサーフェスで取得することができます。 (後者はOpenMAX ALでも可能です。)

+0

こんにちはmstorsjo、すばらしい賛否両論の分析のためにありがとう。私は、FFmpeg + OpenCVを使って基本的なストリーミングを実装しました。私は必要なものすべてを行いますが、オーディオフレームを落とさなければならないため、同期は100%ではありません。私はMediaCodecのために考え、それはオンラインで述べたようにmp4、webpなどのフォーマットをストリーミングすることができます。私は二重チェックします。 MediaCodecはもう一度やり直すことになりそうです。 – Ketan

+0

もう1つの質問 - MediaCodecはハードウェアデコーダを使用することを保証しますか?失敗した場合はswモードにフォールバックしますか? – Ketan

+0

MediaCodecを使用すると、使用するコーデックを手動で選択できます。 「OMX.google。*」という名前の場合はSWコーデック、それ以外の場合はおそらくHWコーデックです。 'MediaCodec.createDecoderByType'を使うなら、実際には常に利用可能なHWコーデックが必要です。詳細については、http://stackoverflow.com/questions/37715529/how-to-know-android-decoder-mediacodec-createdecoderbytypetype-is-hardware-またはを参照してください。 – mstorsjo

関連する問題