Android Camera2录制视频始终显示30fps,如何实现240fps录制?
Camera2 API录制240fps视频失败(实际仅30fps)的解决方案
你遇到的问题核心是高帧率录制需要匹配Camera2的高帧率专属配置流程,普通配置无法触发设备的慢动作录制模式。以下是具体解决步骤:
1. 先确认设备支持的高帧率参数组合
不能直接硬写240fps和任意分辨率,必须先从设备的CameraCharacteristics中查询官方支持的高帧率+分辨率组合:
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager val characteristics = cameraManager.getCameraCharacteristics(yourCameraId) val configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!! // 遍历所有支持MediaRecorder的输出尺寸,寻找支持240fps的组合 var targetSize: Size? = null var targetFpsRange: Range<Int>? = null val outputSizes = configMap.getOutputSizes(MediaRecorder::class.java) for (size in outputSizes) { val fpsRanges = configMap.getHighSpeedVideoFpsRangesFor(size) for (range in fpsRanges) { if (range.upper == 240) { targetSize = size targetFpsRange = range break } } if (targetSize != null) break } // 如果找不到匹配的配置,说明设备不支持该分辨率下的240fps录制 if (targetSize == null) { // 提示用户或降级到支持的帧率 return }
2. 调整MediaRecorder配置
确保参数与查询到的支持组合完全匹配,同时优化比特率(高帧率需要更高比特率避免模糊):
mMediaRecorder!!.apply { // 若测试阶段出现问题,可先注释音频配置,部分高帧率模式不支持同时录音频 // setAudioSource(MediaRecorder.AudioSource.MIC) setVideoSource(MediaRecorder.VideoSource.SURFACE) setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) setOutputFile(mNextVideoAbsolutePath ?: getVideoFilePath(getActivity())) // 240fps的1080p视频建议比特率设为30Mbps以上 setVideoEncodingBitRate(30000000) setVideoFrameRate(240) // 使用查询到的支持尺寸 setVideoSize(targetSize.width, targetSize.height) setVideoEncoder(MediaRecorder.VideoEncoder.H264) // setAudioEncoder(MediaRecorder.AudioEncoder.AAC) prepare() }
3. 使用HighSpeedCaptureSession而非普通Session
高帧率录制必须使用Camera2的HighSpeedCaptureSession,普通Session无法触发高帧率模式:
val recorderSurface = mMediaRecorder!!.surface // 若有预览Surface,需一起传入 val surfaces = listOf(recorderSurface, yourPreviewSurface) cameraDevice.createHighSpeedCaptureSession(surfaces, object : CameraCaptureSession.StateCallback() { override fun onConfigured(session: CameraCaptureSession) { val captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD) captureRequestBuilder.addTarget(recorderSurface) // 设置查询到的高帧率范围 captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, targetFpsRange) captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO) // 启动重复捕获并开始录制 session.setRepeatingRequest(captureRequestBuilder.build(), null, yourHandler) mMediaRecorder!!.start() } override fun onConfigureFailed(session: CameraCaptureSession) { // 处理配置失败逻辑 } }, yourHandler)
额外注意事项
- 三星S22的960fps慢动作仅支持特定低分辨率(如720p),240fps支持1080p,需对应匹配分辨率
- 高帧率录制生成的视频文件体积极大,需确保存储充足
- 部分设备的高帧率模式会自动关闭音频录制,若必须录音频,需确认设备是否支持该帧率下的音频同步
内容的提问来源于stack exchange,提问作者Praveen Gautam
相关产品推荐
相关产品推荐

