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

如何在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)

关键说明:

  1. cameraProvider.unbindAll()会解除当前所有绑定的用例,确保新的用例组合能正常绑定。
  2. 复用preview实例可以避免切换时预览画面闪烁,提升用户体验。
  3. 若你需要在录制视频期间抓拍图像,Android 11及以上版本的VideoCapture支持通过takePicture方法实现,但你的需求是先抓拍再录制,切换用例的方式更适配当前场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:15:41