Aegonisのwork 1とwork 2を参照すると、私もH.264ストリームを取得しましたが、色が正しくありません。私は開発のためにHTC Butterflyを使用しています。ここに私のコードの一部です:Mediacodecとカメラの色空間が正しくない
カメラ:
parameters.setPreviewSize(width, height);
parameters.setPreviewFormat(ImageFormat.YV12);
parameters.setPreviewFrameRate(frameRate);
MediaCodec:
mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 320, 240);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
COLOR_FormatYUV420Planarエラーショー「[OMX.qcom.video.encoder.avc]ないを使用している場合カラーフォーマット19はサポートされていないので、 "COLOR_FormatYUV420SemiPlanar"のみ使用できます。なぜ誰もサポートしていない理由を知っていますか?
がそれを手に入れた使用することにより、:
int colorFormat = 0;
MediaCodecInfo.CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(mimeType);
for (int i = 0; i < capabilities.colorFormats.length && colorFormat == 0; i++) {
int format = capabilities.colorFormats[i];
Log.e(TAG, "Using color format " + format);
}
我々はカラーフォーマット(COLOR_FormatYUV420SemiPlanar)と(ノー対応するフォーマット)を持つことができ、私はフォーマットは、デバイスに依存して変化すると思います。
その後、私はwork 1とwork 2に提案から提供された変換色を試してみました:
明らかpublic static byte[] YV12toYUV420PackedSemiPlanar(final byte[] input, final byte[] output, final int width, final int height) {
/*
* COLOR_TI_FormatYUV420PackedSemiPlanar is NV12
* We convert by putting the corresponding U and V bytes together (interleaved).
*/
final int frameSize = width * height;
final int qFrameSize = frameSize/4;
System.arraycopy(input, 0, output, 0, frameSize); // Y
for (int i = 0; i < qFrameSize; i++) {
output[frameSize + i*2] = input[frameSize + i + qFrameSize]; // Cb (U)
output[frameSize + i*2 + 1] = input[frameSize + i]; // Cr (V)
}
return output;
}
public static byte[] YV12toYUV420Planar(byte[] input, byte[] output, int width, int height) {
/*
* COLOR_FormatYUV420Planar is I420 which is like YV12, but with U and V reversed.
* So we just have to reverse U and V.
*/
final int frameSize = width * height;
final int qFrameSize = frameSize/4;
System.arraycopy(input, 0, output, 0, frameSize); // Y
System.arraycopy(input, frameSize, output, frameSize + qFrameSize, qFrameSize); // Cr (V)
System.arraycopy(input, frameSize + qFrameSize, output, frameSize, qFrameSize); // Cb (U)
return output;
}
public static byte[] swapYV12toI420(byte[] yv12bytes, int width, int height) {
byte[] i420bytes = new byte[yv12bytes.length];
for (int i = 0; i < width*height; i++)
i420bytes[i] = yv12bytes[i];
for (int i = width*height; i < width*height + (width/2*height/2); i++)
i420bytes[i] = yv12bytes[i + (width/2*height/2)];
for (int i = width*height + (width/2*height/2); i < width*height + 2*(width/2*height/2); i++)
i420bytes[i] = yv12bytes[i - (width/2*height/2)];
return i420bytes;
}
、色はYV12toYUV420PackedSemiPlanarの変換は他の二つよりもパフォーマンスが向上します。それは比較的良いですが、実際の色と比較してまだ異なって見えます。私のコードに何か問題がありますか?すべてのコメントをいただければ幸いです。
+1ように質問を書き込むため。 –
クロマチャンネルのように「異なっている」のは逆で、「違う」ものは微妙に消えていますか? ( 'YV12toYUV420PackedSemiPlanar'を再配置してCb/Crチャンネルを入れ替えると、それは正しく見えますか?) – fadden
Cb/Crを入れ替えようとしましたが、色が正しくありません。私もYの色を表示しようとすると、ビデオが緑のマスクに置かれているように見える、それは私が期待しているものではない。私は本当に何が起こっているのか理解できません。 – Albert