You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:09:20