能否对CameraX的videoCapture模块视频拍摄速率进行调节?
CameraX 视频拍摄速率控制实现方案
首先明确结论:CameraX 1.1.0及更高稳定版本已原生支持视频录制速率控制,可以实现慢动作、多倍速快录的需求,具体实现方案如下:
一、前置校验:确认设备支持的帧率范围
在配置速率前需要先查询当前设备摄像头支持的帧率能力,避免设置无效参数:
val cameraProvider = ProcessCameraProvider.getInstance(context).get() val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA) val supportedFpsRanges = cameraInfo.supportedFrameRateRanges
返回的supportedFpsRanges就是设备支持的所有帧率区间,比如常见的慢动作支持(120,120)、(240,240),常规录制多是(30,30)。
二、慢动作录制实现
慢动作本质是高帧率采集、常规帧率输出,配置方式如下:
- 选择设备支持的高帧率区间,比如120fps,通过
VideoCapture.Builder配置帧率参数 - 示例代码:
val videoCapture = VideoCapture.Builder() .setTargetFrameRate( // 传入你需要的高帧率区间,比如120fps慢动作 Rational(120, 1) ) .setBitRate(16_000_000) // 高帧率录制建议提升码率避免画质损失 .build()
- 注意:如果要输出常规30fps的慢动作视频,采集120fps的素材后,输出时将播放速率设置为0.25倍即可实现4倍慢动作效果,也可以直接通过MediaMuxer在录制阶段直接封装为慢动作播放的视频文件。
三、倍速快录(比如2倍速)实现
快录有两种实现方案,可根据需求选择:
- 方案1:低帧率采集+常规速率输出
要实现2倍速录制,直接设置采集帧率为15fps,输出30fps的视频,播放时自然就是2倍速效果,代码示例:val videoCapture = VideoCapture.Builder() .setTargetFrameRate(Rational(15, 1)) .build() - 方案2:常规帧率采集+跳帧封装
如果你需要同时保留原始帧率的音视频素材,后期再做倍速处理,可以按30fps正常采集,在封装到mp4的时候每隔一帧丢弃一帧,最终输出的视频就是2倍速效果,同时可以单独调整音频的播放速率匹配。
注意事项
- 部分低端设备仅支持固定的帧率区间,设置前必须先查询
supportedFpsRanges确认参数有效性,否则配置会 fallback 到默认30fps - 高帧率录制会大幅提升功耗和文件体积,建议在界面上给用户明确提示
- 音频速率需要和视频速率同步调整,避免出现音画不同步的问题
内容的提问来源于stack exchange,提问作者Spartak Vardanyan
相关产品推荐
相关产品推荐

