Android中使用CameraX做图像处理时同时录制视频的实现方法
CameraX同时进行图像处理与视频录制的实现方案
完全可行,CameraX支持将多个Use Case(比如ImageAnalysis和VideoCapture)同时绑定到同一个生命周期,只要你的设备硬件支持(主流安卓设备都满足)。下面是具体实现步骤:
1. 确认依赖配置
确保你的build.gradle中包含CameraX视频相关依赖:
dependencies { implementation "androidx.camera:camera-core:1.3.0" implementation "androidx.camera:camera-camera2:1.3.0" implementation "androidx.camera:camera-video:1.3.0" }
2. 初始化VideoCapture Use Case
在代码中添加VideoCapture的初始化逻辑,指定录制参数与输出路径:
private VideoCapture<Recorder> videoCaptureUseCase; private void initVideoCapture() { // 配置录制质量与参数 Recorder recorder = new Recorder.Builder() .setQualitySelector(QualitySelector.from(Quality.HIGH)) .build(); videoCaptureUseCase = VideoCapture.withOutput(recorder); // 设置视频保存路径(示例:应用私有电影目录) File outputFile = new File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), "record_" + System.currentTimeMillis() + ".mp4"); MediaStoreOutputOptions outputOptions = new MediaStoreOutputOptions.Builder(getContentResolver(), MediaStore.Video.Media.EXTERNAL_CONTENT_URI) .setContentValues(new ContentValues() {{ put(MediaStore.Video.Media.DISPLAY_NAME, outputFile.getName()); put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES); }}) .setFile(outputFile) .build(); }
3. 同时绑定两个Use Case到生命周期
修改你原有的绑定代码,将ImageAnalysis与VideoCapture一起传入:
// 保留原有的ImageAnalysis初始化逻辑 ImageAnalysis.Builder builder = new ImageAnalysis.Builder(); builder.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST); ImageAnalysis analysisUseCase = builder.build(); analysisUseCase.setAnalyzer( ContextCompat.getMainExecutor(SetAndGetData.getInstance().getContext()), imageProxy -> { // 你的图像处理逻辑保持不变 // 处理完成后必须调用close释放资源 imageProxy.close(); }); // 同时绑定两个Use Case到生命周期 cameraProvider.bindToLifecycle(this, cameraSelector, analysisUseCase, videoCaptureUseCase);
4. 控制录制的开始与停止
添加录制控制方法,可通过按钮点击等事件触发:
// 开始录制 private void startRecording() { if (videoCaptureUseCase == null) return; try { videoCaptureUseCase.startRecording( outputOptions, ContextCompat.getMainExecutor(this), new VideoCapture.OnVideoSavedCallback() { @Override public void onVideoSaved(@NonNull VideoCapture.OutputFileResults outputFileResults) { // 录制完成后的回调逻辑,比如提示用户 } @Override public void onError(int videoCaptureError, @NonNull String message, @Nullable Throwable cause) { // 处理录制错误 } }); } catch (IOException e) { e.printStackTrace(); } } // 停止录制 private void stopRecording() { if (videoCaptureUseCase != null) { videoCaptureUseCase.stopRecording(); } }
关键注意事项
- 提前申请必要权限:
CAMERA、Android 13及以下需WRITE_EXTERNAL_STORAGE,Android 13+需READ_MEDIA_VIDEO/WRITE_MEDIA_VIDEO - 图像处理逻辑中必须调用
imageProxy.close(),避免内存泄漏 - 若出现帧率不足或卡顿,可通过
builder.setTargetResolution()降低ImageAnalysis的分辨率,减少计算压力
内容的提问来源于stack exchange,提问作者Faizan Ahmad
相关产品推荐
相关产品推荐

