1# 媒体开发常见问题 2 3 4## 使用XComponent组件显示相机的预览输出流时,如何获取相机的帧数据(API 9) 5 6**问题现象** 7 8目前接口不支持实时预览相机的帧数据,只能绑定一个动作来获取,比如拍照动作。 9 10**解决措施** 11 12通过创建双路预览来实现。 13 141. Xcomponent来创建预览流。 15 16 ``` 17 // 获取PreviewOutput(预览输出类)实例 18 const surfaceId = globalThis.mxXComponentController.getXComponentSurfaceld(); 19 this.mPreviewOutput = await Camera.createPreviewOutput(surfaceld) ; 20 ``` 21 222. 使用imageReceiver来监听图像信息。 23 24 ``` 25 // 添加双路预览 26 const fullWidth = this.mFullScreenSize.width; 27 const fullHeight = this.mFullScreenSize.height; 28 const imageReceiver = await image.createImageReceiver(fullwidth, fullHeight, 29 formatImage, capacityImage) ; 30 const photoSurfaceId = await imageReceiver.getReceivingSurfaceld(); 31 this.mPreviewOutputDouble = await Camera.createPreviewOutput ( photoSurfaceld) 32 ``` 33 34 35## 如何获取前置摄像头的预览图像(API 9) 36 37**解决措施** 38 391. 使用系统相机框架\@ohos.multimedia.camera获取物理摄像头信息。 40 41 ``` 42 let cameraManager = await camera.getCameraManager(context); 43 let camerasInfo = await cameraManager.getSupportedCameras(); 44 let cameraDevice = this.camerasInfo[0]; 45 ``` 46 472. 创建并启动物理摄像头输入流通道。 48 49 ``` 50 let cameraInput = await cameraManager.createCameraInput(cameraDevice); 51 await this.cameraInput.open(); 52 ``` 53 543. 拿到物理摄像头信息查询摄像头支持预览流支持的输出格式,结合XComponent提供的surfaceId创建预览输出通道。 55 56 ``` 57 let outputCapability = await this.cameraManager.getSupportedOutputCapability(cameraDevice); 58 let previewProfile = this.outputCapability.previewProfiles[0]; 59 let previewOutput = await cameraManager.createPreviewOutput(previewProfile, previewId); 60 ``` 61 624. 创建相机会话,在会话中添加摄像头输入流和预览输出流,然后启动会话,预览画面就会在XComponent组件上送显。 63 64 ``` 65 let captureSession = await cameraManager.createCaptureSession(); 66 await captureSession.beginConfig(); 67 await captureSession.addInput(cameraInput); 68 await captureSession.addOutput(previewOutput); 69 await this.captureSession.commitConfig() 70 await this.captureSession.start(); 71 ``` 72 73 74## 如何设置相机焦距(API 9) 75 76**解决措施** 77 781. 判断当前摄像头是否为前置摄像头,前置摄像头不支持设置焦距。 79 802. 通过captureSession.getZoomRatioRange()接口获取设备焦距设置支持的最大、最小范围。 81 823. 判断目标焦距参数大小是否在步骤二获取的范围内,然后通过captureSession.setZoomRatio()接口设置相机焦距。 83 84 85## 创建多个视频组件无法播放(API 9) 86 87**问题现象** 88 89创建十几个视频组件无法播放甚至崩溃。 90 91**解决措施** 92 93当前限制最多创建13个媒体播放实例。 94 95 96## 如何直接调起图片库(API 9) 97 98**解决措施** 99 100``` 101let want = { 102 bundleName: 'com.ohos.photos', 103 abilityName: 'com.ohos.photos.MainAbility', 104 parameters: { 105 uri: 'detail' 106 } 107}; 108let context = getContext(this) as common.UIAbilityContext; 109context.startAbility(want); 110``` 111 112 113## 如何申请设备上的媒体读写权限(API 9) 114 115适用于Stage模型。 116 117**解决措施** 118 1191. 在module.json5配置文件中配置媒体读写权限ohos.permission.READ_MEDIA和ohos.permission.WRITE_MEDIA。 120 121 示例: 122 123 ``` 124 { 125 "module" : { 126 "requestPermissions":[ 127 { 128 "name" : "ohos.permission.READ_MEDIA", 129 "reason": "$string:reason" 130 }, 131 { 132 "name" : "ohos.permission.WRITE_MEDIA", 133 "reason": "$string:reason" 134 } 135 ] 136 } 137 } 138 ``` 139 1402. 这两个权限的授权方式均为user_grant,因此需要调用requestPermissionsFromUser接口,以动态弹窗的方式向用户申请授权。 141 142 ``` 143 let context = getContext(this) as common.UIAbilityContext; 144 let atManager = abilityAccessCtrl.createAtManager(); 145 let permissions: Array<string> = ['ohos.permission.READ_MEDIA','ohos.permission.WRITE_MEDIA'] 146 atManager.requestPermissionsFromUser(context, permissions) 147 .then((data) => { 148 console.log("Succeed to request permission from user with data: " + JSON.stringify(data)) 149 }).catch((error) => { 150 console.log("Failed to request permission from user with error: " + JSON.stringify(error)) 151 }) 152 ``` 153 154 155## 如何检测当前相机服务的状态(API 9) 156 157适用于Stage模型。 158 159**解决措施** 160 161cameraManager通过设置状态回调返回相机状态。 162 163``` 164cameraManager.on('cameraStatus', (cameraStatusInfo) => { 165 console.log(`camera : ${cameraStatusInfo.camera.cameraId}`); 166 console.log(`status: ${cameraStatusInfo.status}`); 167}) 168``` 169 170相机状态:CameraStatus 171 172枚举,相机状态。 173 174CAMERA_STATUS_APPEAR 0 新的相机出现。 175 176CAMERA_STATUS_DISAPPEAR 1 相机被移除。 177 178CAMERA_STATUS_AVAILABLE 2 相机可用。 179 180CAMERA_STATUS_UNAVAILABLE 3 相机不可用。 181 182参考文档:[CameraStatus](../reference/apis-camera-kit/js-apis-camera.md#oncamerastatus) 183 184## SoundPool播放的音频是否支持wmv格式?支持哪些格式?(API 10) 185**解决措施** 186 187WMV当前是不支持,支持的格式有AAC、MPEG(MP3)、Flac、Vorbis。 188 189**参考资料** 190 191soundpool支持的格式与底层一致,支持的格式可以参考文档:[音频解码](../media/avcodec/audio-decoding.md) 192 193## 如何读取相机的预览图?(API 10) 194 195**解决措施** 196 197使用ImageReceiver.readLatestImage可获取相机的预览图。 198 199**参考资料** 200 201[readLatestImage](../reference/apis-image-kit/js-apis-image.md#readlatestimage9) 202 203## 如何实现录音监听?(API 10) 204 205**解决措施** 206 207系统音频监听功能都在AudioStreamManager内,录音监听可以通过on(type: 'audioCapturerChange', callback: Callback\<AudioCapturerChangeInfoArray>): void订阅接口实现。 208 209**参考资料** 210 211[onaudiocapturerchange](../reference/apis-audio-kit/js-apis-audio.md#onaudiocapturerchange9) 212 213## 音频处理哪些场景内置了3A处理的算法(AEC、ANC、AGC)?若内置了,有无音频3A处理的相关接口,如何调用?系统3A算法AEC、ANC、AGC是否支持独立开关?录音场景系统是否支持3A,如果不支持的话,解决方案是什么?例如:如何在播放音乐时,不影响音频录制的音质?(API 10) 214 215**解决措施** 216 217存在STREAM_USAGE_VOICE_COMMUNICATION配置的音频流运行时自动使能内置3A。暂未支持3A独立开关。录音场景支持3A,需要配置对应的AudioScene和SourceType类型进行使能。 218 219**参考资料** 220 221[AudioCapturer](../reference/apis-audio-kit/js-apis-audio.md#audiocapturer8) 222 223## 如何实现低时延音频采集?(API 11) 224 225**解决措施** 226 227支持通过OHAudio C API接口AudioCapturer使用系统低时延采集,具体实现参考:[使用OHAudio开发音频录制功能(C/C++)](../media/audio/using-ohaudio-for-recording.md)。 228 229**参考资料** 230 2311. [ohaudio](../reference/apis-audio-kit/_o_h_audio.md) 2322. [Audio](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Native/Audio) 233 234## 如何实现实时视频流传输?如何实现直播场景?(API 10) 235 236**解决措施** 237 238当前版本AVPlayer支持http、https、HLS。在直播场景中,将直播地址传给Avplayer,即可进行播放对端发来的数据;当前不支持推流,即Avplayer不支持使用当前设备进行直播。 239 240**参考资料** 241 2421. [Media Kit](../media/media/media-kit-intro.md) 2432. [AVPlayer](../media/media/using-avplayer-for-playback.md) 244 245## 音频播放器AVPlayer如何在后台进行播放?(API 10) 246 247**解决措施** 248 249需要将APP配置为长时任务,并将媒体会话功能注册到系统内统一管理避免被强制停止播放。 250 251**参考资料** 252 2531. [长时任务](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/TaskManagement/ContinuousTask) 2542. [应用接入AVSession场景介绍](../media/avsession/avsession-access-scene.md) 255 256## 三方应用为什么无法创建相册?(API 10) 257 258**问题描述** 259 260相册资源读写权限设置为system_basic级别权限,且创建相册的接口设置为系统接口不对外开放,这个是开发者常用场景的能力接口,这样设计的背景和原因是什么?(API 10) 261 262**解决措施** 263 264出于对用户图片视频资源的隐私保护,系统权限设计上操作媒体文件要在用户知情下操作,所以不授予三方应用的直接读写权限;系统基于图片视频保存来源生成来源相册,用户自定义相册仅支持图库创建,且支持用户拖动来源相册至用户自定义相册区域。 265 266## 如何将图片压缩至指定大小,有哪些影响因素(API 10) 267 268**问题描述** 269 270关于图片压缩API的质量参数quality与图片原始大小、压缩后大小,是什么关系?如何设置压缩后的图片大小?如果要把图片压缩在指定大小(如500k)以内,那么要怎么设置参数才能使无论多大的原始图片都被压缩至500k? 271 272**解决措施** 273 274对于有损压缩图片格式,如jpeg格式,质量参数会影响压缩后的图片大小,对于无损压缩图片格式,如png格式,质量参数不会影响压缩后的图片大小。 275对于有损压缩图片格式,压缩后的图片大小不仅取决于图片原始大小、图片压缩质量,还与图片中内容有较大关系,因此当前系统不支持设置压缩后的图片大小,如果应用想要指定压缩后图片大小,可以根据压缩结果调整质量参数,或者将pixelmap scale到更小的尺寸后再压缩。 276 277**参考资料** 278 2791. [scale](../reference/apis-image-kit/js-apis-image.md#scale9) 2802. [packing](../reference/apis-image-kit/js-apis-image.md#packing) 281