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);
};
更多关于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(循环帧捕获)试下,没几秒马上卡住,
楼主你好,参考以下方式:
-
在相机配置时调用
setFrameStateCallback(FrameStateCallback, EventHandler)
方法设置帧回调。 -
通过
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类似的摄像头帧数据读取功能。