Android Camera2 API视频录制1080p@30fps报错问题求助
解决MediaRecorder设置1080p尺寸时的Surf相关错误
这种Surf类错误大多和硬件兼容性、MediaRecorder配置顺序或参数冲突有关,结合你的场景,我整理了几个实用的排查和解决方向:
1. 先确认硬件实际支持的录制尺寸组合
原生相机能录制1080p@30fps不代表直接硬设尺寸就一定兼容——不同设备对尺寸、帧率的组合支持有差异,而且QUALITY_HIGH本身已经预设了一套参数,手动修改尺寸可能触发冲突。
你可以通过CameraManager获取当前相机支持的所有视频录制尺寸列表,确认1920x1080是否在其中,且和30fps匹配:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = manager.getCameraIdList()[0]; // 取后置相机 CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] videoSizes = map.getOutputSizes(MediaRecorder.class); // 遍历videoSizes,检查是否包含1920x1080且支持30fps for (Size size : videoSizes) { if (size.getWidth() == 1920 && size.getHeight() == 1080) { // 进一步确认帧率支持 Range<Integer>[] fpsRanges = map.getHighSpeedVideoFpsRangesFor(size); for (Range<Integer> range : fpsRanges) { if (range.getUpper() >= 30) { Log.d("CameraSupport", "1080p@30fps is supported"); } } } }
2. 严格遵循MediaRecorder的配置顺序
MediaRecorder的参数设置有严格的先后顺序,错误的顺序很容易触发底层Surface错误。不要在调用setProfile(QUALITY_HIGH)后再手动修改视频尺寸,因为Profile已经包含了尺寸、码率等参数,手动覆盖会导致配置冲突。
如果要手动指定1080p尺寸,建议放弃QUALITY_HIGH,全手动配置参数:
// 正确的配置顺序示例 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 先设置尺寸、帧率,再设置编码器和码率 mMediaRecorder.setVideoSize(1920, 1080); mMediaRecorder.setVideoFrameRate(30); // 1080p@30fps建议码率设为8-12Mbps,保证画质 mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setOutputFile(getOutputVideoPath()); try { mMediaRecorder.prepare(); } catch (IOException e) { e.printStackTrace(); }
3. 保证预览Surface与录制尺寸一致
部分设备要求相机预览的Surface尺寸必须和MediaRecorder的录制尺寸一致,否则会触发Surface不兼容错误。你需要确保相机预览的SurfaceView/TextureView尺寸也设置为1920x1080,或者通过相机参数匹配最接近的支持尺寸。
4. 捕获详细错误日志定位问题
如果以上方法都无效,建议打印完整的错误堆栈信息,看具体的Surf错误描述(比如Surface does not support requested size或Config conflict),这些信息能帮你精准定位是尺寸不支持、编码器冲突还是Surface绑定问题。
内容的提问来源于stack exchange,提问作者chasez0r




