6

Android MediaCodec APIを使用してNV12ストリームのハードウェアエンコーディング(avc)を実行しようとしています。 MediaCodec APIを使用して動作するQualCommエンコーダを取得する

OMX.qcom.video.encoder.avc、解像度1280×720および640×480の作業罰金を使用して、一方で他の(すなわち640×360、320×240、800×480)クロマ成分がシフト思わ出力を生成する(snapshotを参照してください)。

入力画像がjpegファイルに保存されていることを確認しました。 この問題は、QualCommデバイス(Samsung Galaxy S4など)でのみ発生します。

誰でもこれが正しく動作していますか?追加のセットアップ/クォークが必要ですか?

+1

Android 4.3ではいくつかの便利な新機能が追加され、YUVデータを 'MediaCodec'に供給するCTSテストが追加されました。 http://bigflake.com/mediacodec/#EncodeDecodeTestのbuffer-to-bufferテストとbuffer-to-surfaceテストは参考になるかもしれません。 – fadden

+1

ところで、アンドロイドプラットフォームGoogleグループでは、QualCommエンコーダについての議論があります:https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJコメント者の一人は、彩度面を整列させるべきだと述べています2048バイトの境界では、それは私のために部分的にしか動作しません。いくつかの決議案はまだまだバグです(例えば、176x144)。 –

答えて

3

デコーダ(MediaCodec)にはMediaFormatがあり、getOutputFormatを使用して受信できます。返されたインスタンスをログに出力することができます。そして、あなたはいくつかの有益な情報を見ることができます。たとえば、 "スライス高さ"のようなあなたのケースの値では便利かもしれません。私はそれが1280x720と640x480の高さに等しいと思われ、他の解像度では違っています。おそらく、この値を使用してクロマオフセットを取得する必要があります。

+0

クイックフィックスとして、デコーダの「スライスハイト」と「ストライド」で見たものに応じて解像度を変更しました。たとえば、640x360ではなく640x384、320x200ではなく384x256などです。その後、うまくいった:)ありがとう! – badbadboy

+0

@badbadboy qualcommエンコーダの固定解像度でstrideとsliceHeightを動的に計算する方法を見つけましたか? – dmarcato

+0

@dmarcatoまだ見ていないのですが。 – badbadboy

3

いいえ、OMX.qcom.video.encoder.avcはそうしていますが、すべてのデバイス/アンドロイド版ではありません。 Android 4.3搭載のNexus 4では、エンコーダは問題なく動作しますが、S3(実行中4.1)ではなく

OMX.qcom.video.encoder.avcを使用してS3を実行している場合の解決策別のエンコーダ)は、Chromaペインの直前に1024バイトを追加します。

// The encoder may need some padding before the Chroma pane 
int padding = 1024;      
if ((mWidth==640 && mHeight==480) || mWidth==1280 && mHeight==720) padding = 0; 

// Interleave the U and V channel 
System.arraycopy(buffer, 0, tmp, 0, mYSize); // Y 
for (i = 0; i < mUVSize; i++) { 
    tmp[mYSize + i*2 + padding] = buffer[mYSize + i + mUVSize]; // Cb (U) 
    tmp[mYSize + i*2+1 + padding] = buffer[mYSize + i]; // Cr (V) 
} 
return tmp; 

カメラはYV12とエンコーダCOLOR_FormatYUV420SemiPlanarを使用しています。

あなたのスナップショットは、私が持っていた遺物の同じ種類を示して、あなたも4.3に、多分別のパディング長

であなたはまた、16の倍数でない解像度を避ける必要があり、いくつかの解像度のための同様のハックが必要な場合があります明らかに(http://code.google.com/p/android/issues/detail?id=37769)!

+0

mysizeとmUVSizeはどのように決定するのですか? –

関連する問題