• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 音频播放流管理
2<!--Kit: Audio Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @songshenke-->
5<!--Designer: @caixuejiang; @hao-liangfei; @zhanganxiang-->
6<!--Tester: @Filger-->
7<!--Adviser: @zengyawen-->
8
9对于播放音频类的应用,开发者需要关注该应用的音频流的状态以做出相应的操作,比如监听到状态为播放中/暂停时,及时改变播放按钮的UI显示。
10
11## 读取或监听应用内音频流状态变化
12
13参考[使用AudioRenderer开发音频播放功能](using-audiorenderer-for-playback.md)或[audio.createAudioRenderer](../../reference/apis-audio-kit/arkts-apis-audio-f.md#audiocreateaudiorenderer8),完成AudioRenderer的创建,然后可以通过以下两种方式查看音频流状态的变化:
14
15- 方法1:直接查看AudioRenderer的[state](../../reference/apis-audio-kit/arkts-apis-audio-AudioRenderer.md#属性):
16
17  ```ts
18  import { audio } from '@kit.AudioKit';
19
20  let audioRendererState: audio.AudioState = audioRenderer.state;
21  console.info(`Current state is: ${audioRendererState }`)
22  ```
23
24- 方法2:注册stateChange监听AudioRenderer的状态变化:
25
26  ```ts
27  import { audio } from '@kit.AudioKit';
28
29  audioRenderer.on('stateChange', (rendererState: audio.AudioState) => {
30    console.info(`State change to: ${rendererState}`)
31  });
32  ```
33
34获取state后可对照[AudioState](../../reference/apis-audio-kit/arkts-apis-audio-e.md#audiostate8)来进行相应的操作,比如更改暂停播放按钮的显示等。
35
36## 读取或监听所有音频流的变化
37
38如果部分应用需要查询获取所有音频流的变化信息,可以通过AudioStreamManager读取或监听所有音频流的变化。
39
40<!--Del-->
41> **说明:**
42>
43> 对于标记为系统接口(system api)的音频流变化信息需要系统级别应用才可查看,若应用不是系统应用,将无法获取准确信息。
44<!--DelEnd-->
45
46如下为音频流管理调用关系图:
47
48![Audio stream management invoking relationship](figures/audio-stream-mgmt-invoking-relationship.png)
49
50在进行应用开发的过程中,开发者需要使用getStreamManager()创建一个AudioStreamManager实例,进而通过该实例管理音频流。开发者可通过调用on('audioRendererChange')监听音频流的变化,在音频流状态变化、设备变化时获得通知。同时可通过off('audioRendererChange')取消相关事件的监听。另外,开发者可以主动调用getCurrentAudioRendererInfoArray()来查询播放流的唯一ID、播放流客户端的UID、音频流状态等信息。
51
52详细API含义可参考[AudioStreamManager](../../reference/apis-audio-kit/arkts-apis-audio-AudioStreamManager.md)。
53
54## 开发步骤及注意事项
55
561. 创建AudioStreamManager实例。
57   在使用AudioStreamManager的API前,需要使用getStreamManager()创建一个AudioStreamManager实例。
58
59   ```ts
60   import { audio } from '@kit.AudioKit';
61
62   let audioManager = audio.getAudioManager();
63   let audioStreamManager = audioManager.getStreamManager();
64   ```
65
662. 使用on('audioRendererChange')监听音频播放流的变化。 如果音频流监听应用需要在音频播放流状态变化、设备变化时获取通知,可以订阅该事件。
67
68   ```ts
69   import { audio } from '@kit.AudioKit';
70
71   audioStreamManager.on('audioRendererChange',  (AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
72     for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
73       let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
74       console.info(`## RendererChange on is called for ${i} ##`);
75       console.info(`StreamId for ${i} is: ${AudioRendererChangeInfo.streamId}`);
76       console.info(`Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content}`);
77       console.info(`Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage}`);
78       console.info(`Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags}`);
79       for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
80         console.info(`Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id}`);
81         console.info(`Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType}`);
82         console.info(`Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole}`);
83         console.info(`Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name}`);
84         console.info(`Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address}`);
85         console.info(`SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]}`);
86         console.info(`ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]}`);
87         console.info(`ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks}`);
88       }
89     }
90   });
91   ```
92
933. (可选)使用off('audioRendererChange')取消监听音频播放流变化。
94
95   ```ts
96   audioStreamManager.off('audioRendererChange');
97   console.info('RendererChange Off is called ');
98   ```
99
1004. (可选)使用getCurrentAudioRendererInfoArray()获取所有音频播放流的信息。
101     该接口可获取音频播放流唯一ID、音频播放客户端的UID、音频状态以及音频播放器的其他信息。
102   > **说明:**
103   >
104   > 对所有音频流状态进行监听的应用需要[声明权限](../../security/AccessToken/declare-permissions.md)ohos.permission.USE_BLUETOOTH,否则无法获得实际的设备名称和设备地址信息,查询到的设备名称和设备地址(蓝牙设备的相关属性)将为空字符串。
105
106   ```ts
107   import { audio } from '@kit.AudioKit';
108   import { BusinessError } from '@kit.BasicServicesKit';
109
110   async function getCurrentAudioRendererInfoArray(): Promise<void> {
111     await audioStreamManager.getCurrentAudioRendererInfoArray().then((AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
112       console.info(`getCurrentAudioRendererInfoArray  Get Promise is called `);
113       if (AudioRendererChangeInfoArray != null) {
114         for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
115           let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
116           console.info(`StreamId for ${i} is: ${AudioRendererChangeInfo.streamId}`);
117           console.info(`Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content}`);
118           console.info(`Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage}`);
119           console.info(`Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags}`);
120           for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
121             console.info(`Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id}`);
122             console.info(`Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType}`);
123             console.info(`Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole}`);
124             console.info(`Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name}`);
125             console.info(`Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address}`);
126             console.info(`SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]}`);
127             console.info(`ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]}`);
128             console.info(`ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks}`);
129           }
130         }
131       }
132     }).catch((err: BusinessError ) => {
133       console.error(`Invoke getCurrentAudioRendererInfoArray failed, code is ${err.code}, message is ${err.message}`);
134     });
135   }
136   ```
137