• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 音频录制流管理
2
3对于录制音频类的应用,开发者需要关注该应用的音频流的状态以做出相应的操作,比如监听到状态为结束时,及时提示用户录制已结束。
4
5## 读取或监听应用内音频流状态变化
6
7参考[使用AudioCapturer开发音频录制功能](using-audiocapturer-for-recording.md)或[audio.createAudioCapturer](../../reference/apis-audio-kit/js-apis-audio.md#audiocreateaudiocapturer8),完成AudioCapturer的创建,然后可以通过以下两种方式查看音频流状态的变化:
8
9- 方法1:直接查看AudioCapturer的[state](../../reference/apis-audio-kit/js-apis-audio.md#属性):
10
11  ```ts
12  let audioCapturerState: audio.AudioState = audioCapturer.state;
13  console.info(`Current state is: ${audioCapturerState }`)
14  ```
15
16- 方法2:注册stateChange监听AudioCapturer的状态变化:
17
18  ```ts
19  audioCapturer.on('stateChange', (capturerState: audio.AudioState) => {
20    console.info(`State change to: ${capturerState}`)
21  });
22  ```
23
24获取state后可对照[AudioState](../../reference/apis-audio-kit/js-apis-audio.md#audiostate8)来进行相应的操作,比如显示录制结束的提示等。
25
26## 读取或监听所有录制流的变化
27
28如果部分应用需要查询获取所有音频流的变化信息,可以通过AudioStreamManager读取或监听所有音频流的变化。
29
30> **说明:**
31>
32> 对于标记为系统接口(system api)的音频流变化信息需要系统级别应用才可查看,若应用不是系统应用,将无法获取准确信息。
33
34如下为音频流管理调用关系图:
35
36![Invoking relationship of recording stream management](figures/invoking-relationship-recording-stream-mgmt.png)
37
38在进行应用开发的过程中,开发者需要使用getStreamManager()创建一个AudioStreamManager实例,进而通过该实例管理音频流。开发者可通过调用on('audioCapturerChange')监听音频流的变化,在音频流状态变化、设备变化时获得通知,同时可通过off('audioCapturerChange')取消相关事件的监听。另外,开发者可以通过主动调用getCurrentAudioCapturerInfoArray()查询录制流的唯一ID、录制流客户端的UID、以及流状态等信息。
39
40详细API含义可参考[音频管理API文档AudioStreamManager](../../reference/apis-audio-kit/js-apis-audio.md#audiostreammanager9)。
41
42
43## 开发步骤及注意事项
44
451. 创建AudioStreamManager实例。
46     在使用AudioStreamManager的API前,需要使用getStreamManager()创建一个AudioStreamManager实例。
47
48   ```ts
49   import audio from '@ohos.multimedia.audio';
50   import { BusinessError } from '@ohos.base';
51
52   let audioManager = audio.getAudioManager();
53   let audioStreamManager = audioManager.getStreamManager();
54   ```
55
562. 使用on('audioCapturerChange')监听音频录制流更改事件。 如果音频流监听应用需要在音频录制流状态变化、设备变化时获取通知,可以订阅该事件。
57
58   ```ts
59   audioStreamManager.on('audioCapturerChange', (AudioCapturerChangeInfoArray: audio.AudioCapturerChangeInfoArray) =>  {
60     for (let i = 0; i < AudioCapturerChangeInfoArray.length; i++) {
61       console.info(`## CapChange on is called for element ${i} ##`);
62       console.info(`StreamId for ${i} is: ${AudioCapturerChangeInfoArray[i].streamId}`);
63       console.info(`Source for ${i} is: ${AudioCapturerChangeInfoArray[i].capturerInfo.source}`);
64       console.info(`Flag  ${i} is: ${AudioCapturerChangeInfoArray[i].capturerInfo.capturerFlags}`);
65       let devDescriptor: audio.AudioDeviceDescriptors = AudioCapturerChangeInfoArray[i].deviceDescriptors;
66       for (let j = 0; j < AudioCapturerChangeInfoArray[i].deviceDescriptors.length; j++) {
67         console.info(`Id: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].id}`);
68         console.info(`Type: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceType}`);
69         console.info(`Role: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceRole}`);
70         console.info(`Name: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].name}`);
71         console.info(`Address: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].address}`);
72         console.info(`SampleRates: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].sampleRates[0]}`);
73         console.info(`ChannelCounts ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelCounts[0]}`);
74         console.info(`ChannelMask: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelMasks}`);
75       }
76     }
77   });
78   ```
79
803. (可选)使用off('audioCapturerChange')取消监听音频录制流变化。
81
82   ```ts
83   audioStreamManager.off('audioCapturerChange');
84   console.info('CapturerChange Off is called');
85   ```
86
874. (可选)使用getCurrentAudioCapturerInfoArray()获取当前音频录制流的信息。
88     该接口可获取音频录制流唯一ID,音频录制客户端的UID,音频状态以及音频捕获器的其他信息。
89   > **说明:**
90   > 对所有音频流状态进行监听的应用需要[声明权限](../../security/AccessToken/declare-permissions.md)ohos.permission.USE_BLUETOOTH,否则无法获得实际的设备名称和设备地址信息,查询到的设备名称和设备地址(蓝牙设备的相关属性)将为空字符串。
91
92   ```ts
93   async function getCurrentAudioCapturerInfoArray(){
94     await audioStreamManager.getCurrentAudioCapturerInfoArray().then((AudioCapturerChangeInfoArray: audio.AudioCapturerChangeInfoArray) => {
95       console.info('getCurrentAudioCapturerInfoArray  Get Promise Called ');
96       if (AudioCapturerChangeInfoArray != null) {
97         for (let i = 0; i < AudioCapturerChangeInfoArray.length; i++) {
98           console.info(`StreamId for ${i} is: ${AudioCapturerChangeInfoArray[i].streamId}`);
99           console.info(`Source for ${i} is: ${AudioCapturerChangeInfoArray[i].capturerInfo.source}`);
100           console.info(`Flag  ${i} is: ${AudioCapturerChangeInfoArray[i].capturerInfo.capturerFlags}`);
101           for (let j = 0; j < AudioCapturerChangeInfoArray[i].deviceDescriptors.length; j++) {
102             console.info(`Id: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].id}`);
103             console.info(`Type: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceType}`);
104             console.info(`Role: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].deviceRole}`);
105             console.info(`Name: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].name}`);
106             console.info(`Address: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].address}`);
107             console.info(`SampleRates: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].sampleRates[0]}`);
108             console.info(`ChannelCounts ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelCounts[0]}`);
109             console.info(`ChannelMask: ${i} : ${AudioCapturerChangeInfoArray[i].deviceDescriptors[j].channelMasks}`);
110           }
111         }
112       }
113     }).catch((err: BusinessError) => {
114       console.error(`Invoke getCurrentAudioCapturerInfoArray failed, code is ${err.code}, message is ${err.message}`);
115     });
116   }
117   ```
118