From 7ee691ea06e60ae8e5267405e77c3f4faaf157ee Mon Sep 17 00:00:00 2001 From: zhangchao Date: Sat, 26 Aug 2023 16:53:26 +0800 Subject: [PATCH] =?UTF-8?q?cameraFramework=20ArkTS=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangchao --- .../media/camera-device-input.md | 46 ++-- .../application-dev/media/camera-metadata.md | 28 +- zh-cn/application-dev/media/camera-mode.md | 205 ++++++++------- .../media/camera-performance-improvement.md | 60 ++--- zh-cn/application-dev/media/camera-preview.md | 62 ++--- .../media/camera-recording-case.md | 240 +++++++++--------- .../application-dev/media/camera-recording.md | 126 ++++----- .../media/camera-session-management.md | 40 +-- .../media/camera-shooting-case.md | 210 +++++++-------- .../application-dev/media/camera-shooting.md | 132 +++++----- 10 files changed, 574 insertions(+), 575 deletions(-) diff --git a/zh-cn/application-dev/media/camera-device-input.md b/zh-cn/application-dev/media/camera-device-input.md index b3ceea2db9..a2eefd8eb9 100644 --- a/zh-cn/application-dev/media/camera-device-input.md +++ b/zh-cn/application-dev/media/camera-device-input.md @@ -15,9 +15,9 @@ 2. 通过getCameraManager()方法,获取cameraManager对象。 ```ts - let cameraManager; - let context: any = getContext(this); - cameraManager = camera.getCameraManager(context) + let cameraManager: camera.CameraManager; + let context: Context = getContext(this); // [各类Context的获取方式](../application-models/application-context-stage.md) + cameraManager = camera.getCameraManager(context); ``` > **说明:** @@ -27,17 +27,17 @@ 3. 通过cameraManager类中的getSupportedCameras()方法,获取当前设备支持的相机列表,列表中存储了设备支持的所有相机ID。若列表不为空,则说明列表中的每个ID都支持独立创建相机对象;否则,说明当前设备无可用相机,不可继续后续操作。 ```ts - let cameraArray = cameraManager.getSupportedCameras(); - if (cameraArray.length <= 0) { - console.error("cameraManager.getSupportedCameras error"); - return; + let cameraArray: Array = cameraManager.getSupportedCameras(); + if (cameraArray != undefined && cameraArray.length <= 0) { + console.error("cameraManager.getSupportedCameras error"); + return; } for (let index = 0; index < cameraArray.length; index++) { - console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID - console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 - console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 - console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 + console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID + console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 + console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 + console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 } ``` @@ -45,24 +45,24 @@ ```ts // 创建相机输入流 - let cameraInput; + let cameraInput: camera.CameraInput; try { - cameraInput = cameraManager.createCameraInput(cameraArray[0]); + cameraInput = cameraManager.createCameraInput(cameraArray[0]); } catch (error) { - console.error('Failed to createCameraInput errorCode = ' + error.code); + console.error('Failed to createCameraInput errorCode = ' + error.code); } // 监听cameraInput错误信息 - let cameraDevice = cameraArray[0]; - cameraInput.on('error', cameraDevice, (error) => { - console.info(`Camera input error code: ${error.code}`); - }) + let cameraDevice: camera.CameraDevice = cameraArray[0]; + cameraInput.on('error', cameraDevice, (error: BusinessError) => { + console.info(`Camera input error code: ${error.code}`); + }); // 打开相机 await cameraInput.open(); // 获取相机设备支持的输出流能力 - let cameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0]); + let cameraOutputCapability: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0]); if (!cameraOutputCapability) { - console.error("cameraManager.getSupportedOutputCapability error"); - return; + console.error("cameraManager.getSupportedOutputCapability error"); + return; } console.info("outputCapability: " + JSON.stringify(cameraOutputCapability)); ``` @@ -75,8 +75,8 @@ 通过注册cameraStatus事件,通过回调返回监听结果,callback返回CameraStatusInfo参数,参数的具体内容可参考相机管理器回调接口实例[CameraStatusInfo](../reference/apis/js-apis-camera.md#camerastatusinfo)。 ```ts -cameraManager.on('cameraStatus', (err, cameraStatusInfo) => { +cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { console.info(`camera: ${cameraStatusInfo.camera.cameraId}`); console.info(`status: ${cameraStatusInfo.status}`); -}) +}); ``` diff --git a/zh-cn/application-dev/media/camera-metadata.md b/zh-cn/application-dev/media/camera-metadata.md index 9e681e0b81..30515f6286 100644 --- a/zh-cn/application-dev/media/camera-metadata.md +++ b/zh-cn/application-dev/media/camera-metadata.md @@ -11,13 +11,13 @@ Metadata主要是通过一个TAG(Key),去找对应的Data,用于传递 1. 调用CameraOutputCapability类中的supportedMetadataObjectTypes()方法,获取当前设备支持的元数据类型,并通过createMetadataOutput()方法创建元数据输出流。 ```ts - let metadataObjectTypes = cameraOutputCapability.supportedMetadataObjectTypes; - let metadataOutput; + let metadataObjectTypes: Array = cameraOutputCapability.supportedMetadataObjectTypes; + let metadataOutput: camera.MetadataOutput; try { - metadataOutput = cameraManager.createMetadataOutput(metadataObjectTypes); + metadataOutput = cameraManager.createMetadataOutput(metadataObjectTypes); } catch (error) { // 失败返回错误码error.code并处理 - console.info(error.code); + console.info(error.code); } ``` @@ -25,9 +25,9 @@ Metadata主要是通过一个TAG(Key),去找对应的Data,用于传递 ```ts metadataOutput.start().then(() => { - console.info('Callback returned with metadataOutput started.'); + console.info('Callback returned with metadataOutput started.'); }).catch((err) => { - console.info('Failed to metadataOutput start '+ err.code); + console.info('Failed to metadataOutput start '+ err.code); }); ``` @@ -35,9 +35,9 @@ Metadata主要是通过一个TAG(Key),去找对应的Data,用于传递 ```ts metadataOutput.stop().then(() => { - console.info('Callback returned with metadataOutput stopped.'); + console.info('Callback returned with metadataOutput stopped.'); }).catch((err) => { - console.info('Failed to metadataOutput stop '+ err.code); + console.info('Failed to metadataOutput stop '+ err.code); }); ``` @@ -48,9 +48,9 @@ Metadata主要是通过一个TAG(Key),去找对应的Data,用于传递 - 通过注册监听获取metadata对象,监听事件固定为metadataObjectsAvailable。检测到有效metadata数据时,callback返回相应的metadata数据信息,metadataOutput创建成功时可监听。 ```ts - metadataOutput.on('metadataObjectsAvailable', (err, metadataObjectArr) => { - console.info(`metadata output metadataObjectsAvailable`); - }) + metadataOutput.on('metadataObjectsAvailable', (err: BusinessError, metadataObjectArr: Array) => { + console.info(`metadata output metadataObjectsAvailable`); + }); ``` > **说明:** @@ -60,7 +60,7 @@ Metadata主要是通过一个TAG(Key),去找对应的Data,用于传递 - 通过注册回调函数,获取监听metadata流的错误结果,callback返回metadata输出接口使用错误时返回的错误码,错误码类型参见[CameraErrorCode](../reference/apis/js-apis-camera.md#cameraerrorcode)。 ```ts - metadataOutput.on('error', (metadataOutputError) => { - console.info(`Metadata output error code: ${metadataOutputError.code}`); - }) + metadataOutput.on('error', (metadataOutputError: BusinessError) => { + console.info(`Metadata output error code: ${metadataOutputError.code}`); + }); ``` diff --git a/zh-cn/application-dev/media/camera-mode.md b/zh-cn/application-dev/media/camera-mode.md index 5bd22a536e..ca4caadf7d 100644 --- a/zh-cn/application-dev/media/camera-mode.md +++ b/zh-cn/application-dev/media/camera-mode.md @@ -11,248 +11,247 @@ ## 完整示例 ```ts -import camera from '@ohos.multimedia.camera' -import image from '@ohos.multimedia.image' -import media from '@ohos.multimedia.media' +import camera from '@ohos.multimedia.camera'; +import image from '@ohos.multimedia.image'; +import media from '@ohos.multimedia.media'; // 创建CameraManager对象 -context: any = getContext(this) -let cameraManager = camera.getCameraManager(this.context) +let context: Context = getContext(this); // [各类Context的获取方式](../application-models/application-context-stage.md) +let cameraManager: camera.CameraManager = camera.getCameraManager(context); if (!cameraManager) { - console.error("camera.getCameraManager error") - return; + console.error("camera.getCameraManager error"); + return; } // 创建ModeManager对象 -context: any = getContext(this) -let modeManager = camera.getModeManager(this.context) +let modeManager: camera.ModeManager = camera.getModeManager(context); if (!cameraManager) { - console.error("camera.getModeManager error") - return; + console.error("camera.getModeManager error"); + return; } // 监听相机状态变化 -cameraManager.on('cameraStatus', (err, cameraStatusInfo) => { - console.info(`camera : ${cameraStatusInfo.camera.cameraId}`); - console.info(`status: ${cameraStatusInfo.status}`); -}) +cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { + console.info(`camera : ${cameraStatusInfo.camera.cameraId}`); + console.info(`status: ${cameraStatusInfo.status}`); +}); // 获取相机列表 -let cameraArray = cameraManager.getSupportedCameras(); +let cameraArray: Array = cameraManager.getSupportedCameras(); if (cameraArray.length <= 0) { - console.error("cameraManager.getSupportedCameras error") - return; + console.error("cameraManager.getSupportedCameras error"); + return; } for (let index = 0; index < cameraArray.length; index++) { - console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID - console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 - console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 - console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 + console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID + console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 + console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 + console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 } // 获取模式列表 -let cameraModeArray = modeManager.getSupportedModes(cameraArray[0]); +let cameraModeArray: Array = modeManager.getSupportedModes(cameraArray[0]); if (cameraModeArray.length <= 0) { - console.error("modeManager.getSupportedModes error") - return; + console.error("modeManager.getSupportedModes error"); + return; } // 创建相机输入流 -let cameraInput +let cameraInput: camera.CameraInput; try { - cameraInput = cameraManager.createCameraInput(cameraArray[0]); + cameraInput = cameraManager.createCameraInput(cameraArray[0]); } catch (error) { - console.error('Failed to createCameraInput errorCode = ' + error.code); + console.error('Failed to createCameraInput errorCode = ' + error.code); } // 监听cameraInput错误信息 -let cameraDevice = cameraArray[0]; -cameraInput.on('error', cameraDevice, (error) => { - console.info(`Camera input error code: ${error.code}`); +let cameraDevice: camera.CameraDevice = cameraArray[0]; +cameraInput.on('error', cameraDevice, (error: BusinessError) => { + console.info(`Camera input error code: ${error.code}`); }) // 打开相机 await cameraInput.open(); // 获取当前模式相机设备支持的输出流能力 -let cameraOutputCap = modeManager.getSupportedOutputCapability(cameraArray[0], cameraModeArray[0]); +let cameraOutputCap: camera.CameraOutputCapability = modeManager.getSupportedOutputCapability(cameraArray[0], cameraModeArray[0]); if (!cameraOutputCap) { - console.error("modeManager.getSupportedOutputCapability error") - return; + console.error("modeManager.getSupportedOutputCapability error") + return; } console.info("outputCapability: " + JSON.stringify(cameraOutputCap)); -let previewProfilesArray = cameraOutputCap.previewProfiles; +let previewProfilesArray: Array = cameraOutputCap.previewProfiles; if (!previewProfilesArray) { - console.error("createOutput previewProfilesArray == null || undefined") + console.error("createOutput previewProfilesArray == null || undefined") } -let photoProfilesArray = cameraOutputCap.photoProfiles; +let photoProfilesArray: Array = cameraOutputCap.photoProfiles; if (!photoProfilesArray) { - console.error("createOutput photoProfilesArray == null || undefined") + console.error("createOutput photoProfilesArray == null || undefined") } // 创建预览输出流,其中参数 surfaceId 参考上文 XComponent 组件,预览流为XComponent组件提供的surface -let previewOutput +let previewOutput: camera.PreviewOutput; try { - previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId) + previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId); } catch (error) { - console.error("Failed to create the PreviewOutput instance.") + console.error("Failed to create the PreviewOutput instance."); } // 监听预览输出错误信息 -previewOutput.on('error', (error) => { - console.info(`Preview output error code: ${error.code}`); +previewOutput.on('error', (error: BusinessError) => { + console.info(`Preview output error code: ${error.code}`); }) // 创建ImageReceiver对象,并设置照片参数:分辨率大小是根据前面 photoProfilesArray 获取的当前设备所支持的拍照分辨率大小去设置 -let imageReceiver = await image.createImageReceiver(1920, 1080, 4, 8) +let imageReceiver: image.ImageReceiver = await image.createImageReceiver(1920, 1080, 4, 8) // 获取照片显示SurfaceId -let photoSurfaceId = await imageReceiver.getReceivingSurfaceId() +let photoSurfaceId: string = await imageReceiver.getReceivingSurfaceId() // 创建拍照输出流 -let photoOutput +let photoOutput: camera.PhotoOutput; try { - photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId) + photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId); } catch (error) { - console.error('Failed to createPhotoOutput errorCode = ' + error.code); + console.error('Failed to createPhotoOutput errorCode = ' + error.code); } //创建portrait会话 -let portraitSession +let portraitSession: camera.CaptureSession; try { - portraitSession = modeManager.createCaptureSession(cameraModeArray[0]) + portraitSession = modeManager.createCaptureSession(cameraModeArray[0]); } catch (error) { - console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); + console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); } // 监听portraitSession错误信息 -portraitSession.on('error', (error) => { - console.info(`Capture session error code: ${error.code}`); -}) +portraitSession.on('error', (error: BusinessError) => { + console.info(`Capture session error code: ${error.code}`); +}); // 开始配置会话 try { - portraitSession.beginConfig() + portraitSession.beginConfig(); } catch (error) { - console.error('Failed to beginConfig. errorCode = ' + error.code); + console.error('Failed to beginConfig. errorCode = ' + error.code); } // 向会话中添加相机输入流 try { - portraitSession.addInput(cameraInput) + portraitSession.addInput(cameraInput); } catch (error) { - console.error('Failed to addInput. errorCode = ' + error.code); + console.error('Failed to addInput. errorCode = ' + error.code); } // 向会话中添加预览输出流 try { - portraitSession.addOutput(previewOutput) + portraitSession.addOutput(previewOutput); } catch (error) { - console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); } // 向会话中添加拍照输出流 try { - portraitSession.addOutput(photoOutput) + portraitSession.addOutput(photoOutput); } catch (error) { - console.error('Failed to addOutput(photoOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(photoOutput). errorCode = ' + error.code); } // 提交会话配置 -await portraitSession.commitConfig() +await portraitSession.commitConfig(); // 启动会话 await portraitSession.start().then(() => { - console.info('Promise returned to indicate the session start success.'); + console.info('Promise returned to indicate the session start success.'); }) // 获取支持的美颜类型 -let beautyTypes +let beautyTypes: Array; try { - beautyTypes = portraitSession.getSupportedBeautyTypes() + beautyTypes = portraitSession.getSupportedBeautyTypes(); } catch (error) { - console.error('Failed to get the beauty types. errorCode = ' + error.code); + console.error('Failed to get the beauty types. errorCode = ' + error.code); } // 获取支持的美颜类型对应的美颜强度范围 -let beautyRanges +let beautyRanges: Array; try { - beautyRanges = portraitSession.getSupportedBeautyRanges(beautyTypes[0]) + beautyRanges = portraitSession.getSupportedBeautyRanges(beautyTypes[0]); } catch (error) { - console.error('Failed to get the beauty types ranges. errorCode = ' + error.code); + console.error('Failed to get the beauty types ranges. errorCode = ' + error.code); } // 设置美颜类型及对应的美颜强度 try { - portraitSession.setBeauty(beautyTypes[0], beautyRanges[0]) + portraitSession.setBeauty(beautyTypes[0], beautyRanges[0]); } catch (error) { - console.error('Failed to set the beauty type value. errorCode = ' + error.code); + console.error('Failed to set the beauty type value. errorCode = ' + error.code); } // 获取已经设置的美颜类型对应的美颜强度 -let beautyLevel +let beautyLevel: number; try { - beautyLevel = portraitSession.getBeauty(beautyTypes[0]) + beautyLevel = portraitSession.getBeauty(beautyTypes[0]); } catch (error) { - console.error('Failed to get the beauty type value. errorCode = ' + error.code); + console.error('Failed to get the beauty type value. errorCode = ' + error.code); } // 获取支持的滤镜类型 -let filterTypes +let filterTypes: Array; try { - filterTypes = portraitSession.getSupportedFilters() + filterTypes = portraitSession.getSupportedFilters(); } catch (error) { - console.error('Failed to get the filter types. errorCode = ' + error.code); + console.error('Failed to get the filter types. errorCode = ' + error.code); } // 设置滤镜类型 try { - portraitSession.setFilter(filterTypes[0]) + portraitSession.setFilter(filterTypes[0]); } catch (error) { - console.error('Failed to set the filter type value. errorCode = ' + error.code); + console.error('Failed to set the filter type value. errorCode = ' + error.code); } // 获取已经设置的滤镜类型 -let filter +let filter: number; try { - filter = portraitSession.getFilter() + filter = portraitSession.getFilter(); } catch (error) { - console.error('Failed to get the filter type value. errorCode = ' + error.code); + console.error('Failed to get the filter type value. errorCode = ' + error.code); } // 获取支持的虚化类型 -let portraitTypes +let portraitTypes: Array; try { - portraitTypes = portraitSession.getSupportedPortraitEffects() + portraitTypes = portraitSession.getSupportedPortraitEffects(); } catch (error) { - console.error('Failed to get the portrait effects types. errorCode = ' + error.code); + console.error('Failed to get the portrait effects types. errorCode = ' + error.code); } // 设置虚化类型 try { - portraitSession.setPortraitEffect(portraitTypes[0]) + portraitSession.setPortraitEffect(portraitTypes[0]); } catch (error) { - console.error('Failed to set the portrait effects value. errorCode = ' + error.code); + console.error('Failed to set the portrait effects value. errorCode = ' + error.code); } // 获取已经设置的虚化类型 -let effect +let effect: camera.PortraitEffect; try { - effect = portraitSession.getPortraitEffect() + effect = portraitSession.getPortraitEffect(); } catch (error) { - console.error('Failed to get the portrait effects value. errorCode = ' + error.code); + console.error('Failed to get the portrait effects value. errorCode = ' + error.code); } // 使用当前拍照设置进行拍照 -photoOutput.capture(settings, async (err) => { - if (err) { - console.error('Failed to capture the photo ${err.message}'); - return; - } - console.info('Callback invoked to indicate the photo capture request success.'); +photoOutput.capture(settings, async (err: BusinessError) => { + if (err) { + console.error('Failed to capture the photo ${err.message}'); + return; + } + console.info('Callback invoked to indicate the photo capture request success.'); }); // 停止当前会话 -portraitSession.stop() +portraitSession.stop(); // 释放相机输入流 -cameraInput.close() +cameraInput.close(); // 释放预览输出流 -previewOutput.release() +previewOutput.release(); // 释放拍照输出流 -photoOutput.release() +photoOutput.release(); // 释放会话 -portraitSession.release() +portraitSession.release(); // 会话置空 -portraitSession = null +portraitSession = null; ``` diff --git a/zh-cn/application-dev/media/camera-performance-improvement.md b/zh-cn/application-dev/media/camera-performance-improvement.md index dd8310024d..ccf0fa46bb 100644 --- a/zh-cn/application-dev/media/camera-performance-improvement.md +++ b/zh-cn/application-dev/media/camera-performance-improvement.md @@ -36,10 +36,10 @@ import camera from '@ohos.multimedia.camera'; function async preview(context: Context, cameraInfo: camera.Device, previewProfile: camera.Profile, photoProfile: camera.Profile, surfaceId: string): Promise { const cameraManager: camera.CameraManager = camera.getCameraManager(context); - const cameraInput camera.CameraInput = await cameraManager.createCameraInput(cameraInfo) + const cameraInput camera.CameraInput = await cameraManager.createCameraInput(cameraInfo); const previewOutput: camera.PreviewOutput = await cameraManager.createDeferredPreviewOutput(previewProfile); const photoOutput: camera.PhotoOutput = await cameraManager.createPhotoOutput(photoProfile); - const session: camera.CaptureSession = await this.mCameraManager.createCaptureSession(); + const session: camera.CaptureSession = await mCameraManager.createCaptureSession(); await session.beginConfig(); await session.addInput(cameraInput); await session.addOutput(previewOutput); @@ -80,32 +80,32 @@ function async preview(context: Context, cameraInfo: camera.Device, previewProfi ![](figures/quick-thumbnail-sequence-diagram.png) ```js -import camera from '@ohos.multimedia.camera' - -this.cameraManager = camera.getCameraManager(globalThis.abilityContext); -let cameras = this.cameraManager.getSupportedCameras() +import camera from '@ohos.multimedia.camera'; +let context: Context = getContext(this); // [各类Context的获取方式](../application-models/application-context-stage.md) +let cameraManager: camera.CameraManager = camera.getCameraManager(context); +let cameras: Array = cameraManager.getSupportedCameras(); // 创建CaptureSession实例 -this.captureSession = await this.cameraManager.createCaptureSession() +let captureSession: camera.CaptureSession = await cameraManager.createCaptureSession(); // 开始配置会话 -await this.captureSession.beginConfig() +await captureSession.beginConfig(); // 把CameraInput加入到会话 -this.cameraInput = await this.cameraManager.createCameraInput(cameras[0]) -await this.cameraInput.open() -await this.captureSession.addInput(this.cameraInput) +let cameraInput: camera.CameraInput = await cameraManager.createCameraInput(cameras[0]); +await cameraInput.open(); +await captureSession.addInput(cameraInput); // 把PhotoOutPut加入到会话 -this.photoOutPut = await this.cameraManager.createPhotoOutput(photoProfile, surfaceId) -await this.captureSession.addOutput(this.photoOutPut) -boolean isSupported = this.photoOutPut.isQuickThumbnailSupported() +let photoOutPut: camera.PhotoOutput = await cameraManager.createPhotoOutput(photoProfile, surfaceId); +await captureSession.addOutput(photoOutPut); +let isSupported: boolean = photoOutPut.isQuickThumbnailSupported(); if (isSupported) { - // 使能快速缩略图 - this.photoOutPut.enableQuickThumbnail(true) - this.photoOutPut.on('quickThumbnail', (err, pixelmap) => { + // 使能快速缩略图 + photoOutPut.enableQuickThumbnail(true); + photoOutPut.on('quickThumbnail', (err: BusinessError, pixelmap: image.PixelMap) => { if (err || pixelmap === undefined) { - Logger.error(this.tag, 'photoOutPut on thumbnail failed ') - return + console.error('photoOutPut on thumbnail failed'); + return; } // 显示或保存pixelmap - this.showOrSavePicture(pixelmap) + showOrSavePicture(pixelmap); }) } ``` @@ -138,13 +138,13 @@ if (isSupported) { - **桌面应用** ```js - import camera from '@ohos.multimedia.camera' + import camera from '@ohos.multimedia.camera'; - this.cameraManager = camera.getCameraManager(globalThis.abilityContext); + let cameraManager: camera.CameraManager = camera.getCameraManager(globalThis.abilityContext); try { - this.cameraManager.prelaunch(); + cameraManager.prelaunch(); } catch (error) { - console.error(`catch error: Code: ${error.code}, message: ${error.message}`) + console.error(`catch error: Code: ${error.code}, message: ${error.message}`); } ``` @@ -155,15 +155,15 @@ if (isSupported) { 具体申请方式及校验方式,请参考[访问控制授权申请指导](../security/accesstoken-guidelines.md)。 ```js - import camera from '@ohos.multimedia.camera' + import camera from '@ohos.multimedia.camera'; - this.cameraManager = camera.getCameraManager(globalThis.abilityContext); - let cameras = this.cameraManager.getSupportedCameras() - if(this.cameraManager.isPrelaunchSupported(cameras[0])) { + cameraManager: camera.CameraManager = camera.getCameraManager(globalThis.abilityContext); + let cameras: Array = cameraManager.getSupportedCameras(); + if(cameraManager.isPrelaunchSupported(cameras[0])) { try { - this.cameraManager.setPrelaunchConfig({cameraDevice: cameras[0]}); + cameraManager.setPrelaunchConfig({cameraDevice: cameras[0]}); } catch (error) { - console.error(`catch error: Code: ${error.code}, message: ${error.message}`) + console.error(`catch error: Code: ${error.code}, message: ${error.message}`); } } ``` diff --git a/zh-cn/application-dev/media/camera-preview.md b/zh-cn/application-dev/media/camera-preview.md index 2836389c3b..84724303c0 100644 --- a/zh-cn/application-dev/media/camera-preview.md +++ b/zh-cn/application-dev/media/camera-preview.md @@ -14,36 +14,36 @@ // 创建XComponentController mXComponentController: XComponentController = new XComponentController; build() { - Flex() { - // 创建XComponent - XComponent({ - id: '', - type: 'surface', - libraryname: '', - controller: this.mXComponentController - }) - .onLoad(() => { - // 设置Surface宽高(1920*1080),预览尺寸设置参考前面 previewProfilesArray 获取的当前设备所支持的预览分辨率大小去设置 - this.mXComponentController.setXComponentSurfaceSize({surfaceWidth:1920,surfaceHeight:1080}); - // 获取Surface ID - globalThis.surfaceId = this.mXComponentController.getXComponentSurfaceId(); - }) - .width('1920px') - .height('1080px') - } + Flex() { + // 创建XComponent + XComponent({ + id: '', + type: 'surface', + libraryname: '', + controller: this.mXComponentController + }) + .onLoad(() => { + // 设置Surface宽高(1920*1080),预览尺寸设置参考前面 previewProfilesArray 获取的当前设备所支持的预览分辨率大小去设置 + this.mXComponentController.setXComponentSurfaceSize({surfaceWidth:1920,surfaceHeight:1080}); + // 获取Surface ID + globalThis.surfaceId = this.mXComponentController.getXComponentSurfaceId(); + }) + .width('1920px') + .height('1080px') + } } ``` 2. 通过CameraOutputCapability类中的previewProfiles()方法获取当前设备支持的预览能力,返回previewProfilesArray数组 。通过createPreviewOutput()方法创建预览输出流,其中,createPreviewOutput()方法中的两个参数分别是previewProfilesArray数组中的第一项和步骤一中获取的surfaceId。 ```ts - let previewProfilesArray = cameraOutputCapability.previewProfiles; - let previewOutput; + let previewProfilesArray: Array = cameraOutputCapability.previewProfiles; + let previewOutput: camera.PreviewOutput; try { - previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId); + previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId); } catch (error) { - console.error("Failed to create the PreviewOutput instance." + error); + console.error("Failed to create the PreviewOutput instance." + error); } ``` @@ -51,9 +51,9 @@ ```ts previewOutput.start().then(() => { - console.info('Callback returned with previewOutput started.'); - }).catch((err) => { - console.info('Failed to previewOutput start '+ err.code); + console.info('Callback returned with previewOutput started.'); + }).catch((err: BusinessError) => { + console.info('Failed to previewOutput start '+ err.code); }); ``` @@ -66,22 +66,22 @@ ```ts previewOutput.on('frameStart', () => { - console.info('Preview frame started'); - }) + console.info('Preview frame started'); + }); ``` - 通过注册固定的frameEnd回调函数获取监听预览结束结果,previewOutput创建成功时即可监听,预览完成最后一帧时触发,有该事件返回结果则认为预览流已结束。 ```ts previewOutput.on('frameEnd', () => { - console.info('Preview frame ended'); - }) + console.info('Preview frame ended'); + }); ``` - 通过注册固定的error回调函数获取监听预览输出错误结果,callback返回预览输出接口使用错误时对应的错误码,错误码类型参见[CameraErrorCode](../reference/apis/js-apis-camera.md#cameraerrorcode)。 ```ts - previewOutput.on('error', (previewOutputError) => { - console.info(`Preview output error code: ${previewOutputError.code}`); - }) + previewOutput.on('error', (previewOutputError: BusinessError) => { + console.info(`Preview output error code: ${previewOutputError.code}`); + }); ``` diff --git a/zh-cn/application-dev/media/camera-recording-case.md b/zh-cn/application-dev/media/camera-recording-case.md index a1f980fd2a..ae37b4db5d 100644 --- a/zh-cn/application-dev/media/camera-recording-case.md +++ b/zh-cn/application-dev/media/camera-recording-case.md @@ -10,238 +10,238 @@ ## 完整示例 ```ts -import camera from '@ohos.multimedia.camera' -import media from '@ohos.multimedia.media' +import camera from '@ohos.multimedia.camera'; +import media from '@ohos.multimedia.media'; // 创建CameraManager对象 -context: any = getContext(this) -let cameraManager = camera.getCameraManager(this.context) +let context: Context = getContext(this); // [各类Context的获取方式](../application-models/application-context-stage.md) +let cameraManager: camera.CameraManager = camera.getCameraManager(context); if (!cameraManager) { - console.error("camera.getCameraManager error") - return; + console.error("camera.getCameraManager error"); + return; } // 监听相机状态变化 -cameraManager.on('cameraStatus', (err, cameraStatusInfo) => { - console.log(`camera : ${cameraStatusInfo.camera.cameraId}`); - console.log(`status: ${cameraStatusInfo.status}`); -}) +cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { + console.log(`camera : ${cameraStatusInfo.camera.cameraId}`); + console.log(`status: ${cameraStatusInfo.status}`); +}); // 获取相机设备支持的输出流能力 -let cameraOutputCap = cameraManager.getSupportedOutputCapability(cameraArray[0]); +let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0]); if (!cameraOutputCap) { - console.error("cameraManager.getSupportedOutputCapability error") - return; + console.error("cameraManager.getSupportedOutputCapability error") + return; } console.log("outputCapability: " + JSON.stringify(cameraOutputCap)); -let previewProfilesArray = cameraOutputCap.previewProfiles; +let previewProfilesArray: Array = cameraOutputCap.previewProfiles; if (!previewProfilesArray) { - console.error("createOutput previewProfilesArray == null || undefined") + console.error("createOutput previewProfilesArray == null || undefined"); } -let photoProfilesArray = cameraOutputCap.photoProfiles; +let photoProfilesArray: Array = cameraOutputCap.photoProfiles; if (!photoProfilesArray) { - console.error("createOutput photoProfilesArray == null || undefined") + console.error("createOutput photoProfilesArray == null || undefined"); } -let videoProfilesArray = cameraOutputCap.videoProfiles; +let videoProfilesArray: Array = cameraOutputCap.videoProfiles; if (!videoProfilesArray) { - console.error("createOutput videoProfilesArray == null || undefined") + console.error("createOutput videoProfilesArray == null || undefined"); } -let metadataObjectTypesArray = cameraOutputCap.supportedMetadataObjectTypes; +let metadataObjectTypesArray: Array = cameraOutputCap.supportedMetadataObjectTypes; if (!metadataObjectTypesArray) { - console.error("createOutput metadataObjectTypesArray == null || undefined") + console.error("createOutput metadataObjectTypesArray == null || undefined"); } // 配置参数以实际硬件设备支持的范围为准 let AVRecorderProfile = { - audioBitrate : 48000, - audioChannels : 2, - audioCodec : media.CodecMimeType.AUDIO_AAC, - audioSampleRate : 48000, - fileFormat : media.ContainerFormatType.CFT_MPEG_4, - videoBitrate : 2000000, - videoCodec : media.CodecMimeType.VIDEO_MPEG4, - videoFrameWidth : 640, - videoFrameHeight : 480, - videoFrameRate : 30 -} + audioBitrate : 48000, + audioChannels : 2, + audioCodec : media.CodecMimeType.AUDIO_AAC, + audioSampleRate : 48000, + fileFormat : media.ContainerFormatType.CFT_MPEG_4, + videoBitrate : 2000000, + videoCodec : media.CodecMimeType.VIDEO_MPEG4, + videoFrameWidth : 640, + videoFrameHeight : 480, + videoFrameRate : 30 +}; let AVRecorderConfig = { - audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, - videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, - profile : AVRecorderProfile, - url : 'fd://', // 文件需先由调用者创建,赋予读写权限,将文件fd传给此参数,eg.fd://45--file:///data/media/01.mp4 - rotation : 0, // 合理值0、90、180、270,非合理值prepare接口将报错 - location : { latitude : 30, longitude : 130 } -} - -let avRecorder -media.createAVRecorder((error, recorder) => { - if (recorder != null) { - avRecorder = recorder; - console.log('createAVRecorder success'); - } else { - console.log(`createAVRecorder fail, error:${error}`); - } + audioSourceType : media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, + videoSourceType : media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, + profile : AVRecorderProfile, + url : 'fd://', // 文件需先由调用者创建,赋予读写权限,将文件fd传给此参数,eg.fd://45--file:///data/media/01.mp4 + rotation : 0, // 合理值0、90、180、270,非合理值prepare接口将报错 + location : { latitude : 30, longitude : 130 } +}; + +let avRecorder: media.AVRecorder; +media.createAVRecorder((error: BusinessError, recorder: media.AVRecorder) => { + if (recorder != null) { + avRecorder = recorder; + console.log('createAVRecorder success'); + } else { + console.log(`createAVRecorder fail, error:${error}`); + } }); -avRecorder.prepare(AVRecorderConfig, (err) => { - if (err == null) { - console.log('prepare success'); - } else { - console.log('prepare failed and error is ' + err.message); - } +avRecorder.prepare(AVRecorderConfig: media.AVRecorderConfig, (err: BusinessError) => { + if (err == null) { + console.log('prepare success'); + } else { + console.log('prepare failed and error is ' + err.message); + } }) -let videoSurfaceId = null; // 该surfaceID用于传递给相机接口创造videoOutput -avRecorder.getInputSurface((err, surfaceId) => { - if (err == null) { - console.log('getInputSurface success'); - videoSurfaceId = surfaceId; - } else { - console.log('getInputSurface failed and error is ' + err.message); - } +let videoSurfaceId: string = null; // 该surfaceID用于传递给相机接口创造videoOutput +avRecorder.getInputSurface((err: BusinessError, surfaceId: string) => { + if (err == null) { + console.log('getInputSurface success'); + videoSurfaceId = surfaceId; + } else { + console.log('getInputSurface failed and error is ' + err.message); + } }); // 创建VideoOutput对象 -let videoOutput +let videoOutput: camera.VideoOutput; try { - videoOutput = cameraManager.createVideoOutput(videoProfilesArray[0], videoSurfaceId) + videoOutput = cameraManager.createVideoOutput(videoProfilesArray[0], videoSurfaceId) } catch (error) { - console.error('Failed to create the videoOutput instance. errorCode = ' + error.code); + console.error('Failed to create the videoOutput instance. errorCode = ' + error.code); } // 监听视频输出错误信息 -videoOutput.on('error', (error) => { - console.log(`Preview output error code: ${error.code}`); -}) +videoOutput.on('error', (error: BusinessError) => { + console.log(`Preview output error code: ${error.code}`); +}); //创建会话 -let captureSession +let captureSession: camera.CaptureSession; try { - captureSession = cameraManager.createCaptureSession() + captureSession = cameraManager.createCaptureSession(); } catch (error) { - console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); + console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); } // 监听session错误信息 -captureSession.on('error', (error) => { - console.log(`Capture session error code: ${error.code}`); -}) +captureSession.on('error', (error: BusinessError) => { + console.log(`Capture session error code: ${error.code}`); +}); // 开始配置会话 try { - captureSession.beginConfig() + captureSession.beginConfig(); } catch (error) { - console.error('Failed to beginConfig. errorCode = ' + error.code); + console.error('Failed to beginConfig. errorCode = ' + error.code); } // 获取相机列表 -let cameraArray = cameraManager.getSupportedCameras(); +let cameraArray: Array = cameraManager.getSupportedCameras(); if (cameraArray.length <= 0) { - console.error("cameraManager.getSupportedCameras error") - return; + console.error("cameraManager.getSupportedCameras error") + return; } // 创建相机输入流 -let cameraInput +let cameraInput: camera.CameraInput; try { - cameraInput = cameraManager.createCameraInput(cameraArray[0]); + cameraInput = cameraManager.createCameraInput(cameraArray[0]); } catch (error) { - console.error('Failed to createCameraInput errorCode = ' + error.code); + console.error('Failed to createCameraInput errorCode = ' + error.code); } // 监听cameraInput错误信息 -let cameraDevice = cameraArray[0]; -cameraInput.on('error', cameraDevice, (error) => { - console.log(`Camera input error code: ${error.code}`); -}) +let cameraDevice: camera.CameraDevice = cameraArray[0]; +cameraInput.on('error', cameraDevice, (error: BusinessError) => { + console.log(`Camera input error code: ${error.code}`); +}); // 打开相机 await cameraInput.open(); // 向会话中添加相机输入流 try { - captureSession.addInput(cameraInput) + captureSession.addInput(cameraInput); } catch (error) { - console.error('Failed to addInput. errorCode = ' + error.code); + console.error('Failed to addInput. errorCode = ' + error.code); } // 创建预览输出流,其中参数 surfaceId 参考下面 XComponent 组件,预览流为XComponent组件提供的surface -let previewOutput +let previewOutput: camera.PreviewOutput; try { - previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId) + previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId); } catch (error) { - console.error("Failed to create the PreviewOutput instance.") + console.error("Failed to create the PreviewOutput instance.") } // 向会话中添加预览输入流 try { - captureSession.addOutput(previewOutput) + captureSession.addOutput(previewOutput); } catch (error) { - console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); } // 向会话中添加录像输出流 try { - captureSession.addOutput(videoOutput) + captureSession.addOutput(videoOutput); } catch (error) { - console.error('Failed to addOutput(videoOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(videoOutput). errorCode = ' + error.code); } // 提交会话配置 -await captureSession.commitConfig() +await captureSession.commitConfig(); // 启动会话 await captureSession.start().then(() => { - console.log('Promise returned to indicate the session start success.'); -}) + console.log('Promise returned to indicate the session start success.'); +}); // 启动录像输出流 -videoOutput.start(async (err) => { - if (err) { - console.error('Failed to start the video output ${err.message}'); - return; - } - console.log('Callback invoked to indicate the video output start success.'); +videoOutput.start(async (err: BusinessError) => { + if (err) { + console.error('Failed to start the video output ${err.message}'); + return; + } + console.log('Callback invoked to indicate the video output start success.'); }); // 开始录像 avRecorder.start().then(() => { - console.log('videoRecorder start success'); -}) + console.log('videoRecorder start success'); +}); // 停止录像输出流 -videoOutput.stop((err) => { - if (err) { - console.error('Failed to stop the video output ${err.message}'); - return; - } - console.log('Callback invoked to indicate the video output stop success.'); +videoOutput.stop((err: BusinessError) => { + if (err) { + console.error('Failed to stop the video output ${err.message}'); + return; + } + console.log('Callback invoked to indicate the video output stop success.'); }); // 停止录像 avRecorder.stop().then(() => { - console.log('stop success'); -}) + console.log('stop success'); +}); // 停止当前会话 -captureSession.stop() +captureSession.stop(); // 释放相机输入流 -cameraInput.close() +cameraInput.close(); // 释放预览输出流 -previewOutput.release() +previewOutput.release(); // 释放录像输出流 -videoOutput.release() +videoOutput.release(); // 释放会话 -captureSession.release() +captureSession.release(); // 会话置空 -captureSession = null +captureSession = null; ``` diff --git a/zh-cn/application-dev/media/camera-recording.md b/zh-cn/application-dev/media/camera-recording.md index 95b38a8bb3..3464fa1c9f 100644 --- a/zh-cn/application-dev/media/camera-recording.md +++ b/zh-cn/application-dev/media/camera-recording.md @@ -17,30 +17,30 @@ 系统提供的media接口可以创建一个录像AVRecorder实例,通过该实例的getInputSurface方法获取SurfaceId,与录像输出流做关联,处理录像输出流输出的数据。 ```ts - let AVRecorder; - media.createAVRecorder((error, recorder) => { - if (recorder != null) { - AVRecorder = recorder; - console.info('createAVRecorder success'); - } else { - console.info(`createAVRecorder fail, error:${error}`); - } + let avRecorder: media.AVRecorder; + media.createAVRecorder((error: BusinessError, recorder: media.AVRecorder) => { + if (recorder != null) { + avRecorder = recorder; + console.info('createAVRecorder success'); + } else { + console.info(`createAVRecorder fail, error:${error}`); + } }); // AVRecorderConfig可参考下一章节 - AVRecorder.prepare(AVRecorderConfig, (err) => { - if (err == null) { - console.log('prepare success'); - } else { - console.log('prepare failed and error is ' + err.message); - } - }) + avRecorder.prepare(AVRecorderConfig: media.AVRecorderConfig, (err: BusinessError) => { + if (err == null) { + console.log('prepare success'); + } else { + console.log('prepare failed and error is ' + err.message); + } + }); - let videoSurfaceId = null; - AVRecorder.getInputSurface().then((surfaceId) => { - console.info('getInputSurface success'); - videoSurfaceId = surfaceId; + let videoSurfaceId: string = null; + avRecorder.getInputSurface().then((surfaceId: string) => { + console.info('getInputSurface success'); + videoSurfaceId = surfaceId; }).catch((err) => { - console.info('getInputSurface failed and catch error is ' + err.message); + console.info('getInputSurface failed and catch error is ' + err.message); }); ``` @@ -49,43 +49,43 @@ 通过CameraOutputCapability类中的videoProfiles,可获取当前设备支持的录像输出流。然后,定义创建录像的参数,通过createVideoOutput方法创建录像输出流。 ```ts - let videoProfilesArray = cameraOutputCapability.videoProfiles; + let videoProfilesArray: Array = cameraOutputCapability.videoProfiles; if (!videoProfilesArray) { - console.error("createOutput videoProfilesArray == null || undefined"); + console.error("createOutput videoProfilesArray == null || undefined"); } // 创建视频录制的参数 let videoConfig = { - videoSourceType: media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, - profile: { - fileFormat : media.ContainerFormatType.CFT_MPEG_4, // 视频文件封装格式,只支持MP4 - videoBitrate : 100000, // 视频比特率 - videoCodec : media.CodecMimeType.VIDEO_MPEG4, // 视频文件编码格式,支持mpeg4和avc两种格式 - videoFrameWidth : 640, // 视频分辨率的宽 - videoFrameHeight : 480, // 视频分辨率的高 - videoFrameRate : 30 // 视频帧率 - }, - url: 'fd://35', - rotation: 90 // 90°为默认竖屏显示角度,如果由于设备原因或应用期望以其他方式显示等原因,请根据实际情况调整该参数 + videoSourceType: media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, + profile: { + fileFormat : media.ContainerFormatType.CFT_MPEG_4, // 视频文件封装格式,只支持MP4 + videoBitrate : 100000, // 视频比特率 + videoCodec : media.CodecMimeType.VIDEO_MPEG4, // 视频文件编码格式,支持mpeg4和avc两种格式 + videoFrameWidth : 640, // 视频分辨率的宽 + videoFrameHeight : 480, // 视频分辨率的高 + videoFrameRate : 30 // 视频帧率 + }, + url: 'fd://35', + rotation: 90 // 90°为默认竖屏显示角度,如果由于设备原因或应用期望以其他方式显示等原因,请根据实际情况调整该参数 } // 创建avRecorder - let avRecorder; - media.createAVRecorder((error, recorder) => { + let avRecorder: media.AVRecorder; + media.createAVRecorder((error: BusinessError, recorder: media.AVRecorder) => { if (recorder != null) { - avRecorder = recorder; - console.info('createAVRecorder success'); + avRecorder = recorder; + console.info('createAVRecorder success'); } else { - console.info(`createAVRecorder fail, error:${error}`); + console.info(`createAVRecorder fail, error:${error}`); } }); // 设置视频录制的参数 avRecorder.prepare(videoConfig); // 创建VideoOutput对象 - let videoOutput; + let videoOutput: camera.VideoOutput; try { - videoOutput = cameraManager.createVideoOutput(videoProfilesArray[0], videoSurfaceId); + videoOutput = cameraManager.createVideoOutput(videoProfilesArray[0], videoSurfaceId); } catch (error) { - console.error('Failed to create the videoOutput instance. errorCode = ' + error.code); + console.error('Failed to create the videoOutput instance. errorCode = ' + error.code); } ``` @@ -93,17 +93,17 @@ 先通过videoOutput的start方法启动录像输出流,再通过avRecorder的start方法开始录像。 - ``` - videoOutput.start(async (err) => { - if (err) { - console.error('Failed to start the video output ${err.message}'); - return; - } - console.info('Callback invoked to indicate the video output start success.'); + ```ts + videoOutput.start(async (err: BusinessError) => { + if (err) { + console.error('Failed to start the video output ${err.message}'); + return; + } + console.info('Callback invoked to indicate the video output start success.'); }); avRecorder.start().then(() => { - console.info('avRecorder start success'); + console.info('avRecorder start success'); }); ``` @@ -113,15 +113,15 @@ ```ts videoRecorder.stop().then(() => { - console.info('stop success'); + console.info('stop success'); }); - videoOutput.stop((err) => { - if (err) { - console.error('Failed to stop the video output ${err.message}'); - return; - } - console.info('Callback invoked to indicate the video output stop success.'); + videoOutput.stop((err: BusinessError) => { + if (err) { + console.error('Failed to stop the video output ${err.message}'); + return; + } + console.info('Callback invoked to indicate the video output stop success.'); }); ``` @@ -134,22 +134,22 @@ ```ts videoOutput.on('frameStart', () => { - console.info('Video frame started'); - }) + console.info('Video frame started'); + }); ``` - 通过注册固定的frameEnd回调函数获取监听录像结束结果,videoOutput创建成功时即可监听,录像完成最后一帧时触发,有该事件返回结果则认为录像流已结束。 ```ts videoOutput.on('frameEnd', () => { - console.info('Video frame ended'); - }) + console.info('Video frame ended'); + }); ``` - 通过注册固定的error回调函数获取监听录像输出错误结果,callback返回预览输出接口使用错误时对应的错误码,错误码类型参见[CameraErrorCode](../reference/apis/js-apis-camera.md#cameraerrorcode)。 ```ts - videoOutput.on('error', (error) => { - console.info(`Video output error code: ${error.code}`); - }) + videoOutput.on('error', (error: BusinessError) => { + console.info(`Video output error code: ${error.code}`); + }); ``` diff --git a/zh-cn/application-dev/media/camera-session-management.md b/zh-cn/application-dev/media/camera-session-management.md index fdef64d33f..1bddd3c805 100644 --- a/zh-cn/application-dev/media/camera-session-management.md +++ b/zh-cn/application-dev/media/camera-session-management.md @@ -18,11 +18,11 @@ 1. 调用cameraManager类中的createCaptureSession()方法创建一个会话。 ```ts - let captureSession; + let captureSession: camera.CaptureSession; try { - captureSession = cameraManager.createCaptureSession(); + captureSession = cameraManager.createCaptureSession(); } catch (error) { - console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); + console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); } ``` @@ -30,9 +30,9 @@ ```ts try { - captureSession.beginConfig(); + captureSession.beginConfig(); } catch (error) { - console.error('Failed to beginConfig. errorCode = ' + error.code); + console.error('Failed to beginConfig. errorCode = ' + error.code); } ``` @@ -42,24 +42,24 @@ ```ts try { - captureSession.addInput(cameraInput); + captureSession.addInput(cameraInput); } catch (error) { - console.error('Failed to addInput. errorCode = ' + error.code); + console.error('Failed to addInput. errorCode = ' + error.code); } try { - captureSession.addOutput(previewOutput); + captureSession.addOutput(previewOutput); } catch (error) { - console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); } try { - captureSession.addOutput(photoOutput); + captureSession.addOutput(photoOutput); } catch (error) { - console.error('Failed to addOutput(photoOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(photoOutput). errorCode = ' + error.code); } - await captureSession.commitConfig() ; + await captureSession.commitConfig(); await captureSession.start().then(() => { - console.info('Promise returned to indicate the session start success.'); - }) + console.info('Promise returned to indicate the session start success.'); + }); ``` 4. 会话控制。调用captureSession类中的stop()方法可以停止当前会话。调用removeOutput()和addOutput()方法可以完成会话切换控制。以下示例代码以移除拍照流photoOutput,添加视频流videoOutput为例,完成了拍照到录像的切换。 @@ -67,20 +67,20 @@ ```ts await captureSession.stop(); try { - captureSession.beginConfig(); + captureSession.beginConfig(); } catch (error) { - console.error('Failed to beginConfig. errorCode = ' + error.code); + console.error('Failed to beginConfig. errorCode = ' + error.code); } // 从会话中移除拍照输出流 try { - captureSession.removeOutput(photoOutput); + captureSession.removeOutput(photoOutput); } catch (error) { - console.error('Failed to removeOutput(photoOutput). errorCode = ' + error.code); + console.error('Failed to removeOutput(photoOutput). errorCode = ' + error.code); } // 向会话中添加视频输出流 try { - captureSession.addOutput(videoOutput); + captureSession.addOutput(videoOutput); } catch (error) { - console.error('Failed to addOutput(videoOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(videoOutput). errorCode = ' + error.code); } ``` diff --git a/zh-cn/application-dev/media/camera-shooting-case.md b/zh-cn/application-dev/media/camera-shooting-case.md index c8f307cc35..103921ac5f 100644 --- a/zh-cn/application-dev/media/camera-shooting-case.md +++ b/zh-cn/application-dev/media/camera-shooting-case.md @@ -9,232 +9,232 @@ ## 完整示例 ```ts -import camera from '@ohos.multimedia.camera' -import image from '@ohos.multimedia.image' -import media from '@ohos.multimedia.media' +import camera from '@ohos.multimedia.camera'; +import image from '@ohos.multimedia.image'; +import media from '@ohos.multimedia.media'; // 创建CameraManager对象 -context: any = getContext(this) -let cameraManager = camera.getCameraManager(this.context) +let context: Context = getContext(this); // [各类Context的获取方式](../application-models/application-context-stage.md) +let cameraManager: camera.CameraManager = camera.getCameraManager(context); if (!cameraManager) { - console.error("camera.getCameraManager error") - return; + console.error("camera.getCameraManager error"); + return; } // 监听相机状态变化 -cameraManager.on('cameraStatus', (err, cameraStatusInfo) => { - console.info(`camera : ${cameraStatusInfo.camera.cameraId}`); - console.info(`status: ${cameraStatusInfo.status}`); -}) +cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { + console.info(`camera : ${cameraStatusInfo.camera.cameraId}`); + console.info(`status: ${cameraStatusInfo.status}`); +}); // 获取相机列表 -let cameraArray = cameraManager.getSupportedCameras(); +let cameraArray: Array = cameraManager.getSupportedCameras(); if (cameraArray.length <= 0) { - console.error("cameraManager.getSupportedCameras error") - return; + console.error("cameraManager.getSupportedCameras error"); + return; } for (let index = 0; index < cameraArray.length; index++) { - console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID - console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 - console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 - console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 + console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID + console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置 + console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型 + console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型 } // 创建相机输入流 -let cameraInput +let cameraInput: camera.CameraInput; try { - cameraInput = cameraManager.createCameraInput(cameraArray[0]); + cameraInput = cameraManager.createCameraInput(cameraArray[0]); } catch (error) { - console.error('Failed to createCameraInput errorCode = ' + error.code); + console.error('Failed to createCameraInput errorCode = ' + error.code); } // 监听cameraInput错误信息 -let cameraDevice = cameraArray[0]; -cameraInput.on('error', cameraDevice, (error) => { - console.info(`Camera input error code: ${error.code}`); +let cameraDevice: camera.CameraDevice = cameraArray[0]; +cameraInput.on('error', cameraDevice, (error: BusinessError) => { + console.info(`Camera input error code: ${error.code}`); }) // 打开相机 await cameraInput.open(); // 获取相机设备支持的输出流能力 -let cameraOutputCap = cameraManager.getSupportedOutputCapability(cameraArray[0]); +let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0]); if (!cameraOutputCap) { - console.error("cameraManager.getSupportedOutputCapability error") - return; + console.error("cameraManager.getSupportedOutputCapability error"); + return; } console.info("outputCapability: " + JSON.stringify(cameraOutputCap)); -let previewProfilesArray = cameraOutputCap.previewProfiles; +let previewProfilesArray: Array = cameraOutputCap.previewProfiles; if (!previewProfilesArray) { - console.error("createOutput previewProfilesArray == null || undefined") + console.error("createOutput previewProfilesArray == null || undefined"); } -let photoProfilesArray = cameraOutputCap.photoProfiles; +let photoProfilesArray: Array = cameraOutputCap.photoProfiles; if (!photoProfilesArray) { - console.error("createOutput photoProfilesArray == null || undefined") + console.error("createOutput photoProfilesArray == null || undefined"); } // 创建预览输出流,其中参数 surfaceId 参考上文 XComponent 组件,预览流为XComponent组件提供的surface -let previewOutput +let previewOutput: camera.PreviewOutput; try { - previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId) + previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId); } catch (error) { - console.error("Failed to create the PreviewOutput instance.") + console.error("Failed to create the PreviewOutput instance."); } // 监听预览输出错误信息 -previewOutput.on('error', (error) => { - console.info(`Preview output error code: ${error.code}`); -}) +previewOutput.on('error', (error: BusinessError) => { + console.info(`Preview output error code: ${error.code}`); +}); // 创建ImageReceiver对象,并设置照片参数:分辨率大小是根据前面 photoProfilesArray 获取的当前设备所支持的拍照分辨率大小去设置 -let imageReceiver = await image.createImageReceiver(1920, 1080, 4, 8) +let imageReceiver: image.ImageReceiver = await image.createImageReceiver(1920, 1080, 4, 8); // 获取照片显示SurfaceId -let photoSurfaceId = await imageReceiver.getReceivingSurfaceId() +let photoSurfaceId: string = await imageReceiver.getReceivingSurfaceId(); // 创建拍照输出流 -let photoOutput +let photoOutput: camera.PhotoOutput; try { - photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId) + photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId); } catch (error) { - console.error('Failed to createPhotoOutput errorCode = ' + error.code); + console.error('Failed to createPhotoOutput errorCode = ' + error.code); } //创建会话 -let captureSession +let captureSession: camera.CaptureSession; try { - captureSession = cameraManager.createCaptureSession() + captureSession = cameraManager.createCaptureSession(); } catch (error) { - console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); + console.error('Failed to create the CaptureSession instance. errorCode = ' + error.code); } // 监听session错误信息 -captureSession.on('error', (error) => { - console.info(`Capture session error code: ${error.code}`); -}) +captureSession.on('error', (error: BusinessError) => { + console.info(`Capture session error code: ${error.code}`); +}); // 开始配置会话 try { - captureSession.beginConfig() + captureSession.beginConfig(); } catch (error) { - console.error('Failed to beginConfig. errorCode = ' + error.code); + console.error('Failed to beginConfig. errorCode = ' + error.code); } // 向会话中添加相机输入流 try { - captureSession.addInput(cameraInput) + captureSession.addInput(cameraInput); } catch (error) { - console.error('Failed to addInput. errorCode = ' + error.code); + console.error('Failed to addInput. errorCode = ' + error.code); } // 向会话中添加预览输出流 try { - captureSession.addOutput(previewOutput) + captureSession.addOutput(previewOutput); } catch (error) { - console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(previewOutput). errorCode = ' + error.code); } // 向会话中添加拍照输出流 try { - captureSession.addOutput(photoOutput) + captureSession.addOutput(photoOutput); } catch (error) { - console.error('Failed to addOutput(photoOutput). errorCode = ' + error.code); + console.error('Failed to addOutput(photoOutput). errorCode = ' + error.code); } // 提交会话配置 -await captureSession.commitConfig() +await captureSession.commitConfig(); // 启动会话 await captureSession.start().then(() => { - console.info('Promise returned to indicate the session start success.'); -}) + console.info('Promise returned to indicate the session start success.'); +}); // 判断设备是否支持闪光灯 -let flashStatus +let flashStatus: boolean; try { - flashStatus = captureSession.hasFlash() + flashStatus = captureSession.hasFlash(); } catch (error) { - console.error('Failed to hasFlash. errorCode = ' + error.code); + console.error('Failed to hasFlash. errorCode = ' + error.code); } console.info('Promise returned with the flash light support status:' + flashStatus); if (flashStatus) { - // 判断是否支持自动闪光灯模式 - let flashModeStatus + // 判断是否支持自动闪光灯模式 + let flashModeStatus: boolean; + try { + let status: boolean = captureSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO); + flashModeStatus = status; + } catch (error) { + console.error('Failed to check whether the flash mode is supported. errorCode = ' + error.code); + } + if(flashModeStatus) { + // 设置自动闪光灯模式 try { - let status = captureSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO) - flashModeStatus = status + captureSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO); } catch (error) { - console.error('Failed to check whether the flash mode is supported. errorCode = ' + error.code); - } - if(flashModeStatus) { - // 设置自动闪光灯模式 - try { - captureSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO) - } catch (error) { - console.error('Failed to set the flash mode. errorCode = ' + error.code); - } + console.error('Failed to set the flash mode. errorCode = ' + error.code); } + } } // 判断是否支持连续自动变焦模式 -let focusModeStatus +let focusModeStatus: boolean; try { - let status = captureSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO) - focusModeStatus = status + let status: boolean = captureSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); + focusModeStatus = status; } catch (error) { - console.error('Failed to check whether the focus mode is supported. errorCode = ' + error.code); + console.error('Failed to check whether the focus mode is supported. errorCode = ' + error.code); } if (focusModeStatus) { - // 设置连续自动变焦模式 - try { - captureSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO) - } catch (error) { - console.error('Failed to set the focus mode. errorCode = ' + error.code); - } + // 设置连续自动变焦模式 + try { + captureSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); + } catch (error) { + console.error('Failed to set the focus mode. errorCode = ' + error.code); + } } // 获取相机支持的可变焦距比范围 -let zoomRatioRange +let zoomRatioRange; try { - zoomRatioRange = captureSession.getZoomRatioRange() + zoomRatioRange: Array = captureSession.getZoomRatioRange(); } catch (error) { - console.error('Failed to get the zoom ratio range. errorCode = ' + error.code); + console.error('Failed to get the zoom ratio range. errorCode = ' + error.code); } // 设置可变焦距比 try { - captureSession.setZoomRatio(zoomRatioRange[0]) + captureSession.setZoomRatio(zoomRatioRange[0]); } catch (error) { - console.error('Failed to set the zoom ratio value. errorCode = ' + error.code); + console.error('Failed to set the zoom ratio value. errorCode = ' + error.code); } -let settings = { - quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高 - rotation: camera.ImageRotation.ROTATION_0 // 设置图片旋转角度0 +let settings: camera.PhotoCaptureSetting = { + quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高 + rotation: camera.ImageRotation.ROTATION_0 // 设置图片旋转角度0 } // 使用当前拍照设置进行拍照 -photoOutput.capture(settings, async (err) => { - if (err) { - console.error('Failed to capture the photo ${err.message}'); - return; - } - console.info('Callback invoked to indicate the photo capture request success.'); +photoOutput.capture(settings, async (err: BusinessError) => { + if (err) { + console.error('Failed to capture the photo ${err.message}'); + return; + } + console.info('Callback invoked to indicate the photo capture request success.'); }); // 停止当前会话 -captureSession.stop() +captureSession.stop(); // 释放相机输入流 -cameraInput.close() +cameraInput.close(); // 释放预览输出流 -previewOutput.release() +previewOutput.release(); // 释放拍照输出流 -photoOutput.release() +photoOutput.release(); // 释放会话 -captureSession.release() +captureSession.release(); // 会话置空 -captureSession = null +captureSession = null; ``` diff --git a/zh-cn/application-dev/media/camera-shooting.md b/zh-cn/application-dev/media/camera-shooting.md index 9f16f32101..c63a4389db 100644 --- a/zh-cn/application-dev/media/camera-shooting.md +++ b/zh-cn/application-dev/media/camera-shooting.md @@ -18,15 +18,15 @@ ```ts function getImageReceiverSurfaceId() { - let receiver = image.createImageReceiver(640, 480, 4, 8); - console.info('before ImageReceiver check'); - if (receiver !== undefined) { - console.info('ImageReceiver is ok'); - let photoSurfaceId = receiver.getReceivingSurfaceId(); - console.info('ImageReceived id: ' + JSON.stringify(photoSurfaceId)); - } else { - console.info('ImageReceiver is not ok'); - } + let receiver: image.ImageReceiver = image.createImageReceiver(640, 480, 4, 8); + console.info('before ImageReceiver check'); + if (receiver !== undefined) { + console.info('ImageReceiver is ok'); + let photoSurfaceId: string = receiver.getReceivingSurfaceId(); + console.info('ImageReceived id: ' + JSON.stringify(photoSurfaceId)); + } else { + console.info('ImageReceiver is not ok'); + } } ``` @@ -35,15 +35,15 @@ 通过CameraOutputCapability类中的photoProfiles()方法,可获取当前设备支持的拍照输出流,通过createPhotoOutput()方法传入支持的某一个输出流及步骤一获取的SurfaceId创建拍照输出流。 ```ts - let photoProfilesArray = cameraOutputCapability.photoProfiles; + let photoProfilesArray: Array = cameraOutputCapability.photoProfiles; if (!photoProfilesArray) { - console.error("createOutput photoProfilesArray == null || undefined"); + console.error("createOutput photoProfilesArray == null || undefined"); } - let photoOutput; + let photoOutput: camera.PhotoOutput; try { - photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId); + photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[0], photoSurfaceId); } catch (error) { - console.error('Failed to createPhotoOutput errorCode = ' + error.code); + console.error('Failed to createPhotoOutput errorCode = ' + error.code); } ``` @@ -53,59 +53,59 @@ ```ts // 判断设备是否支持闪光灯 - let flashStatus; + let flashStatus: boolean; try { - flashStatus = captureSession.hasFlash(); + flashStatus = captureSession.hasFlash(); } catch (error) { - console.error('Failed to hasFlash. errorCode = ' + error.code); + console.error('Failed to hasFlash. errorCode = ' + error.code); } console.info('Promise returned with the flash light support status:' + flashStatus); if (flashStatus) { - // 判断是否支持自动闪光灯模式 - let flashModeStatus; + // 判断是否支持自动闪光灯模式 + let flashModeStatus: boolean; + try { + let status: boolean = captureSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO); + flashModeStatus = status; + } catch (error) { + console.error('Failed to check whether the flash mode is supported. errorCode = ' + error.code); + } + if(flashModeStatus) { + // 设置自动闪光灯模式 try { - let status = captureSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO); - flashModeStatus = status; + captureSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO); } catch (error) { - console.error('Failed to check whether the flash mode is supported. errorCode = ' + error.code); - } - if(flashModeStatus) { - // 设置自动闪光灯模式 - try { - captureSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO); - } catch (error) { - console.error('Failed to set the flash mode. errorCode = ' + error.code); - } + console.error('Failed to set the flash mode. errorCode = ' + error.code); } + } } // 判断是否支持连续自动变焦模式 - let focusModeStatus; + let focusModeStatus: boolean; try { - let status = captureSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); - focusModeStatus = status; + let status: boolean = captureSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); + focusModeStatus = status; } catch (error) { - console.error('Failed to check whether the focus mode is supported. errorCode = ' + error.code); + console.error('Failed to check whether the focus mode is supported. errorCode = ' + error.code); } if (focusModeStatus) { - // 设置连续自动变焦模式 - try { - captureSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); - } catch (error) { - console.error('Failed to set the focus mode. errorCode = ' + error.code); - } + // 设置连续自动变焦模式 + try { + captureSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); + } catch (error) { + console.error('Failed to set the focus mode. errorCode = ' + error.code); + } } // 获取相机支持的可变焦距比范围 - let zoomRatioRange; + let zoomRatioRange: Array; try { - zoomRatioRange = captureSession.getZoomRatioRange(); + zoomRatioRange = captureSession.getZoomRatioRange(); } catch (error) { - console.error('Failed to get the zoom ratio range. errorCode = ' + error.code); + console.error('Failed to get the zoom ratio range. errorCode = ' + error.code); } // 设置可变焦距比 try { - captureSession.setZoomRatio(zoomRatioRange[0]); + captureSession.setZoomRatio(zoomRatioRange[0]); } catch (error) { - console.error('Failed to set the zoom ratio value. errorCode = ' + error.code); + console.error('Failed to set the zoom ratio value. errorCode = ' + error.code); } ``` @@ -114,18 +114,18 @@ 通过photoOutput类的capture()方法,执行拍照任务。该方法有两个参数,第一个参数为拍照设置参数的setting,setting中可以设置照片的质量和旋转角度,第二参数为回调函数。 ```ts - let settings = { - quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高 - rotation: camera.ImageRotation.ROTATION_0, // 设置图片旋转角度0 - location: captureLocation, // 设置图片地理位置 - mirror: false // 设置镜像使能开关(默认关) + let settings: camera.PhotoCaptureSetting = { + quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高 + rotation: camera.ImageRotation.ROTATION_0, // 设置图片旋转角度0 + location: captureLocation, // 设置图片地理位置 + mirror: false // 设置镜像使能开关(默认关) }; - photoOutput.capture(settings, async (err) => { - if (err) { - console.error('Failed to capture the photo ${err.message}'); - return; - } - console.info('Callback invoked to indicate the photo capture request success.'); + photoOutput.capture(settings, async (err: BusinessError) => { + if (err) { + console.error('Failed to capture the photo ${err.message}'); + return; + } + console.info('Callback invoked to indicate the photo capture request success.'); }); ``` @@ -136,24 +136,24 @@ - 通过注册固定的captureStart回调函数获取监听拍照开始结果,photoOutput创建成功时即可监听,拍照第一次曝光时触发,该事件返回此次拍照的captureId。 ```ts - photoOutput.on('captureStart', (err, captureId) => { - console.info(`photo capture stated, captureId : ${captureId}`); - }) + photoOutput.on('captureStart', (err: BusinessError, captureId: number) => { + console.info(`photo capture stated, captureId : ${captureId}`); + }); ``` - 通过注册固定的captureEnd回调函数获取监听拍照结束结果,photoOutput创建成功时即可监听,该事件返回结果为拍照完全结束后的相关信息[CaptureEndInfo](../reference/apis/js-apis-camera.md#captureendinfo)。 ```ts - photoOutput.on('captureEnd', (err, captureEndInfo) => { - console.info(`photo capture end, captureId : ${captureEndInfo.captureId}`); - console.info(`frameCount : ${captureEndInfo.frameCount}`); - }) + photoOutput.on('captureEnd', (err: BusinessError, captureEndInfo: camera.CaptureEndInfo) => { + console.info(`photo capture end, captureId : ${captureEndInfo.captureId}`); + console.info(`frameCount : ${captureEndInfo.frameCount}`); + }); ``` - 通过注册固定的error回调函数获取监听拍照输出流的错误结果。callback返回拍照输出接口使用错误时的对应错误码,错误码类型参见[CameraErrorCode](../reference/apis/js-apis-camera.md#cameraerrorcode)。 ```ts - photoOutput.on('error', (error) => { - console.info(`Photo output error code: ${error.code}`); - }) + photoOutput.on('error', (error: BusinessError) => { + console.info(`Photo output error code: ${error.code}`); + }); ``` -- GitLab