Android MediaCodec视频颜色错误,播放速度太快

时间:2013-11-11 21:07:14

标签: android android-camera yuv mediacodec

我使用Camera的setPreviewCallback使用MediaCodec编码视频。 (我遵循这个例子Encoding H.264 from camera with Android MediaCodec)。 我使用MediaCodec的以下设置:

mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 1280, 720);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 8000000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
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();

我的相机设置为:

Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPictureSize(previewWidth, 1280);
parameters.setPreviewSize(previewWidth, 720);
parameters.setPreviewFrameRate(30);
parameters.setPreviewFpsRange(5000,30000);
mCamera.setParameters(parameters);

我收到了一段视频,但有两个问题:

  1. 它的颜色错了。
  2. 打得太快了。
  3. 以下是视频示例

    http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be

    你们有谁知道这两个问题的原因是什么?也许可以告诉我一些解决这个问题的方法,因为我现在完全迷失/困惑。 感谢阅读,并感谢任何意见和建议。

1 个答案:

答案 0 :(得分:3)

Camera输出和MediaCodec输入使用的YUV格式交换了U / V平面。

如果您能够通过Surface移动数据,则可以避免此问题;但是,你失去了检查YUV数据的能力。可以在bigflake上找到从相机录制到.mp4文件的示例。

有关色彩空间及其交换方式的一些细节在this answer

原始H.264基本流中没有时间戳信息。您需要将时间戳通过解码器传递到MediaMuxer或您正在使用的任何内容来创建最终输出。如果不这样做,玩家将只选择一个速率,或者尽可能快地播放帧。