You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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 sizeConfig conflict),这些信息能帮你精准定位是尺寸不支持、编码器冲突还是Surface绑定问题。

内容的提问来源于stack exchange,提问作者chasez0r

火山引擎 最新活动