如何设置MediaRecorder以获得最佳视频质量效果?

时间:2011-05-19 12:48:38

标签: java android encoding camera

伙计们有人可以告诉我如何在MediaRecorder中设置参数,以便通过编码获得最佳视频录制效果而不考虑手机的物理限制?或者是由于我对MediaRecorder

的编码造成的视图小失真的影响

如果有些人猜测参数不清楚,我实际上是在使用偏好设置一些参数。我想念的参数有哪些可能有助于改善视频编码过程Ex:framerate

2 个答案:

答案 0 :(得分:35)

根据API级别,您可能希望使用现有的配置文件。

没有个人资料:

recorder.setVideoSize(640, 480);
recorder.setVideoFrameRate(16); //might be auto-determined due to lighting
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// MPEG_4_SP
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

或者如果您想使用现有的个人资料

CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(cpHigh);

请注意,您不能同时拥有这两个选项,因为您会收到错误或准备不起作用

由于并非所有Android API和/或设备都支持相同的值,您必须查询每台设备的最大值或查找适用于所有设备的内容。

答案 1 :(得分:2)

尽管问题已经很久了,但我想指出一下我用来录制高清质量视频的组合。

使用以下代码组合来获得高清质量的视频。

CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);                    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);                    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);                    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);                    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                    mMediaRecorder.setVideoEncodingBitRate(cpHigh.videoBitRate);                    mMediaRecorder.setVideoFrameRate(cpHigh.videoFrameRate);
int rotation = mWindowManager.getDefaultDisplay().getRotation();
int orientation = ORIENTATIONS.get(rotation + 90);
mMediaRecorder.setOrientationHint(orientation);

Use below code to get the DISPLAY_HEIGHT,DISPLAY_WIDTH

DisplayMetrics metrics = new DisplayMetrics();      
mWindowManager.getDefaultDisplay().getMetrics(metrics);          
DISPLAY_WIDTH = metrics.widthPixels;
DISPLAY_HEIGHT = metrics.heightPixels;

如下所示定义方向

public static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
ORIENTATIONS.append(Surface.ROTATION_0, 90);
ORIENTATIONS.append(Surface.ROTATION_90, 0);
ORIENTATIONS.append(Surface.ROTATION_180, 270);
ORIENTATIONS.append(Surface.ROTATION_270, 180);
}

希望有帮助。