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