如何设置媒体记录器以获得最佳视频质量效果?

2022-09-03 16:48:38

伙计们,有人可以告诉我应该如何设置参数,以便在不考虑手机的物理限制的情况下通过编码获得最佳的视频录制效果?还是对我编码的视图小失真有什么影响?MediaRecorderMediaRecorder

如果你们中的一些人可能猜到了不清楚的参数,我实际上是在使用首选项设置一些参数。我错过了哪些参数,这些参数可能有助于改善视频编码过程Ex:帧速率


答案 1

根据 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和/或设备都支持相同的值,因此您必须查询每个设备的最大值或找到可在任何地方使用的内容。


答案 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);

使用以下代码获取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);
}

希望它有帮助。


推荐