# 媒体开发常见问题 ## 使用XComponent组件显示相机的预览输出流时,如何获取相机的帧数据 适用于:OpenHarmony 3.2 版本 API 9 **问题现象** 目前接口不支持实时预览相机的帧数据,只能绑定一个动作来获取,比如拍照动作。 **解决措施** 通过创建双路预览来实现。 1. Xcomponent来创建预览流。 ``` // 获取PreviewOutput(预览输出类)实例 const surfaceId = globalThis.mxXComponentController.getXComponentSurfaceld(); this.mPreviewOutput = await Camera.createPreviewOutput(surfaceld) ; ``` 2. 使用imageReceiver来监听图像信息。 ``` // 添加双路预览 const fullWidth = this.mFullScreenSize.width; const fullHeight = this.mFullScreenSize.height; const imageReceiver = await image.createImageReceiver(fullwidth, fullHeight, formatImage, capacityImage) ; const photoSurfaceId = await imageReceiver.getReceivingSurfaceld(); this.mPreviewOutputDouble = await Camera.createPreviewOutput ( photoSurfaceld) ``` ## 如何获取前置摄像头的预览图像 适用于:OpenHarmony 3.2版本 API 9 **解决措施** 1. 使用系统相机框架@ohos.multimedia.camera获取物理摄像头信息。 ``` let cameraManager = await camera.getCameraManager(context); let camerasInfo = await cameraManager.getSupportedCameras(); let cameraDevice = this.camerasInfo[0]; ``` 2. 创建并启动物理摄像头输入流通道。 ``` let cameraInput = await cameraManager.createCameraInput(cameraDevice); await this.cameraInput.open(); ``` 3. 拿到物理摄像头信息查询摄像头支持预览流支持的输出格式,结合XComponent提供的surfaceId创建预览输出通道。 ``` let outputCapability = await this.cameraManager.getSupportedOutputCapability(cameraDevice); let previewProfile = this.outputCapability.previewProfiles[0]; let previewOutput = await cameraManager.createPreviewOutput(previewProfile, previewId); ``` 4. 创建相机会话,在会话中添加摄像头输入流和预览输出流,然后启动会话,预览画面就会在XComponent组件上送显。 ``` let captureSession = await cameraManager.createCaptureSession(); await captureSession.beginConfig(); await captureSession.addInput(cameraInput); await captureSession.addOutput(previewOutput); await this.captureSession.commitConfig() await this.captureSession.start(); ``` ## 如何设置相机焦距 适用于:OpenHarmony 3.2版本 API 9 **解决措施** 1. 判断当前摄像头是否为前置摄像头,前置摄像头不支持设置焦距。 2. 通过captureSession.getZoomRatioRange\(\)接口获取设备焦距设置支持的最大、最小范围。 3. 判断目标焦距参数大小是否在步骤二获取的范围内,然后通过captureSession.setZoomRatio\(\)接口设置相机焦距。 ## 如何后台播放音乐 适用于:OpenHarmony 3.2版本 API 9 **问题现象** 无法后台播放音乐。 **解决措施** AVSession对媒体播放做了管控,当三方应用从前台切入后台或者进入锁屏状态,媒体播放会被强制暂停而应用不感知,如果要开发后台播放功能,应该启动后台任务管理的长时任务中播放音乐,同时接入AVSession能力,允许控制中心的播控面板控制三方应用的播放功能。 **参考链接** [后台任务管理的长时任务开发指导参考](../task-management/continuous-task.md) [AVSession开发指导参考](../media/using-avsession-developer.md) ## 创建多个视频组件无法播放 适用于:OpenHarmony 3.2版本 API 9 **问题现象** 创建十几个视频组件无法播放甚至崩溃。 **解决措施** 当前限制最多创建13个媒体播放实例。 ## 如何直接调起图片库 适用于:OpenHarmony 3.2版本 API 9 **解决措施** ``` let want = { bundleName: 'com.ohos.photos', abilityName: 'com.ohos.photos.MainAbility', parameters: { uri: 'detail' } }; let context = getContext(this) as common.UIAbilityContext; context.startAbility(want); ``` ## 如何申请设备上的媒体读写权限 适用于:OpenHarmony 3.2版本 API 9 Stage模型 **解决措施** 1. 在module.json5配置文件中配置媒体读写权限ohos.permission.READ\_MEDIA和ohos.permission.WRITE\_MEDIA。 示例: ``` { "module" : { "requestPermissions":[ { "name" : "ohos.permission.READ_MEDIA", "reason": "$string:reason" }, { "name" : "ohos.permission.WRITE_MEDIA", "reason": "$string:reason" } ] } } ``` 2. 这两个权限的授权方式均为user\_grant,因此需要调用requestPermissionsFromUser接口,以动态弹窗的方式向用户申请授权。 ``` let context = getContext(this) as common.UIAbilityContext; let atManager = abilityAccessCtrl.createAtManager(); let permissions: Array = ['ohos.permission.READ_MEDIA','ohos.permission.WRITE_MEDIA'] atManager.requestPermissionsFromUser(context, permissions) .then((data) => { console.log("Succeed to request permission from user with data: " + JSON.stringify(data)) }).catch((error) => { console.log("Failed to request permission from user with error: " + JSON.stringify(error)) }) ``` ## 如何检测当前相机服务的状态 适用于:OpenHarmony 3.2版本 API 9 Stage模型 **解决措施** cameraManager通过设置状态回调返回相机状态。 ``` cameraManager.on('cameraStatus', (cameraStatusInfo) => { console.log(`camera : ${cameraStatusInfo.camera.cameraId}`); console.log(`status: ${cameraStatusInfo.status}`); }) ``` 相机状态:CameraStatus 枚举,相机状态。 CAMERA_STATUS_APPEAR 0 新的相机出现。 CAMERA_STATUS_DISAPPEAR 1 相机被移除。 CAMERA_STATUS_AVAILABLE 2 相机可用。 CAMERA_STATUS_UNAVAILABLE 3 相机不可用。 参考文档:[CameraStatus](../reference/apis/js-apis-camera.md#oncamerastatus) ## SoundPool播放的音频是否支持wmv格式?支持哪些格式?(API 10) **解决措施** WMV当前是不支持,支持的格式有AAC、MPEG(MP3)、Flac、Vorbis。 **参考资料** soundpool支持的格式与底层一致,支持的格式可以参考文档:[音频解码](../media/audio-decoding.md) ## 如何读取相机的预览图?(API 10) **解决措施** 使用ImageReceiver.readLatestImage可获取相机的预览图。 **参考资料** [readLatestImage](../reference/apis/js-apis-image.md#readlatestimage9) ## 如何实现录音监听?(API 10) **解决措施** 系统音频监听功能都在AudioStreamManager内,录音监听可以通过on(type: 'audioCapturerChange', callback: Callback): void订阅接口实现。 **参考资料** [onaudiocapturerchange](../reference/apis/js-apis-audio.md#onaudiocapturerchange9) ## 音频处理哪些场景内置了3A处理的算法(AEC、ANC、AGC)?若内置了,有无音频3A处理的相关接口,如何调用?系统3A算法AEC、ANC、AGC是否支持独立开关?录音场景系统是否支持3A,如果不支持的话,解决方案是什么?例如:如何在播放音乐时,不影响音频录制的音质?(API 10) **解决措施** 存在STREAM_USAGE_VOICE_COMMUNICATION配置的音频流运行时自动使能内置3A。暂未支持3A独立开关。录音场景支持3A,需要配置对应的AudioScene和SourceType类型进行使能。 **参考资料** [AudioCapturer](../reference/apis/js-apis-audio.md#audiocapturer8)