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
当我只使用一个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中,相机传输预览帧数据并拍照的实现主要依赖于CameraKit
和SurfaceProvider
。首先,通过CameraKit
初始化相机实例,并设置相机参数。然后,使用SurfaceProvider
创建预览表面,将预览帧数据传输到指定的Surface
上。在预览过程中,可以通过CameraCaptureSession
捕获帧数据,并进行处理或保存。拍照时,调用CameraDevice
的capture
方法,传入拍照请求和回调函数,完成拍照操作并保存图像数据。整个过程涉及的主要类包括CameraKit
、SurfaceProvider
、CameraCaptureSession
和CameraDevice
。
在HarmonyOS鸿蒙Next中,相机传输预览帧数据并拍照的流程如下:
-
初始化相机:使用
CameraKit
API初始化相机设备,设置相机参数如分辨率、帧率等。 -
配置预览:通过
PreviewOutput
类配置预览输出,将预览帧数据绑定到Surface
或TextureView
上显示。 -
获取帧数据:通过
ImageReader
或SurfaceTexture
获取预览帧数据,进行实时处理或分析。 -
拍照:使用
CaptureSession
配置拍照参数,调用capture
方法进行拍照,照片数据可通过ImageReader
或File
保存。 -
释放资源:拍照完成后,释放相机资源,关闭
CameraKit
。
通过以上步骤,可以在HarmonyOS鸿蒙Next中实现相机预览帧数据的传输和拍照功能。