From 9ae8a7244469487d71da9d0eea279c05d331cf16 Mon Sep 17 00:00:00 2001 From: wwyang <137208408@qq.com> Date: Tue, 27 Aug 2024 17:33:11 +0800 Subject: [PATCH 1/3] =?UTF-8?q?camera=E4=B8=89=E6=96=B9=E5=BA=93=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=8F=8C=E8=B7=AF=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wwyang <137208408@qq.com> --- .../ets/io/flutter/plugins/camera/Camera.ets | 44 +++++++++- .../camera/media/ImageStreamReader.ets | 85 +++++++++---------- 2 files changed, 80 insertions(+), 49 deletions(-) diff --git a/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/Camera.ets b/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/Camera.ets index 26effb86a..909904bde 100644 --- a/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/Camera.ets +++ b/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/Camera.ets @@ -694,8 +694,48 @@ export class Camera implements CameraCaptureStateListener { startPreviewWithImageStream(imageStreamChannel: EventChannel) { this.setStreamHandler(imageStreamChannel); - this.startCapture(false, true); - Log.i(TAG, "startPreviewWithImageStream"); + this.startImageStream(); + } + + async startImageStream() { + try { + if (this.photoSession != null) { + await this.photoSession?.stop() + } + } catch (e) { + } + try { + if (this.videoSession != null) { + await this.videoSession?.stop(); + } + } catch (e) { + } + + let profiles = + CameraUtils.getSupportedOutputCapability(this.cameraDevice!, camera.SceneMode.NORMAL_PHOTO, this.cameraManager) + let previewProfiles: Array = profiles.previewProfiles; + let captureSize: camera.Size = this.cameraFeatures.getResolution().getCaptureSize(); + let previewProfilesObj = previewProfiles.find((profile: camera.Profile) => { + return profile.size.width === captureSize.width && profile.size.height === captureSize.height; + }); + let previewProfilesObj2 = previewProfiles.find((profile: camera.Profile) => { + return profile.size.width === captureSize.width && profile.size.height === captureSize.height; + }); + + this.previewOutput = + this.cameraManager.createPreviewOutput(previewProfilesObj, this.flutterTexture.getSurfaceId().toString()); + let imageReceiverSurfaceId: string = await this.imageStreamReader!.getReceivingSurfaceId(); + let previewOutput2: camera.PreviewOutput = + this.cameraManager.createPreviewOutput(previewProfilesObj2, imageReceiverSurfaceId); + + this.photoSession = this.cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession; + this.photoSession.beginConfig(); + await this.cameraInput?.open(); + this.photoSession.addInput(this.cameraInput); + this.photoSession.addOutput(this.previewOutput); + this.photoSession.addOutput(previewOutput2); + await this.photoSession.commitConfig(); + await this.photoSession.start(); } async prepareMediaRecorder(cameraManager: camera.CameraManager, diff --git a/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets b/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets index 429e152c7..cbd362603 100644 --- a/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets +++ b/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets @@ -18,8 +18,8 @@ import { CameraCaptureProperties } from '../types/CameraCaptureProperties'; import { ImageStreamReaderUtils } from './ImageStreamReaderUtils'; import { ArrayList, HashMap } from '@kit.ArkTS'; import { Size } from '@kit.ArkUI'; -import { EventSink, StreamHandler } from '@ohos/flutter_ohos/src/main/ets/plugin/common/EventChannel'; -import { ByteBuffer } from '@ohos/flutter_ohos'; +import { EventSink } from '@ohos/flutter_ohos/src/main/ets/plugin/common/EventChannel'; +import { BusinessError } from '@kit.BasicServicesKit'; export class ImageStreamReader { private readonly dartImageFormat: number; @@ -33,19 +33,15 @@ export class ImageStreamReader { this.imageStreamReaderUtils = new ImageStreamReaderUtils(); } - public onImageAvailable( + public async onImageAvailable( _image: image.Image, + imgComponent: image.Component, captureProps: CameraCaptureProperties, - imageStreamSink: EventSink): void { + imageStreamSink: EventSink) { try { let imageBuffer: HashMap = new HashMap(); - if(this.dartImageFormat == image.ImageFormat.YCBCR_422_SP) { - imageBuffer.set("planes", this.parsePlanesForYuvOrJpeg(_image)) - } else{ - imageBuffer.set("planes", this.parsePlanesForYuvOrJpeg(_image)) - } - + imageBuffer.set("planes", this.parsePlanes(_image, imgComponent)) imageBuffer.set('width', _image.size.width); imageBuffer.set('height', _image.size.height); imageBuffer.set('format', this.dartImageFormat); @@ -55,60 +51,55 @@ export class ImageStreamReader { imageBuffer.set('sensorSensitivity', sensorSensitivity == null ? null : sensorSensitivity); imageStreamSink.success(imageBuffer) - _image.release() + await _image.release() } catch (e) { imageStreamSink.error( "IllegalStateException", "Caught IllegalStateException: " + e.getMessage(), null) - _image.release() + await _image.release() } } - public parsePlanesForYuvOrJpeg(_image: image.Image): ArrayList> { + public parsePlanes( + _image: image.Image, + imgComponent: image.Component): ArrayList> { let planes: ArrayList> = new ArrayList(); + let planeBuffer: HashMap = new HashMap(); - Object.values(image.ComponentType).forEach(async (value) => { - _image.getComponent(value as number).then((component: image.Component) => { - let planeBuffer: HashMap = new HashMap(); - - planeBuffer.set("bytesPerRow", component.rowStride); - planeBuffer.set("bytesPerPixel", component.pixelStride); - planeBuffer.set("bytes", component.byteBuffer); + planeBuffer.set("bytesPerRow", imgComponent.rowStride); + planeBuffer.set("bytesPerPixel", imgComponent.pixelStride); + planeBuffer.set("bytes", imgComponent.byteBuffer); + planes.add(planeBuffer); - planes.add(planeBuffer) - }) - }) return planes; } - public parsePlanesForYCBCR422SP(_image: image.Image): ArrayList> { - let planes: ArrayList> = new ArrayList(); - let imageBuffer: Array = new Array(); - Object.values(image.ComponentType).forEach(async (value) => { - _image.getComponent(value as number).then((component: image.Component) => { - imageBuffer.push(component.byteBuffer); - }) - }) - // let bytes: ByteBuffer = this.imageStreamReaderUtils.yuv420ThreePlanesToNv21(_image, _image.size.width, _image.size.height); - let planeBuffer: HashMap = new HashMap(); - planeBuffer.set("bytesPerRow", _image.size.width); - planeBuffer.set("bytesPerPixel", 1); - // planeBuffer.set("bytes", bytes); - planeBuffer.set("bytes", imageBuffer); - planes.add(planeBuffer); - return planes; + public getReceivingSurfaceId() { + return this.imageReceiver.getReceivingSurfaceId(); } - // public getSurface(): Surface { - // return this.imageReceiver.getReceivingSurfaceId(); - // } - - public async subscribeListener(captureProps: CameraCaptureProperties, imageStreamSink: EventSink): Promise { - const _image: image.Image = await this.imageReceiver.readNextImage() - if(_image == null) return - this.onImageAvailable(_image, captureProps, imageStreamSink) + public async subscribeListener(captureProps: CameraCaptureProperties, imageStreamSink: EventSink) { + + this.imageReceiver.on('imageArrival', () => { + this.imageReceiver.readNextImage((err: BusinessError, nextImage: image.Image) => { + if (err || nextImage === undefined) { + console.error('readNextImage failed'); + return; + } + nextImage.getComponent(image.ComponentType.JPEG, (err: BusinessError, imgComponent: image.Component) => { + if (err || imgComponent === undefined) { + console.error('getComponent failed'); + } + if (imgComponent && imgComponent.byteBuffer as ArrayBuffer) { + this.onImageAvailable(nextImage, imgComponent, captureProps, imageStreamSink) + } else { + console.error('byteBuffer is null'); + } + }) + }) + }); } public removeListener(): void { -- Gitee From 1330c058f27017976db602a2be371a8d61989017 Mon Sep 17 00:00:00 2001 From: wwyang <137208408@qq.com> Date: Wed, 28 Aug 2024 20:49:07 +0800 Subject: [PATCH 2/3] =?UTF-8?q?camera=E4=B8=89=E6=96=B9=E5=BA=93=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=8F=8C=E8=B7=AF=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wwyang <137208408@qq.com> --- .../camera/camera_ohos/lib/src/type_conversion.dart | 12 ++++++------ .../plugins/camera/media/ImageStreamReader.ets | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera_ohos/lib/src/type_conversion.dart b/packages/camera/camera_ohos/lib/src/type_conversion.dart index 9b5651451..fa1fac322 100644 --- a/packages/camera/camera_ohos/lib/src/type_conversion.dart +++ b/packages/camera/camera_ohos/lib/src/type_conversion.dart @@ -13,12 +13,12 @@ CameraImageData cameraImageFromPlatformData(Map data) { format: _cameraImageFormatFromPlatformData(data['format']), height: data['height'] as int, width: data['width'] as int, - lensAperture: data['lensAperture'] as double?, + lensAperture: double.parse(data['lensAperture'].toString()), sensorExposureTime: data['sensorExposureTime'] as int?, - sensorSensitivity: data['sensorSensitivity'] as double?, - planes: List.unmodifiable( - (data['planes'] as List).map( - (dynamic planeData) => _cameraImagePlaneFromPlatformData( + sensorSensitivity: double.parse(data['sensorSensitivity'].toString()), + planes: List.unmodifiable( + (data['planes'] as List).map( + (dynamic planeData) => _cameraImagePlaneFromPlatformData( planeData as Map)))); } @@ -30,7 +30,7 @@ ImageFormatGroup _imageFormatGroupFromPlatformData(dynamic data) { switch (data) { case 35: return ImageFormatGroup.yuv420; - case 256: + case 2000: return ImageFormatGroup.jpeg; case 17: return ImageFormatGroup.nv21; diff --git a/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets b/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets index cbd362603..bf6890b0e 100644 --- a/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets +++ b/packages/camera/camera_ohos/ohos/src/main/ets/io/flutter/plugins/camera/media/ImageStreamReader.ets @@ -66,11 +66,11 @@ export class ImageStreamReader { _image: image.Image, imgComponent: image.Component): ArrayList> { let planes: ArrayList> = new ArrayList(); - let planeBuffer: HashMap = new HashMap(); + let planeBuffer: HashMap = new HashMap(); planeBuffer.set("bytesPerRow", imgComponent.rowStride); planeBuffer.set("bytesPerPixel", imgComponent.pixelStride); - planeBuffer.set("bytes", imgComponent.byteBuffer); + planeBuffer.set("bytes", new Uint8Array(imgComponent.byteBuffer)); planes.add(planeBuffer); return planes; -- Gitee From 135e14fe143c7abfff5756966cde92d97eb890bb Mon Sep 17 00:00:00 2001 From: wwyang <137208408@qq.com> Date: Wed, 28 Aug 2024 20:57:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wwyang <137208408@qq.com> --- .../camera/camera_ohos/lib/src/type_conversion.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_ohos/lib/src/type_conversion.dart b/packages/camera/camera_ohos/lib/src/type_conversion.dart index fa1fac322..8267637e9 100644 --- a/packages/camera/camera_ohos/lib/src/type_conversion.dart +++ b/packages/camera/camera_ohos/lib/src/type_conversion.dart @@ -16,10 +16,11 @@ CameraImageData cameraImageFromPlatformData(Map data) { lensAperture: double.parse(data['lensAperture'].toString()), sensorExposureTime: data['sensorExposureTime'] as int?, sensorSensitivity: double.parse(data['sensorSensitivity'].toString()), - planes: List.unmodifiable( - (data['planes'] as List).map( - (dynamic planeData) => _cameraImagePlaneFromPlatformData( - planeData as Map)))); + planes: List.unmodifiable( + (data['planes'] as List).map( + (dynamic planeData) => + _cameraImagePlaneFromPlatformData( + planeData as Map)))); } CameraImageFormat _cameraImageFormatFromPlatformData(dynamic data) { @@ -30,7 +31,7 @@ ImageFormatGroup _imageFormatGroupFromPlatformData(dynamic data) { switch (data) { case 35: return ImageFormatGroup.yuv420; - case 2000: + case 256: return ImageFormatGroup.jpeg; case 17: return ImageFormatGroup.nv21; -- Gitee