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)的代码实例