• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 本地媒体会话概述
2<!--Kit: AVSession Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @ccfriend; @liao_qian-->
5<!--Designer: @ccfriend-->
6<!--Tester: @chenmingxi1_huawei-->
7<!--Adviser: @zengyawen-->
8
9## 交互过程
10
11本地媒体会话的数据源均在设备本地,交互过程如图所示。
12
13![Local AVSession Interaction Process](figures/local-avsession-interaction-process.png)
14
15此过程中涉及两大角色,媒体会话提供方和媒体会话控制方。
16
17> **说明:**
18>
19> 媒体会话控制方为系统应用,三方应用可以成为媒体会话提供方。
20
21本地媒体会话中,媒体会话提供方通过媒体会话管理器和媒体会话控制方进行信息交互:
22
231. 媒体会话提供方通过AVSessionManager创建AVSession对象。
24
252. 媒体会话提供方通过AVSession对象,设置会话元数据(媒体ID、标题、媒体时长等)、会话播放属性(播放状态、播放倍速、播放位置等)等。
26
273. 媒体会话控制方通过AVSessionManager创建AVSessionController对象。
28
294. 媒体会话控制方通过AVSessionController对象可以监听对应会话元数据变化、播放属性变化等。
30
315. 媒体会话控制方通过AVSessionController对象还可以向媒体会话发送控制命令。
32
336. 媒体会话提供方通过AVSession对象可以监听来自媒体会话控制方的控制命令,例如:“play”播放、“playNext”播放下一首、“fastForward”快进、 “setSpeed”设置播放倍数等。
34
35## 媒体会话管理器
36
37媒体会话管理器(AVSessionManager),提供了管理AVSession的能力,可以创建AVSession、创建AVSessionController、发送系统控制事件,也支持对AVSession的状态进行监听。
38
39实际上,AVSessionManager与AVSession、AVSessionController对象不同,并不是一个具体的对象,它是媒体会话的根命名域。在实际编程过程中,可以通过如下方式引入:
40
41```ts
42import { avSession as AVSessionManager } from '@kit.AVSessionKit';
43```
44
45根命名域中的所有方法都可以作为AVSessionManager的方法。
46
47例如,媒体会话提供方通过AVSessionManager创建媒体会话的示例如下所示:
48
49> **说明:**
50>
51> 以下示例代码仅展示创建AVSession对象的接口调用,应用在真正使用时,需要确保AVSession对象实例在应用后台播放业务活动期间一直存在,避免被系统回收、释放,导致后台发声时被系统管控。
52
53```ts
54import { BusinessError } from '@kit.BasicServicesKit';
55import { avSession } from '@kit.AVSessionKit';
56import { avSession as AVSessionManager } from '@kit.AVSessionKit';
57
58@Entry
59@Component
60struct Index {
61  @State message: string = 'hello world';
62
63  build() {
64    Column() {
65      Text(this.message)
66        .onClick(async () => {
67          // 创建session。
68          let context = this.getUIContext().getHostContext() as Context;
69          let session: AVSessionManager.AVSession = await AVSessionManager.createAVSession(context, 'SESSION_NAME', 'audio');
70          console.info(`session create done : sessionId : ${session.sessionId}`);
71        })
72    }
73    .width('100%')
74    .height('100%')
75  }
76}
77```
78<!--Del-->
79例如,媒体会话控制方通过AVSessionManager创建媒体会话控制器的示例如下所示:
80
81```ts
82// 创建controller。
83async function createController() {
84  // 获取到所有存活session的描述符列表。
85  let descriptorsArray: Array<AVSessionManager.AVSessionDescriptor> = await AVSessionManager.getAllSessionDescriptors();
86  if (descriptorsArray.length > 0) {
87    // 为了演示,我们简单取第一个描述符的sessionId用来创建对应的controller。
88    let sessionId: string = descriptorsArray[0].sessionId;
89    let avSessionController: AVSessionManager.AVSessionController = await AVSessionManager.createController(sessionId);
90    console.info(`controller create done : sessionId : ${avSessionController.sessionId}`);
91  }
92}
93```
94<!--DelEnd-->
95
96更多关于AVSessionManager的方法,可以参考[API文档](../../reference/apis-avsession-kit/arkts-apis-avsession.md)。
97