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