MediaRecorder 准备失败,setVideoSize 1080p

MediaRecorder prepare fails with setVideoSize 1080p

我的项目中有一个 MediaRecorder 对象,其初始化如下:

private void initRecorder() {
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
    mMediaRecorder.setVideoFrameRate(60);
    mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
    String filepath_external = Environment.getExternalStorageDirectory().getAbsolutePath()  + "/test/";
    File f = new File(filepath_external);
    if(!f.exists()){
        f.mkdirs();
    }
    mMediaRecorder.setOutputFile(filepath_external + System.currentTimeMillis() + ".mp4");
}

如果我设置

private static int DISPLAY_WIDTH = 1024;
private static int DISPLAY_HEIGHT = 768;

并调用 initRecorder(),然后调用 mMediaRecorder.prepare(),一切正常。

但是,我想用智能手机屏幕的尺寸进行录制。所以我使用下面的代码来设置宽度和高度:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
DISPLAY_WIDTH = size.x;
DISPLAY_HEIGHT = size.y;

现在宽度 = 1920,高度 = 1080(基本上是 1080p)。结果是我的 activity 甚至没有开始,产生了以下错误:

E/MediaRecorder: prepare failed: -2147483648

W/System.err: java.io.IOException: prepare failed.

W/System.err: at android.media.MediaRecorder._prepare(Native Method)

W/System.err: at android.media.MediaRecorder.prepare(MediaRecorder.java:873)

W/System.err: at com.lfdversluis.testrecord.RecordActivity.prepareRecorder(RecordActivity.java:161)

为什么它不起作用,我怎样才能让它起作用?


如果我在 getSupportedVideoSizes() 中打印所有支持的视频尺寸,我得到:

Optional size: 1920 1080 Optional size: 1440 1080 Optional size: 1280 720 Optional size: 800 450 Optional size: 720 480 Optional size: 640 480 Optional size: 320 240 Optional size: 176 144

所以应该支持 1920 x 1080...


按如下方式使用 CamcorderProfile,结果我也得到 1920 x 1080。同样,准备功能失败:

CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
int cameraWidth = camcorderProfile != null ? camcorderProfile.videoFrameWidth : -1;
int cameraHeight = camcorderProfile != null ? camcorderProfile.videoFrameHeight : -1;
DISPLAY_WIDTH = cameraWidth;
DISPLAY_HEIGHT = cameraHeight;
Log.e("Campcorder profile", String.format("%s %s", DISPLAY_WIDTH, DISPLAY_HEIGHT));

在 CommonsWare 的帮助下,我找到了这个问题。

确保同时检查相机参数中的 getSupportedPreviewFrameRates。在 Telecine 情况下硬编码 60 或 30 fps 可能并不总是适用于所有设备。如果您使用 CamcorderProfile,也将帧率设置为 camcorderProfile.videoFrameRate;