• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 音频流管理开发指导
2
3## 简介
4
5AudioStreamManager提供了音频流管理的方法。开发者可以通过本指导了解应用如何通过AudioStreamManager管理音频流。
6
7## 运作机制
8
9该模块提供了音频流管理调用关系图
10
11**图1** 音频流管理调用关系图
12
13![zh-ch_image_audio_stream_manager](figures/zh-ch_image_audio_stream_manager.png)
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   ```