Bitmapsを作成していて、それらを(ハードウェアで)エンコードし、.mp4ファイルに多重化します。AndroidのMediaCodecクラスを使用してエンコードされた緑色のビデオ
私はMediaCodecクラスをエンコードし、MediaMuxerをmuxに使用しています。
エンコーダ(MediaCodec)の入力バッファが小さすぎるという問題があります。私が選択したカラーフォーマット(MediaFormatオブジェクトがエンコーダに渡されても)は、12ビットカラーコーディングを使用したいと思うような外観のresWidth * resHeight * 1.5
に等しいバッファを常に返します。
たとえば、フレームを960x540ピクセルに設定すると、エンコーダは777600バイトの長さのバッファを渡します。他の解像度を選択すると、それに応じてバッファが常にスケールされます。
ビットマップはプログラムの実行中に作成され、Androidビューをそれらにレンダリングします(Canvasを使用)。ビットマップクラスの仕様では色の書式設定に多くの選択肢がありません。私が知る限り、12ビットコーディングを選択するオプションはありません。
しかし私は、8ビットを選択することができ、これは私が私の8ビットピクセルあたりのビットマップのコンテンツで入力バッファを埋めるためにしようとすると、私が得るものです:あなたはすべてが緑がかっている見ることができるようにhttps://www.youtube.com/watch?v=5c-fjYp9KMQ
とそれはあってはならない。 https://github.com/eeprojects/MediaCodecExample
このアプリケーションを実行して数秒待つだけで、ビデオを生成することができます。ランタイム中のすべてのアプリケーションがLogCatに記録されています。
I手動(MediaFormat.KEY_MAX_INPUT_SIZE
フィールドを設定することにより可能である)バッファサイズを設定した後、16ビットで符号化されたビットマップを
resWidth * resHeight * 2
に設定し、試み
が、このようにして、出力バッファをデキューしようとしたとき、コーデックは、致命的な内部エラーとアプリケーションを返しますクラッシュ:
E/ACodec: [OMX.Exynos.AVC.Encoder] ERROR(0x80001001)
E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 6
ありがとうございます。デバイスのコーデックが6種類のカラーフォーマットコードをサポートしているように見えますが、いずれも12ビットです。 MediaCodecを使用して32ビットカラーコード化ビットマップをエンコードすることは可能ですか?また、仕様によるとSurfaceを使用することはできません: "OpenGL ESのようなハードウェアアクセラレーションAPIでSurfaceをレンダリングする必要があります。lockCanvas(android.graphics.Rect)が失敗したり、予期しない結果が生じる可能性があります。 - https://developer.android.com/reference/android/media/MediaCodec.html#createInputSurface() –
いいえ、32ビットカラーは使用できません。いくつかの個々のデバイスが潜在的にそれをサポートする可能性がありますが、それほど一般的ではありません。 – mstorsjo