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;
。
我的项目中有一个 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;
。