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

xia*_*woo 1 android yuv android-camera android-mediacodec

我正在使用相机的 setPreviewCallback 使用 MediaCodec 编码视频。(我按照这个示例使用 Android MediaCodec 从相机编码 H.264)。我对 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();
Run Code Online (Sandbox Code Playgroud)

我的相机设置是:

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);
Run Code Online (Sandbox Code Playgroud)

我有视频,但有两个问题:

  1. 它的颜色是错误的。
  2. 播放速度太快了。

这是一个示例视频

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

有谁知道这两个问题的原因是什么吗?可能会告诉我一些解决这个问题的方法,因为我现在完全迷失/困惑了。感谢您的阅读,并感谢任何评论和意见。

fad*_*den 5

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

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

有关颜色空间以及如何交换它们的一些详细信息在此答案中。

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