Android:MediaRecorder 前置摄像头输出 144x176

Android: MediaRecorder front-facing camera outputs 144x176

我无法更改 MediaRecorder 输出视频的视频分辨率。

Activity

CamcorderProfile mProfile = CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH );
recorder.setCamera( camera );
recorder.setAudioSource( MediaRecorder.AudioSource.CAMCORDER );
recorder.setVideoSource( MediaRecorder.VideoSource.DEFAULT );
recorder.setOutputFormat( mProfile.fileFormat );
recorder.setAudioEncoder( mProfile.audioCodec );
recorder.setVideoEncoder( mProfile.videoCodec );
recorder.setOutputFile( tempFile.getPath() );
recorder.setOrientationHint( 270 );
recorder.setVideoFrameRate( mProfile.videoFrameRate );
recorder.setVideoEncodingBitRate( mProfile.videoBitRate );
recorder.setAudioEncodingBitRate( mProfile.audioBitRate );
recorder.setAudioChannels( mProfile.audioChannels );
recorder.setAudioSamplingRate( mProfile.audioSampleRate );

预览的质量 crystal 清晰且工作完美,但输出视频分辨率低且有颗粒感。

使用 recorder.setVideoSize( XXX, XXX ); 给我这个错误:

E/MediaRecorder﹕ start failed: -19

如何让我的输出具有更高的分辨率?

我通过从相机预览中获取 width/height 参数解决了这个问题(至少现在)。

int videoWidth = camera.getParameters().getPreviewSize().width;
int videoHeight = camera.getParameters().getPreviewSize().height;

然后使用

recorder.setVideoSize( videoWidth, videoHeight );

这使得输出与相机预览相同。

编辑:

如果你保持正确的比例并保持在 500x500 左右,我认为你可以通过这样做获得任何支持的尺寸:

Camera.Parameters parameters = camera.getParameters();
Camera.Size size = parameters.getSupportedPreviewSizes().get( 0 );
for ( Camera.Size s : parameters.getSupportedPreviewSizes() ) {
    Log.e( "SIZE:", s.width + "x" + s.height );
    if ( s.width > 500 ) // from high to low res
        size = s;
}
Log.e( "SIZE", "Selected size: " + size.width + "x" + size + " (width still over 500)" );   
parameters.setPreviewSize( size.width, size.height );
camera.setParameters( parameters );

输出

SIZE: 1920x1080

SIZE: 1440x1080

SIZE: 1280x960

SIZE: 1280x720

SIZE: 960x720

SIZE: 864x480

SIZE: 768x432

SIZE: 720x480

SIZE: 640x480

SIZE: 320x240

SIZE: 176x144

Selected size: 640x480 (width still over 500)