我使用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);
我收到了一段视频,但有两个问题:
以下是视频示例
http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be
你们有谁知道这两个问题的原因是什么?也许可以告诉我一些解决这个问题的方法,因为我现在完全迷失/困惑。 感谢阅读,并感谢任何意见和建议。
答案 0 :(得分:3)
Camera
输出和MediaCodec
输入使用的YUV格式交换了U / V平面。
如果您能够通过Surface
移动数据,则可以避免此问题;但是,你失去了检查YUV数据的能力。可以在bigflake上找到从相机录制到.mp4文件的示例。
有关色彩空间及其交换方式的一些细节在this answer。
原始H.264基本流中没有时间戳信息。您需要将时间戳通过解码器传递到MediaMuxer
或您正在使用的任何内容来创建最终输出。如果不这样做,玩家将只选择一个速率,或者尽可能快地播放帧。