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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:40:21