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 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