• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# AVSession开发指导
2
3> **说明:**
4>
5> AVSession的所有接口均为系统接口,其功能仅提供给系统应用使用。
6
7## 会话接入端开发指导
8
9### 基本概念
10- 会话元数据`'AVMetadata'`: 媒体数据相关属性,包含标识当前媒体的ID(assetId),上一首媒体的ID(previousAssetId),下一首媒体的ID(nextAssetId),标题(title),专辑作者(author),专辑名称(album),词作者(writer),媒体时长(duration)等属性。
11- 会话描述符`'AVSessionDescriptor'`: 描述媒体会话的相关信息。包含标识会话的ID(sessionId),会话的类型type(音频Audio/视频Video),会话自定义名称(sessionTag),会话所属应用的信息(elementName)等。
12- 媒体播放状态`'AVPlaybackState'`:用于描述媒体播放状态的相关属性。包含当前媒体的播放状态(state)、位置(position)、速度(speed)、缓冲时间(bufferedTime)、循环模式(loopMode)、是否收藏(isFavorite)等属性。
13
14### 接口说明
15会话接入端常用接口如下表所示。接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。更多API说明请参见[API文档](../reference/apis/js-apis-avsession.md)。
16
17表1:会话接入端常用接口
18
19| 接口名                                                                              | 描述          |
20|----------------------------------------------------------------------------------|-------------|
21| createAVSession(context: Context, tag: string, type: AVSessionType, callback: AsyncCallback\<AVSession>): void | 创建会话 |
22| setAVMetadata(data: AVMetadata, callback: AsyncCallback\<void>): void            | 设置会话元数据     |
23| setAVPlaybackState(state: AVPlaybackState, callback: AsyncCallback\<void>): void | 设置会话播放状态信息  |
24| setLaunchAbility(ability: WantAgent, callback: AsyncCallback\<void>): void       | 设置启动ability |
25| getController(callback: AsyncCallback\<AVSessionController>): void                | 获取当前会话自身控制器 |
26| getOutputDevice(callback: AsyncCallback\<OutputDeviceInfo>): void                 | 获取音频输出设备信息  |
27| activate(callback: AsyncCallback\<void>): void                                    | 激活会话        |
28| destroy(callback: AsyncCallback\<void>): void                                     | 销毁会话        |
29
30### 开发步骤
311.导入模块接口
32
33```js
34import avSession from '@ohos.multimedia.avsession';
35import wantAgent from '@ohos.wantAgent';
36import featureAbility from '@ohos.ability.featureAbility';
37```
38
392.创建会话并激活会话
40```js
41// 全局变量定义
42let mediaFavorite = false;
43let currentSession = null;
44let context = featureAbility.getContext();
45
46// 创建音频类型会话
47avSession.createAVSession(context, "AudioAppSample", 'audio').then((session) => {
48   currentSession = session;
49   currentSession.activate();  // 激活会话
50}).catch((err) => {
51   console.info(`createAVSession : ERROR : ${err.message}`);
52});
53```
54
553.设置AVSession会话信息,包括:
56- 设置会话元数据,除了媒体ID必选外,可选设置媒体标题、专辑信息、媒体作者、媒体时长、上一首/下一首媒体ID等。详细的会话元数据信息可参考API文档中的`AVMetadata`。
57- 设置启动Ability,通过`WantAgent`的接口实现。WantAgent一般用于封装行为意图信息,如果想要了解更多信息,可以查阅[WantAgent开发指导](../reference/apis/js-apis-wantAgent.md)。
58- 设置播放状态。
59```js
60// 设置会话元数据
61let metadata  = {
62   assetId: "121278",
63   title: "lose yourself",
64   artist: "Eminem",
65   author: "ST",
66   album: "Slim shady",
67   writer: "ST",
68   composer: "ST",
69   duration: 2222,
70   mediaImage: "https://www.example.com/example.jpg",       // 请开发者根据实际情况使用
71   subtitle: "8 Mile",
72   description: "Rap",
73   lyric: "https://www.example.com/example.lrc",            // 请开发者根据实际情况使用
74   previousAssetId: "121277",
75   nextAssetId: "121279",
76};
77currentSession.setAVMetadata(metadata).then(() => {
78   console.info('setAVMetadata successfully');
79}).catch((err) => {
80   console.info(`setAVMetadata : ERROR : ${err.message}`);
81});
82```
83
84```js
85// 设置启动ability
86let wantAgentInfo = {
87  wants: [
88    {
89      bundleName: "com.neu.setResultOnAbilityResultTest1",
90      abilityName: "com.example.test.MainAbility",
91    }
92  ],
93  operationType: wantAgent.OperationType.START_ABILITIES,
94  requestCode: 0,
95  wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
96}
97
98wantAgent.getWantAgent(wantAgentInfo).then((agent) => {
99  currentSession.setLaunchAbility(agent).then(() => {
100    console.info('setLaunchAbility successfully');
101  }).catch((err) => {
102    console.info(`setLaunchAbility : ERROR : ${err.message}`);
103  });
104});
105```
106
107```js
108// 设置播放状态
109let PlaybackState = {
110  state: avSession.PlaybackState.PLAYBACK_STATE_STOP,
111  speed: 1.0,
112  position:{elapsedTime: 0, updateTime: (new Date()).getTime()},
113  bufferedTime: 1000,
114  loopMode: avSession.LoopMode.LOOP_MODE_SEQUENCE,
115  isFavorite: false,
116};
117currentSession.setAVPlaybackState(PlaybackState).then(() => {
118  console.info('setAVPlaybackState successfully');
119}).catch((err) => {
120  console.info(`setAVPlaybackState : ERROR : ${err.message}`);
121});
122```
123
124```js
125// 获取当前session会话对象自身的控制器
126currentSession.getController().then((selfController) => {
127   console.info('getController successfully');
128}).catch((err) => {
129   console.info(`getController : ERROR : ${err.message}`);
130});
131```
132
133```js
134// 获取音频输出设备信息
135currentSession.getOutputDevice().then((outputInfo) => {
136   console.info(`getOutputDevice successfully, deviceName : ${outputInfo.deviceName}`);
137}).catch((err) => {
138   console.info(`getOutputDevice : ERROR : ${err.message}`);
139});
140```
141
1424.注册控制命令监听
143```js
144// 注册播放命令监听
145currentSession.on('play', () => {
146   console.log("调用AudioPlayer.play方法");
147   // 设置播放状态
148   currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PLAY}).then(() => {
149       console.info('setAVPlaybackState successfully');
150   }).catch((err) => {
151       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
152   });
153});
154
155
156// 注册暂停命令监听
157currentSession.on('pause', () => {
158   console.log("调用AudioPlayer.pause方法");
159   // 设置播放状态
160   currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PAUSE}).then(() => {
161       console.info('setAVPlaybackState successfully');
162   }).catch((err) => {
163       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
164   });
165});
166
167// 注册停止命令监听
168currentSession.on('stop', () => {
169   console.log("调用AudioPlayer.stop方法");
170   // 设置播放状态
171   currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_STOP}).then(() => {
172       console.info('setAVPlaybackState successfully');
173   }).catch((err) => {
174       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
175   });
176});
177
178// 注册下一首命令监听
179currentSession.on('playNext', () => {
180   // 如果媒体文件未准备好,则下载并缓存媒体文件,设置准备状态
181   currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PREPARE}).then(() => {
182       console.info('setAVPlaybackState successfully');
183   }).catch((err) => {
184       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
185   });
186   // 成功获取媒体文件
187   currentSession.setAVMetadata({assetId: '58970105', title: '不如我们明天见'}).then(() => {
188       console.info('setAVMetadata successfully');
189   }).catch((err) => {
190       console.info(`setAVMetadata : ERROR : ${err.message}`);
191   });
192   console.log("调用AudioPlayer.play方法");
193   // 设置播放状态
194   let time = (new Date()).getTime();
195   currentSession.setAVPlaybackState({state: avSession.PlaybackState.PLAYBACK_STATE_PLAY, position: {elapsedTime: 0, updateTime: time}, bufferedTime:2000}).then(() => {
196       console.info('setAVPlaybackState successfully');
197   }).catch((err) => {
198       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
199   });
200});
201
202// 注册播放快进命令监听
203currentSession.on('fastForward', () => {
204   console.log("调用AudioPlayer的倍速播放");
205   // 设置播放状态
206   currentSession.setAVPlaybackState({speed: 2.0}).then(() => {
207       console.info('setAVPlaybackState successfully');
208   }).catch((err) => {
209       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
210   });
211});
212
213// 注册跳播命令监听
214currentSession.on('seek', (time) => {
215   console.log("调用AudioPlayer的seek方法");
216   // 设置播放状态
217   currentSession.setAVPlaybackState({position: {elapsedTime: time, updateTime: (new Data()).getTime()}}).then(() => {
218       console.info('setAVPlaybackState successfully');
219   }).catch((err) => {
220       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
221   });
222});
223
224// 注册设置播放速度命令监听
225currentSession.on('setSpeed', (speed) => {
226   console.log(`调用AudioPlayer的倍速播放 ${speed}`);
227   // 设置播放状态
228   currentSession.setAVPlaybackState({speed: speed}).then(() => {
229       console.info('setAVPlaybackState successfully');
230   }).catch((err) => {
231       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
232   });
233});
234
235// 注册设置播放循环模式命令监听
236currentSession.on('setLoopMode', (mode) => {
237   console.log(`应用自身切换循环模式 ${mode}`);
238   // 设置播放状态
239   currentSession.setAVPlaybackState({loopMode: mode}).then(() => {
240       console.info('setAVPlaybackState successfully');
241   }).catch((err) => {
242       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
243   });
244});
245
246// 注册设置歌曲收藏命令监听
247currentSession.on('toggleFavorite', (assetId) => {
248   console.log(`应用保存当前assetId为喜爱 ${assetId}`);
249   // 根据上一次的状态进行切换
250   let favorite = mediaFavorite == false ? true : false;
251   currentSession.setAVPlaybackState({isFavorite: favorite}).then(() => {
252       console.info('setAVPlaybackState successfully');
253   }).catch((err) => {
254       console.info(`setAVPlaybackState : ERROR : ${err.message}`);
255   });
256   mediaFavorite = favorite;
257});
258
259// 注册媒体按键命令监听
260currentSession.on('handleKeyEvent', (event) => {
261   console.log(`用户按键 ${event.keyCode}`);
262});
263
264// 注册播放设备变化命令监听
265currentSession.on('outputDeviceChange', (device) => {
266   console.log(`输出设备变更,更新显示 ${device.deviceName}`);
267});
268```
269
2705.释放资源
271```js
272// 取消注册回调
273currentSession.off('play');
274currentSession.off('pause');
275currentSession.off('stop');
276currentSession.off('playNext');
277currentSession.off('playPrevious');
278currentSession.off('fastForward');
279currentSession.off('rewind');
280currentSession.off('seek');
281currentSession.off('setSpeed');
282currentSession.off('setLoopMode');
283currentSession.off('toggleFavorite');
284currentSession.off('handleKeyEvent');
285currentSession.off('outputDeviceChange');
286
287// 去激活session并销毁对象
288currentSession.deactivate().then(() => {
289   currentSession.destroy();
290});
291```
292
293### 调测验证
294在媒体应用上点击播放、暂停、下一首等按键,媒体播放状态出现相应变化。
295
296### 常见问题
297
2981.会话服务端异常
299- 现象描述:
300
301  会话服务端异常,应用端无法获取服务端的消息响应。如会话服务未运行或者会话服务通信失败。返回错误信息: Session service exception。
302
303- 可能原因:
304
305  会话重启过程中服务被杀。
306
307- 解决办法
308
309  (1)定时重试,超过3s仍失败时,停止对该会话或者控制器进行操作。
310
311  (2)销毁当前会话或者会话控制器,并重新创建,如果重新创建失败,则停止会话相关操作。
312
3132.会话不存在
314- 现象描述:
315
316  会话对象不存在时,向该会话设置参数或者发送命令。返回错误信息: The session does not exist。
317
318- 可能原因:
319
320  会话已被销毁,服务端无会话记录。
321
322- 解决办法
323
324  (1)如果在会话被控端产生该错误,请重新创建会话;如果是会话控制端,请停止向该会话发送查询或者控制命令。
325
326  (2)如果在会话管理端产生该错误,请重新查询系统当前会话记录,在创建控制器时传入正确的会话ID。
327
3283.会话未激活
329- 现象描述:
330
331  会话没有激活时,向会话发送控制命令或者事件。。返回错误信息: The session not active。
332
333- 可能原因:
334
335  会话处于未激活状态。
336
337- 解决办法
338
339  停止发送该命令或事件,监听会话的激活状态,会话激活后恢复发送该命令或事件。
340
341### 相关实例
342提供[音乐Demo](https://gitee.com/openharmony/multimedia_av_session/blob/master/test/resource/player_index_js.md)的代码实例
343
344## 会话控制端开发指导(播控中心)
345
346### 基本概念
347- 远端投播:将本地媒体投播到远端设备,通过本地控制器发送命令,可控制远端播放行为。
348- 发送按键命令:控制器通过发送按键事件的方式控制媒体。
349- 发送控制命令:控制器通过发送控制命令的方式控制媒体。
350- 发送系统按键命令:应用拥有调用该接口的系统权限,通过发送按键事件的方式控制媒体,仅系统应用可用。
351- 发送系统控制命令:应用拥有调用该接口的系统权限,通过发送控制命令的方式控制媒体,仅系统应用可用。
352
353### 接口说明
354
355会话控制端涉及的常用接口如下表所示。接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。更多API说明请参见[API文档](../reference/apis/js-apis-avsession.md)。
356
357表2:会话控制端常用接口
358
359| 接口名                                                                                            | 描述               |
360| ------------------------------------------------------------------------------------------------ | ----------------- |
361| getAllSessionDescriptors(callback: AsyncCallback\<Array\<Readonly\<AVSessionDescriptor>>>): void    | 获取所有会话的描述符  |
362| createController(sessionId: string, callback: AsyncCallback\<AVSessionController>): void          | 创建控制器          |
363| sendAVKeyEvent(event: KeyEvent, callback: AsyncCallback\<void>): void                            | 发送按键命令        |
364| getLaunchAbility(callback: AsyncCallback\<WantAgent>): void                                      | 拉起应用           |
365| sendControlCommand(command: AVControlCommand, callback: AsyncCallback\<void>): void              | 发送控制命令        |
366| sendSystemAVKeyEvent(event: KeyEvent, callback: AsyncCallback\<void>): void                       | 发送系统按键命令     |
367| sendSystemControlCommand(command: AVControlCommand, callback: AsyncCallback\<void>): void         | 发送系统控制命令     |
368| castAudio(session: SessionToken \| 'all', audioDevices: Array\<audio.AudioDeviceDescriptor>, callback: AsyncCallback\<void>): void | 远端投播 |
369
370### 开发步骤
3711.导入模块接口
372```js
373import avSession from '@ohos.multimedia.avsession';
374import {Action, KeyEvent} from '@ohos.multimodalInput.KeyEvent';
375import wantAgent from '@ohos.wantAgent';
376import audio from '@ohos.multimedia.audio';
377```
378
3792.获取会话描述符,创建控制器
380```js
381// 全局变量定义
382let g_controller = new Array<avSession.AVSessionController>();
383let g_centerSupportCmd:Set<avSession.AVControlCommandType> = new Set(['play', 'pause', 'playNext', 'playPrevious', 'fastForward', 'rewind', 'seek','setSpeed', 'setLoopMode', 'toggleFavorite']);
384let g_validCmd:Set<avSession.AVControlCommandType>;
385
386// 获取会话描述符,创建控制器
387avSession.getAllSessionDescriptors().then((descriptors) => {
388   descriptors.forEach((descriptor) => {
389       avSession.createController(descriptor.sessionId).then((controller) => {
390           g_controller.push(controller);
391       }).catch((err) => {
392           console.error('createController error');
393       });
394   });
395}).catch((err) => {
396   console.error('getAllSessionDescriptors error');
397});
398
399// 注册会话创建监听,创建控制器
400avSession.on('sessionCreate', (session) => {
401  // 新增会话,需要创建控制器
402  avSession.createController(session.sessionId).then((controller) => {
403    g_controller.push(controller);
404  }).catch((err) => {
405    console.info(`createController : ERROR : ${err.message}`);
406  });
407});
408```
409
4103.监听AVSession会话状态以及AVSession服务变化
411```js
412// 注册会话激活状态变更监听
413controller.on('activeStateChange', (isActive) => {
414  if (isActive) {
415    console.log("控制器卡片按键高亮");
416  } else {
417    console.log("控制器卡片按键变更为无效");
418  }
419});
420
421// 注册会话销毁监听
422controller.on('sessionDestroy', () => {
423   console.info('on sessionDestroy : SUCCESS ');
424   controller.destroy().then(() => {
425       console.info('destroy : SUCCESS ');
426   }).catch((err) => {
427       console.info(`destroy : ERROR :${err.message}`);
428   });
429});
430
431// 注册系统会话销毁监听
432avSession.on('sessionDestroy', (session) => {
433   let index = g_controller.findIndex((controller) => {
434       return controller.sessionId == session.sessionId;
435   });
436   if (index != 0) {
437       g_controller[index].destroy();
438       g_controller.splice(index, 1);
439   }
440});
441
442// 注册系统最高优先级会话变更监听
443avSession.on('topSessionChange', (session) => {
444   let index = g_controller.findIndex((controller) => {
445       return controller.sessionId == session.sessionId;
446   });
447   // 将该会话显示排到第一个
448   if (index != 0) {
449       g_controller.sort((a, b) => {
450           return a.sessionId == session.sessionId ? -1 : 0;
451       });
452   }
453});
454
455// 注册服务异常监听
456avSession.on('sessionServiceDie', () => {
457   // 服务端异常,应用清理资源
458   console.log("服务端异常");
459})
460```
461
4624.监听AVSession会话信息变化
463```js
464// 注册元数据更新监听
465let metaFilter = ['assetId', 'title', 'description'];
466controller.on('metadataChange', metaFilter, (metadata) => {
467   console.info(`on metadataChange assetId : ${metadata.assetId}`);
468});
469
470// 注册播放状态更新监听
471let playbackFilter = ['state', 'speed', 'loopMode'];
472controller.on('playbackStateChange', playbackFilter, (playbackState) => {
473   console.info(`on playbackStateChange state : ${playbackState.state}`);
474});
475
476// 注册会话支持的命令变更监听
477controller.on('validCommandChange', (cmds) => {
478   console.info(`validCommandChange : SUCCESS : size : ${cmds.size}`);
479   console.info(`validCommandChange : SUCCESS : cmds : ${cmds.values()}`);
480   g_validCmd.clear();
481   for (let c of g_centerSupportCmd) {
482       if (cmds.has(c)) {
483           g_validCmd.add(c);
484       }
485   }
486});
487
488// 注册输出设备变更监听
489controller.on('outputDeviceChange', (device) => {
490   console.info(`on outputDeviceChange device isRemote : ${device.isRemote}`);
491});
492```
493
4945.控制AVSession会话行为
495```js
496// 用户点击播放按键:发送控制命令--播放
497if (g_validCmd.has('play')) {
498   controller.sendControlCommand({command:'play'}).then(() => {
499       console.info('sendControlCommand successfully');
500   }).catch((err) => {
501       console.info(`sendControlCommand : ERROR : ${err.message}`);
502   });
503}
504
505// 用户点击循环模式:发送控制命令--单曲循环
506if (g_validCmd.has('setLoopMode')) {
507   controller.sendControlCommand({command: 'setLoopMode', parameter: avSession.LoopMode.LOOP_MODE_SINGLE}).then(() => {
508       console.info('sendControlCommand successfully');
509   }).catch((err) => {
510       console.info(`sendControlCommand : ERROR : ${err.message}`);
511   });
512}
513
514// 发送按键事件
515let keyItem = {code: 0x49, pressedTime: 123456789, deviceId: 0};
516let event = {action: 2, key: keyItem, keys: [keyItem]};
517controller.sendAVKeyEvent(event).then(() => {
518   console.info('sendAVKeyEvent Successfully');
519}).catch((err) => {
520   console.info(`sendAVKeyEvent : ERROR : ${err.message}`);
521});
522
523// 用户点击卡片空白位置拉起应用
524controller.getLaunchAbility().then((want) => {
525   console.log("前台拉起应用");
526}).catch((err) => {
527   console.info(`getLaunchAbility : ERROR : ${err.message}`);
528});
529
530// 发送系统媒体按键事件
531let keyItem = {code: 0x49, pressedTime: 123456789, deviceId: 0};
532let event = {action: 2, key: keyItem, keys: [keyItem]};
533avSession.sendSystemAVKeyEvent(event).then(() => {
534   console.info('sendSystemAVKeyEvent Successfully');
535}).catch((err) => {
536   console.info(`sendSystemAVKeyEvent : ERROR : ${err.message}`);
537});
538
539// 发送系统控制命令,系统会把控制命令发送到Top会话中
540let avcommand = {command: 'toggleFavorite', parameter: "false"};
541avSession.sendSystemControlCommand(avcommand).then(() => {
542   console.info('sendSystemControlCommand successfully');
543}).catch((err) => {
544   console.info(`sendSystemControlCommand : ERROR : ${err.message}`);
545});
546
547// 投播到其他设备
548let audioManager = audio.getAudioManager();
549let audioDevices;
550await audioManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data) => {
551   audioDevices = data;
552   console.info('Promise returned to indicate that the device list is obtained.');
553}).catch((err) => {
554   console.info(`getDevices : ERROR : ${err.message}`);
555});
556
557avSession.castAudio('all', audioDevices).then(() => {
558   console.info('createController : SUCCESS');
559}).catch((err) => {
560   console.info(`createController : ERROR : ${err.message}`);
561});
562```
563
5646.释放资源
565```js
566// 取消注册回调
567 controller.off('metadataChange');
568 controller.off('playbackStateChange');
569 controller.off('sessionDestroy');
570 controller.off('activeStateChange');
571 controller.off('validCommandChange');
572 controller.off('outputDeviceChange');
573
574 // 销毁controller对象
575 controller.destroy().then(() => {
576     console.info('destroy : SUCCESS ');
577 }).catch((err) => {
578     console.info(`destroy : ERROR : ${err.message}`);
579 });
580```
581
582### 调测验证
583在播控中心点击播放、暂停、下一首等按键,应用播放状态随即发生相应变化。
584
585### 常见问题
5861.控制器不存在
587- 现象描述:
588
589  会话控制器不存在时,向该控制器发送控制命令或者事件。返回错误信息: The session controller does not exist。
590
591- 可能原因:
592
593  控制器已被销毁。
594
595- 解决办法
596
597  请重新查询系统当前会话记录,并创建对应的会话控制器。
598
5992.远端会话连接失败
600- 现象描述:
601
602  本端会话与远端会话通信失败。返回错误信息: The remote session connection failed。
603
604- 可能原因:
605
606  设备间通信断开。
607
608- 解决办法
609
610  停止对该会话发送控制命令,并监听输出设备变化,当输出设备发送变化后恢复发送。
611
6123.无效会话命令
613- 现象描述:
614
615  会话被控端不支持该被控命令或事件。返回错误信息: Invalid session command。
616
617- 可能原因:
618
619  被控端不支持该命令。
620
621- 解决办法
622
623  停止发送该命令或事件,并查询被控会话支持的命令集,发送被控端支持的命令。
624
6254.消息过载
626- 现象描述:
627
628  会话客户端在一段时间内向服务端发送了过多的消息或者命令,引起服务端消息过载。返回错误信息: Command or event overload。
629
630- 可能原因:
631
632  服务端消息过载。
633
634- 解决办法
635
636  检查自身命令发送是否过于频繁,控制自身查询和控制命令的发送频度。
637
638### 相关实例
639提供[播控中心Demo](https://gitee.com/openharmony/multimedia_av_session/blob/master/test/resource/controller_index_js.md)的代码实例