audio-capturer.md 6.0 KB
Newer Older
Z
zengyawen 已提交
1
# 音频采集开发指导
L
doc  
lwx1059628 已提交
2

Z
zengyawen 已提交
3
## 简介
L
doc  
lwx1059628 已提交
4

Z
zengyawen 已提交
5
AudioCapturer提供了用于获取原始音频文件的方法。开发者可以通过本指导了解应用如何通过AudioCapturer接口的调用实现音频数据的采集。
L
doc  
lwx1059628 已提交
6

Z
zengyawen 已提交
7
- **状态检查**:在进行应用开发的过程中,建议开发者通过on('stateChange')方法订阅AudioCapturer的状态变更。因为针对AudioCapturer的某些操作,仅在音频采集器在固定状态时才能执行。如果应用在音频采集器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。
L
doc  
lwx1059628 已提交
8

Z
zengyawen 已提交
9
## 运作机制
L
doc  
lwx1059628 已提交
10

Z
zengyawen 已提交
11 12 13 14 15 16 17 18 19 20 21 22
该模块提供了音频采集模块的状态变化示意图

**图1** 音频采集状态变化示意图

![audio-capturer-state](figures/audio-capturer-state.png)

**PREPARED状态:** 通过调用create()方法进入到该状态。<br>
**RUNNING状态:** 正在进行音频数据播放,可以在prepared状态通过调用start()方法进入此状态,也可以在stopped状态通过调用start()方法进入此状态。<br>
**STOPPED状态:** 在running状态可以通过stop()方法停止音频数据的播放。<br>
**RELEASED状态:** 在prepared和stop状态,用户均可通过release()方法释放掉所有占用的硬件和软件资源,并且不会再进入到其他的任何一种状态了。<br>

## 约束与限制
Z
zengyawen 已提交
23

Z
zengyawen 已提交
24
开发者在进行音频数据采集功能开发前,需要先对所开发的应用配置麦克风权限(ohos.permission.MICROPHONE),权限配置相关内容可参考:[访问控制授权申请指导](../security/accesstoken-guidelines.md)
Z
zengyawen 已提交
25

Z
zengyawen 已提交
26
## 开发指导
Z
zengyawen 已提交
27

Z
zengyawen 已提交
28
详细API含义可参考:[音频管理API文档AudioCapturer](../reference/apis/js-apis-audio.md#audiocapturer8)
L
doc  
lwx1059628 已提交
29

Z
zengyawen 已提交
30
1. 使用createAudioCapturer()创建一个AudioCapturer实例。
L
doc  
lwx1059628 已提交
31

Z
zengyawen 已提交
32 33 34
   在audioCapturerOptions中设置音频采集器的相关参数。该实例可用于音频采集、控制和获取采集状态,以及注册通知回调。 

   ```js
Z
zengyawen 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
   var audioStreamInfo = {
     samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
     channels: audio.AudioChannel.CHANNEL_1,
     sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
     encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
   }
   
   var audioCapturerInfo = {
     source: audio.SourceType.SOURCE_TYPE_MIC,
     capturerFlags: 1
   }
   
   var audioCapturerOptions = {
     streamInfo: audioStreamInfo,
     capturerInfo: audioCapturerInfo
   }
   
   let audioCapturer = await audio.createAudioCapturer(audioCapturerOptions);
   var state = audioRenderer.state;
L
doc  
lwx1059628 已提交
54 55
   ```

L
li-yifan2 已提交
56
2. (可选)使用on('stateChange')订阅音频采集器状态更改。
Z
zengyawen 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
  如果应用需要在采集器状态更新时进行一些操作,可以订阅该事件。更多事件请参考[API参考文档](../reference/apis/js-apis-audio.md)

  ```js
  audioCapturer.on('stateChange',(state) => {
  console.info('AudioCapturerLog: Changed State to : ' + state)
  switch (state) {
    case audio.AudioState.STATE_PREPARED:
      console.info('--------CHANGE IN AUDIO STATE----------PREPARED--------------');
      console.info('Audio State is : Prepared');
      break;
    case audio.AudioState.STATE_RUNNING:
      console.info('--------CHANGE IN AUDIO STATE----------RUNNING--------------');
      console.info('Audio State is : Running');
      break;
    case audio.AudioState.STATE_STOPPED:
      console.info('--------CHANGE IN AUDIO STATE----------STOPPED--------------');
      console.info('Audio State is : stopped');
      break;
    case audio.AudioState.STATE_RELEASED:
      console.info('--------CHANGE IN AUDIO STATE----------RELEASED--------------');
      console.info('Audio State is : released');
      break;
    default:
      console.info('--------CHANGE IN AUDIO STATE----------INVALID--------------');
      console.info('Audio State is : invalid');
      break;
   }
  });
  ```
L
li-yifan2 已提交
86 87

3. 调用start()方法来启动/恢复采集任务。
Z
zengyawen 已提交
88

L
doc  
lwx1059628 已提交
89 90
   启动完成后,采集器状态将变更为STATE_RUNNING,然后应用可以开始读取缓冲区。

Z
zengyawen 已提交
91
   ```js
L
doc  
lwx1059628 已提交
92 93
   await audioCapturer.start();
   if (audioCapturer.state == audio.AudioState.STATE_RUNNING) {
94
     console.info('AudioRecLog: Capturer started');
L
doc  
lwx1059628 已提交
95
   } else {
96
     console.info('AudioRecLog: Capturer start failed');
L
doc  
lwx1059628 已提交
97 98 99
   }
   ```

L
li-yifan2 已提交
100
4. 使用getBufferSize()方法获取要读取的最小缓冲区大小。
L
doc  
lwx1059628 已提交
101

Z
zengyawen 已提交
102
   ```js
L
doc  
lwx1059628 已提交
103 104 105 106
   var bufferSize = await audioCapturer.getBufferSize();
   console.info('AudioRecLog: buffer size: ' + bufferSize);
   ```

L
li-yifan2 已提交
107
5. 读取采集器的音频数据并将其转换为字节流。重复调用read()方法读取数据,直到应用准备停止采集。   
Z
zengyawen 已提交
108

L
doc  
lwx1059628 已提交
109 110
   参考以下示例,将采集到的数据写入文件。 

Z
zengyawen 已提交
111
   ```js
L
doc  
lwx1059628 已提交
112 113 114 115 116
   import fileio from '@ohos.fileio';
      
   const path = '/data/data/.pulse_dir/capture_js.wav';
   let fd = fileio.openSync(path, 0o102, 0o777);
   if (fd !== null) {
117
     console.info('AudioRecLog: file fd created');
L
doc  
lwx1059628 已提交
118 119
   }
   else{
120 121
     console.info('AudioRecLog: file fd create : FAILED');
     return;
L
doc  
lwx1059628 已提交
122 123 124 125
   }
      
   fd = fileio.openSync(path, 0o2002, 0o666);
   if (fd !== null) {
126
     console.info('AudioRecLog: file fd opened in append mode');
L
doc  
lwx1059628 已提交
127 128 129 130
   }
      
   var numBuffersToCapture = 150;
   while (numBuffersToCapture) {
131 132 133 134 135 136 137
     var buffer = await audioCapturer.read(bufferSize, true);
     if (typeof(buffer) == undefined) {
       console.info('read buffer failed');
     } else {
       var number = fileio.writeSync(fd, buffer);
       console.info('AudioRecLog: data written: ' + number);
     }
L
doc  
lwx1059628 已提交
138
      
139
     numBuffersToCapture--;
L
doc  
lwx1059628 已提交
140 141 142
   }
   ```

L
li-yifan2 已提交
143
6. 采集完成后,调用stop方法,停止录制。
L
doc  
lwx1059628 已提交
144

Z
zengyawen 已提交
145
   ```js
L
doc  
lwx1059628 已提交
146 147
   await audioCapturer.stop();
   if (audioCapturer.state == audio.AudioState.STATE_STOPPED) {
148
     console.info('AudioRecLog: Capturer stopped');
L
doc  
lwx1059628 已提交
149
   } else {
150
     console.info('AudioRecLog: Capturer stop failed');
L
doc  
lwx1059628 已提交
151 152 153
   }
   ```

L
li-yifan2 已提交
154
7. 任务结束,调用release()方法释放相关资源。
L
doc  
lwx1059628 已提交
155

Z
zengyawen 已提交
156
   ```js
L
doc  
lwx1059628 已提交
157 158
   await audioCapturer.release();
   if (audioCapturer.state == audio.AudioState.STATE_RELEASED) {
159
     console.info('AudioRecLog: Capturer released');
L
doc  
lwx1059628 已提交
160
   } else {
161
     console.info('AudioRecLog: Capturer release failed');
L
doc  
lwx1059628 已提交
162 163
   }
   ```