HarmonyOS鸿蒙Next中相机传输预览帧数据并拍照

HarmonyOS鸿蒙Next中相机传输预览帧数据并拍照

private class CameraStateCallbackImpl extends CameraStateCallback {
    CameraStateCallbackImpl() {}

    @Override
    public void onCreated(Camera camera) {
        if (surfaceProvider.getSurfaceOps().isPresent()) {
            previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();
        }
        if (previewSurface == null) {
            LogUtil.error(PlaneAbility.class.getSimpleName(), "Create camera filed, preview surface is null");
            return;
        }
        CameraConfig.Builder cameraConfigBuilder = camera.getCameraConfigBuilder();
        cameraConfigBuilder.addSurface(previewSurface);
        cameraConfigBuilder.addSurface(imageReceiver.getRecevingSurface());
        cameraConfigBuilder.addSurface(frameReceiver.getRecevingSurface());
        camera.configure(cameraConfigBuilder.build());
        cameraDevice = camera;
    }

    @Override
    public void onConfigured(Camera camera) {
        FrameConfig.Builder framePreviewConfigBuilder = camera.getFrameConfigBuilder(FRAME_CONFIG_PREVIEW);
        framePreviewConfigBuilder.addSurface(previewSurface);
        // 接收预览帧数据
        framePreviewConfigBuilder.addSurface(frameReceiver.getRecevingSurface());
        camera.triggerLoopingCapture(framePreviewConfigBuilder.build());
    }
}

我想实时地获取预览帧数据,并在按下按钮后拍照并保存图片。我想用两个ImageReceiver,一个用于预览帧数据的回传,一个用于拍照。如果代码这么写的话,预览画面就是黑屏,我应该怎么实现这个功能?


更多关于HarmonyOS鸿蒙Next中相机传输预览帧数据并拍照的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

当我只使用一个ImageReceiver的时候,预览画面没有黑屏,帧数据能正常获取。

private class CameraStateCallbackImpl extends CameraStateCallback {
    CameraStateCallbackImpl() {}

    @Override
    public void onCreated(Camera camera) {
        if (surfaceProvider.getSurfaceOps().isPresent()) {
            previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();
        }
        if (previewSurface == null) {
            LogUtil.error(PlaneAbility.class.getSimpleName(), "Create camera filed, preview surface is null");
            return;
        }
        CameraConfig.Builder cameraConfigBuilder = camera.getCameraConfigBuilder();
        cameraConfigBuilder.addSurface(previewSurface);
        cameraConfigBuilder.addSurface(frameReceiver.getRecevingSurface());
        camera.configure(cameraConfigBuilder.build());
        cameraDevice = camera;
    }

    @Override
    public void onConfigured(Camera camera) {
        FrameConfig.Builder framePreviewConfigBuilder = camera.getFrameConfigBuilder(FRAME_CONFIG_PREVIEW);
        framePreviewConfigBuilder.addSurface(previewSurface);
        // 接收预览帧数据
        framePreviewConfigBuilder.addSurface(frameReceiver.getRecevingSurface());
        camera.triggerLoopingCapture(framePreviewConfigBuilder.build());
    }
}

我发现两个ImageReceiver获取的图像格式不一样时,预览画面也没有黑屏

imageReceiver = ImageReceiver.create(HIGH_PIXEL_MODE_WIDTH, HIGH_PIXEL_MODE_HEIGHT, ImageFormat.JPEG, IMAGE_RCV_CAPACITY);
imageReceiver.setImageArrivalListener(this::saveImage);
frameReceiver = ImageReceiver.create(SCREEN_WIDTH, SCREEN_HEIGHT, ImageFormat.YUV420_888, IMAGE_RCV_CAPACITY);
frameReceiver.setImageArrivalListener(this::pushPreviewStream);

更多关于HarmonyOS鸿蒙Next中相机传输预览帧数据并拍照的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


已经获取预览帧数据的话,

点击按钮后可以修改一个标志位

预览回调里根据标志位去保存图片

但是我希望预览帧数据和保存的图片数据的格式不一样,所以不能这么做。相机不可以有两个imageReceiver实例吗?

我这里实测是可以的

- `imageReceiver`接收预览帧数据
- `imageReceiver2`接收拍照捕获数据

是可以正常运行的吗?我这边这么写,打开相机就是黑屏。

在HarmonyOS鸿蒙Next中,相机传输预览帧数据并拍照的实现主要依赖于CameraKitSurfaceProvider。首先,通过CameraKit初始化相机实例,并设置相机参数。然后,使用SurfaceProvider创建预览表面,将预览帧数据传输到指定的Surface上。在预览过程中,可以通过CameraCaptureSession捕获帧数据,并进行处理或保存。拍照时,调用CameraDevicecapture方法,传入拍照请求和回调函数,完成拍照操作并保存图像数据。整个过程涉及的主要类包括CameraKitSurfaceProviderCameraCaptureSessionCameraDevice

在HarmonyOS鸿蒙Next中,相机传输预览帧数据并拍照的流程如下:

  1. 初始化相机:使用CameraKit API初始化相机设备,设置相机参数如分辨率、帧率等。

  2. 配置预览:通过PreviewOutput类配置预览输出,将预览帧数据绑定到SurfaceTextureView上显示。

  3. 获取帧数据:通过ImageReaderSurfaceTexture获取预览帧数据,进行实时处理或分析。

  4. 拍照:使用CaptureSession配置拍照参数,调用capture方法进行拍照,照片数据可通过ImageReaderFile保存。

  5. 释放资源:拍照完成后,释放相机资源,关闭CameraKit

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现相机预览帧数据的传输和拍照功能。

回到顶部