HarmonyOS鸿蒙Next中是否有类似于Android的Camera.PreviewCallback接口,用于打开摄像头时读取每一帧图片?

HarmonyOS鸿蒙Next中是否有类似于Android的Camera.PreviewCallback接口,用于打开摄像头时读取每一帧图片? 请问有没有一个接口类似于android的Camera.PreviewCallback呢?用于打开摄像头时读取每一帧图片

安卓的PreviewCallback长这样

@Deprecated
public interface PreviewCallback
{
    /**
     * Called as preview frames are displayed.  This callback is invoked
     * on the event thread {@link #open(int)} was called from.

     * <p>If using the {@link android.graphics.ImageFormat#YV12} format,
     * refer to the equations in {@link Camera.Parameters#setPreviewFormat}
     * for the arrangement of the pixel data in the preview callback
     * buffers.

     *@param data the contents of the preview frame in the format defined
      by {@link android.graphics.ImageFormat}, which can be queried
      with {@link android.hardware.Camera.Parameters#getPreviewFormat()}.
      If {@link android.hardware.Camera.Parameters#setPreviewFormat(int)}
                 is never called, the default will be the YCbCr_420_SP
                 (NV21) format.
     *@param camera the Camera service object.
     */
    void onPreviewFrame(byte[] data, Camera camera);
};
11 回复

更多关于HarmonyOS鸿蒙Next中是否有类似于Android的Camera.PreviewCallback接口,用于打开摄像头时读取每一帧图片?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如果持续触发imageArrivalListener事件,没过一会就提示内存不足提示OOM。但是PreviewCallback.onPreviewFrame(byte[] data, Camera camera)从打开摄像头开始就可以一直持续捕捉画面图像。我意思是我想做一个实时图像识别,摄像头实时识别物体,有什么接口或者怎么管理内存才不容易OOM呢?

在这个事件回调中你做了什么,我的相机应用并没有出现过oom

就是没做什么他也OOM了 就是官方Camera Demo里面的拍照方法,triggerSingleCapture换成triggerLoopingCapture(循环帧捕获)试下,没几秒马上卡住,

楼主你好,参考以下方式:

  1. 在相机配置时调用 setFrameStateCallback(FrameStateCallback, EventHandler) 方法设置帧回调。

  2. 通过 camera.triggerLoopingCapture(FrameConfig) 方法实现循环帧捕获

相机设备开发指导请参考:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-camera-guidelines-0000000000031782

请问FrameStateCallback里面哪个回调方法参数可以获取byte[] data(预览图像数据)呢?frameResult吗?但frameResult的成员方法没有哪个可以的。

欢迎开发小伙伴们进来帮帮楼主

找到一个比较简单粗暴的办法: 就是imageArrivalListener事件里面持续释放内存。

详解如下

参照CameraDemo:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-camera-guidelines-0000000000031782

但在点击按钮时,要注意addSurface是add了两个不同的surface,一个是展示预览画面,一个是回调捕获图像的surface。如果只add一个Surface,例如只增加了previewSurface, 没法触发下文所说的ImageArrivalListener事件;如果只增加了imageReceiver的Surface,画面会假死(停留在按钮刚按下捕获的图像,没有持续预览)

另外在

private void takeLoopingCapture(Component component) {
    if (cameraDevice == null || imageReceiver == null) {
        return;
    }
    FrameConfig.Builder framePictureConfigBuilder = cameraDevice.getFrameConfigBuilder(FRAME_CONFIG_PICTURE);
    framePictureConfigBuilder.addSurface(previewSurface);
    framePictureConfigBuilder.addSurface(imageReceiver.getRecevingSurface());
    FrameConfig pictureFrameConfig = framePictureConfigBuilder.build();
    cameraDevice.triggerLoopingCapture(pictureFrameConfig);
}

另外在初始化摄像头时设定方法回调

imageReceiver.setImageArrivalListener(this::proccessImage);
private synchronized void proccessImage(ImageReceiver receiver) {
    //获取帧图像
    ohos.media.image.Image image = receiver.readNextImage();
    ohos.media.image.Image.Component component = image.getComponent(ImageFormat.ComponentType.JPEG);
    byte[] bytes = new byte[component.remaining()];
    component.read(bytes);
    ImageSource imageSource = ImageSource.create(bytes, null);
    PixelMap pixelMap = imageSource.createPixelmap(new ImageSource.DecodingOptions());
    //处理图像例如保存...省略代码三万字
    //之后作release处理
    image.release();
    component.release();
    imageSource.release();
    pixelMap.release();
}

之前没做image.release()处理,没过几秒钟马上会OOM,提示如下

java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory

at java.lang.Thread.nativeCreate(Native Method) at java.lang.Thread.start(Thread.java:893)

at com.wincent.harmonybot.slice.TestCameraAbilitySlice.takeSingleCapture(TestCameraAbilitySlice.java:200)

请问你是在什么时候执行takeLoopingCapture函数的呢?

在HarmonyOS鸿蒙Next中,确实有类似于Android的Camera.PreviewCallback接口的功能,用于在打开摄像头时读取每一帧图片。鸿蒙系统提供了Camera类,其中包含setPreviewCallback方法,允许开发者设置一个回调函数来接收每一帧的预览数据。

具体来说,鸿蒙的Camera类中有一个setPreviewCallback方法,该方法接受一个PreviewCallback接口的实现。当摄像头开始预览时,系统会通过这个回调接口将每一帧的图像数据传递给开发者。开发者可以在回调函数中对这些图像数据进行处理,例如进行图像分析、保存或显示等操作。

以下是一个简单的示例代码片段,展示了如何在鸿蒙中设置预览回调:

import ohos.media.camera.Camera;
import ohos.media.camera.CameraConfig;
import ohos.media.camera.CameraKit;
import ohos.media.camera.PreviewCallback;

public class CameraExample {
    private Camera camera;

    public void startPreview() {
        CameraKit cameraKit = CameraKit.getInstance();
        String[] cameraIds = cameraKit.getCameraIds();
        if (cameraIds.length > 0) {
            camera = cameraKit.createCamera(cameraIds[0], new CameraStateCallback());
            CameraConfig cameraConfig = camera.getCameraConfig();
            cameraConfig.setPreviewCallback(new PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    // 处理每一帧的图像数据
                }
            });
            camera.startPreview();
        }
    }
}

在这个示例中,PreviewCallback接口的onPreviewFrame方法会在每一帧图像数据可用时被调用,开发者可以在此方法中对图像数据进行处理。

需要注意的是,鸿蒙系统的API和Android的API在某些细节上可能有所不同,开发者在使用时应参考鸿蒙的官方文档以确保正确使用。

在HarmonyOS鸿蒙Next中,确实有类似于Android的Camera.PreviewCallback的接口。鸿蒙提供了Camera类,通过setPreviewCallback方法可以设置预览回调,用于在每一帧图像可用时接收数据。具体实现如下:

Camera camera = Camera.open();
camera.setPreviewCallback(new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        // 处理每一帧图像数据
    }
});
camera.startPreview();

通过这种方式,开发者可以在鸿蒙系统中实现与Android类似的摄像头帧数据读取功能。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!