1

我正在使用 Camera 的 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();

我的相机设置是:

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. 它的播放速度太快了。

这是一个示例视频

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

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

4

1 回答 1

5

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

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

关于色彩空间以及如何交换它们的一些细节在这个答案中。

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

于 2013-11-11T21:31:10.553 回答