如何在CameraX CameraProvider中替换UseCase,实现人脸检测后录制视频?
解决方案
CameraX确实不支持同时绑定Preview + VideoCapture + ImageAnalysis + ImageCapture这四个用例,但你可以通过动态切换绑定的用例组合来实现需求:先用人脸检测+图像捕获的组合完成人脸裁剪,再切换到预览+视频录制的组合完成5秒录像。
具体步骤:
- 初始阶段(人脸检测+图像捕获):保持你当前的绑定逻辑,用
Preview + ImageAnalysis + ImageCapture完成人脸检测和人脸图像的捕获裁剪。 - 切换到视频录制:当需要录制视频时,先解绑当前的所有用例,再绑定
Preview + VideoCapture组合启动录制;录制完成后,再切换回初始组合即可。
代码示例:
假设你已经有了preview实例(复用它能避免画面闪烁),切换录制的逻辑如下:
// 准备视频输出文件 val outputFile = File(externalMediaDirs.first(), "recorded_video.mp4") val outputOptions = VideoCapture.OutputFileOptions.Builder(outputFile).build() // 切换到视频录制模式 cameraProvider.unbindAll() val videoCapture = VideoCapture.Builder().build() // 重新绑定预览与视频录制用例 camera = cameraProvider.bindToLifecycle( owner, cameraConfigs.cameraSelector, preview, videoCapture ) // 启动录制 videoCapture.startRecording( outputOptions, ContextCompat.getMainExecutor(this), object : VideoCapture.OnVideoSavedCallback { override fun onVideoSaved(outputFileResults: VideoCapture.OutputFileResults) { // 录制完成后切换回人脸检测模式 cameraProvider.unbindAll() camera = cameraProvider.bindToLifecycle( owner, cameraConfigs.cameraSelector, preview, analysis, imageCapture ) } override fun onError(videoCaptureError: Int, message: String, cause: Throwable?) { // 处理录制错误 } } ) // 5秒后自动停止录制 Handler(Looper.getMainLooper()).postDelayed({ videoCapture.stopRecording() }, 5000)
关键说明:
cameraProvider.unbindAll()会解除当前所有绑定的用例,确保新的用例组合能正常绑定。- 复用
preview实例可以避免切换时预览画面闪烁,提升用户体验。 - 若你需要在录制视频期间抓拍图像,Android 11及以上版本的
VideoCapture支持通过takePicture方法实现,但你的需求是先抓拍再录制,切换用例的方式更适配当前场景。
内容的提问来源于stack exchange,提问作者Urma
相关产品推荐
相关产品推荐

