1# 音频流管理开发指导 2 3## 简介 4 5AudioStreamManager提供了音频流管理的方法。开发者可以通过本指导了解应用如何通过AudioStreamManager管理音频流。 6 7## 运作机制 8 9该模块提供了音频流管理调用关系图 10 11**图1** 音频流管理调用关系图 12 13 14 15**说明**:在进行应用开发的过程中,开发者需要使用getStreamManager()创建一个AudioStreamManager实例,进而通过该实例管理音频流。开发者可通过调用on('audioRendererChange')、on('audioCapturerChange')监听音频播放应用和音频录制应用,在应用状态变化、设备变化、音频属性变化时获得通知。同时可通过off('audioRendererChange')、off('audioCapturerChange')取消相关事件的监听。与此同时,开发者可以通过调用(可选)使用getCurrentAudioRendererInfoArray()获取当前音频播放应用的音频流唯一ID、音频播放客户端的UID、音频状态等信息,同理可调用getCurrentAudioCapturerInfoArray()获取音频录制应用的信息。 16 17## 开发指导 18 19详细API含义可参考:[音频管理API文档AudioStreamManager](../reference/apis/js-apis-audio.md#audiostreammanager9) 20 211. 创建AudioStreamManager实例。 22 23 在使用AudioStreamManager的API前,需要使用getStreamManager()创建一个AudioStreamManager实例。 24 25 ```js 26 var audioManager = audio.getAudioManager(); 27 var audioStreamManager = audioManager.getStreamManager(); 28 ``` 29 302. (可选)使用on('audioRendererChange')监听音频渲染器更改事件。 31如果音频流监听应用需要在音频播放应用状态变化、设备变化、音频属性变化时获取通知,可以订阅该事件。更多事件请参考[API参考文档](../reference/apis/js-apis-audio.md)。 32 33 ```js 34 audioStreamManager.on('audioRendererChange', (AudioRendererChangeInfoArray) => { 35 for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) { 36 AudioRendererChangeInfo = AudioRendererChangeInfoArray[i]; 37 console.info('## RendererChange on is called for ' + i + ' ##'); 38 console.info('StreamId for ' + i + ' is:' + AudioRendererChangeInfo.streamId); 39 console.info('ClientUid for ' + i + ' is:' + AudioRendererChangeInfo.clientUid); 40 console.info('Content for ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.content); 41 console.info('Stream for ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.usage); 42 console.info('Flag ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.rendererFlags); 43 console.info('State for ' + i + ' is:' + AudioRendererChangeInfo.rendererState); 44 var devDescriptor = AudioRendererChangeInfo.deviceDescriptors; 45 for (let j = 0; j < AudioRendererChangeInfo.deviceDescriptors.length; j++) { 46 console.info('Id:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].id); 47 console.info('Type:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceType); 48 console.info('Role:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceRole); 49 console.info('Name:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].name); 50 console.info('Address:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].address); 51 console.info('SampleRates:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]); 52 console.info('ChannelCounts' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]); 53 console.info('ChannelMask:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelMasks); 54 } 55 } 56 }); 57 ``` 58 593. (可选)使用off('audioRendererChange')取消监听音频渲染器更改事件。 60 61 ```js 62 audioStreamManager.off('audioRendererChange'); 63 console.info('######### RendererChange Off is called #########'); 64 ``` 65 664. (可选)使用on('audioCapturerChange')监听音频捕获器更改事件。 67如果音频流监听应用需要在音频录制应用状态变化、设备变化、音频属性变化时获取通知,可以订阅该事件。更多事件请参考[API参考文档](../reference/apis/js-apis-audio.md)。 68 69 ```js 70 audioStreamManager.on('audioCapturerChange', (AudioCapturerChangeInfoArray) => { 71 for (let i = 0; i < AudioCapturerChangeInfoArray.length; i++) { 72 console.info(' ## audioCapturerChange on is called for element ' + i + ' ##'); 73 console.info('StreamId for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].streamId); 74 console.info('ClientUid for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].clientUid); 75 console.info('Source for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.source); 76 console.info('Flag ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.capturerFlags); 77 console.info('State for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerState); 78 for (let j = 0; j < AudioCapturerChangeInfoArray[i].deviceDescriptors.length; j++) { 79 console.info('Id:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].id); 80 console.info('Type:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceType); 81 console.info('Role:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceRole); 82 console.info('Name:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].name); 83 console.info('Address:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].address); 84 console.info('SampleRates:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].sampleRates[0]); 85 console.info('ChannelCounts' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelCounts[0]); 86 console.info('ChannelMask:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelMasks); 87 } 88 } 89 }); 90 ``` 91 925. (可选)使用off('audioCapturerChange')取消监听音频捕获器更改事件。 93 94 ```js 95 audioStreamManager.off('audioCapturerChange'); 96 console.info('######### CapturerChange Off is called #########'); 97 ``` 98 996. (可选)使用getCurrentAudioRendererInfoArray()获取当前音频渲染器的信息。 100该接口可获取音频流唯一ID,音频播放客户端的UID,音频状态以及音频播放器的其他信息。需注意的是若对第三方音频流监听应用未配置ohos.permission.USE_BLUETOOTH权限,则查询到的设备名称和设备地址为空字符串,若正确配置权限,则显示的实际的设备名称和设备地址信息。 101 102 ```js 103 await audioStreamManager.getCurrentAudioRendererInfoArray().then( function (AudioRendererChangeInfoArray) { 104 console.info('######### Get Promise is called ##########'); 105 if (AudioRendererChangeInfoArray != null) { 106 for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) { 107 AudioRendererChangeInfo = AudioRendererChangeInfoArray[i]; 108 console.info('StreamId for ' + i +' is:' + AudioRendererChangeInfo.streamId); 109 console.info('ClientUid for ' + i + ' is:' + AudioRendererChangeInfo.clientUid); 110 console.info('Content ' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.content); 111 console.info('Stream' + i +' is:' + AudioRendererChangeInfo.rendererInfo.usage); 112 console.info('Flag' + i + ' is:' + AudioRendererChangeInfo.rendererInfo.rendererFlags); 113 console.info('State for ' + i + ' is:' + AudioRendererChangeInfo.rendererState); 114 var devDescriptor = AudioRendererChangeInfo.deviceDescriptors; 115 for (let j = 0; j < AudioRendererChangeInfo.deviceDescriptors.length; j++) { 116 console.info('Id:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].id); 117 console.info('Type:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceType); 118 console.info('Role:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].deviceRole); 119 console.info('Name:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].name); 120 console.info('Address:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].address); 121 console.info('SampleRates:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]); 122 console.info('ChannelCounts' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]); 123 console.info('ChannelMask:' + i + ':' + AudioRendererChangeInfo.deviceDescriptors[j].channelMasks); 124 } 125 } 126 } 127 }).catch((err) => { 128 console.log('getCurrentAudioRendererInfoArray :ERROR: ' + err.message); 129 }); 130 ``` 131 1327. (可选)使用getCurrentAudioCapturerInfoArray()获取当前音频捕获器的信息。 133该接口可获取音频流唯一ID,音频录制客户端的UID,音频状态以及音频捕获器的其他信息。需注意的是若对第三方音频流监听应用未配置ohos.permission.USE_BLUETOOTH权限,则查询到的设备名称和设备地址为空字符串,若正确配置权限,则显示的实际的设备名称和设备地址信息。 134 135 ```js 136 await audioStreamManager.getCurrentAudioCapturerInfoArray().then( function (AudioCapturerChangeInfoArray) { 137 console.info('getCurrentAudioCapturerInfoArray: **** Get Promise Called ****'); 138 if (AudioCapturerChangeInfoArray != null) { 139 for (let i = 0; i < AudioCapturerChangeInfoArray.length; i++) { 140 console.info('StreamId for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].streamId); 141 console.info('ClientUid for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].clientUid); 142 console.info('Source for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.source); 143 console.info('Flag ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerInfo.capturerFlags); 144 console.info('State for ' + i + 'is:' + AudioCapturerChangeInfoArray[i].capturerState); 145 var devDescriptor = AudioCapturerChangeInfoArray[i].deviceDescriptors; 146 for (let j = 0; j < AudioCapturerChangeInfoArray[i].deviceDescriptors.length; j++) { 147 console.info('Id:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].id); 148 console.info('Type:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceType); 149 console.info('Role:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceRole); 150 console.info('Name:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].name) 151 console.info('Address:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].address); 152 console.info('SampleRates:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].sampleRates[0]); 153 console.info('ChannelCounts' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelCounts[0]); 154 console.info('ChannelMask:' + i + ':' + AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelMasks); 155 } 156 } 157 } 158 }).catch((err) => { 159 console.log('getCurrentAudioCapturerInfoArray :ERROR: ' + err.message); 160 }); 161 ```