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

L
update  
lwx1059628 已提交
3
## 场景介绍
L
doc  
lwx1059628 已提交
4 5 6

AudioCapturer提供了用于获取原始音频文件的方法。开发者可以通过本指导了解应用如何通过AudioCapturer采集音频。

Z
zengyawen 已提交
7
### 状态检查
L
doc  
lwx1059628 已提交
8 9 10

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

Z
zengyawen 已提交
11 12
详细API含义可参考:[音频管理API文档AudioCapturer](../reference/apis/js-apis-audio.md)

L
doc  
lwx1059628 已提交
13 14
## 开发步骤

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

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

   ```js
L
doc  
lwx1059628 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
      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;
   ```

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

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

Z
zengyawen 已提交
45
   ```js
L
doc  
lwx1059628 已提交
46 47 48 49 50 51 52 53 54 55
   await audioCapturer.start();
   if (audioCapturer.state == audio.AudioState.STATE_RUNNING) {
       console.info('AudioRecLog: Capturer started');
   } else {
       console.info('AudioRecLog: Capturer start failed');
   }
   ```

3. 使用getBufferSize()方法获取要读取的最小缓冲区大小。

Z
zengyawen 已提交
56
   ```js
L
doc  
lwx1059628 已提交
57 58 59 60 61
   var bufferSize = await audioCapturer.getBufferSize();
   console.info('AudioRecLog: buffer size: ' + bufferSize);
   ```

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

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

Z
zengyawen 已提交
65
   ```js
L
doc  
lwx1059628 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
   import fileio from '@ohos.fileio';
      
   const path = '/data/data/.pulse_dir/capture_js.wav';
   let fd = fileio.openSync(path, 0o102, 0o777);
   if (fd !== null) {
       console.info('AudioRecLog: file fd created');
   }
   else{
       console.info('AudioRecLog: file fd create : FAILED');
       return;
   }
      
   fd = fileio.openSync(path, 0o2002, 0o666);
   if (fd !== null) {
       console.info('AudioRecLog: file fd opened in append mode');
   }
      
   var numBuffersToCapture = 150;
   while (numBuffersToCapture) {
       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);
       }
      
       numBuffersToCapture--;
   }
   ```

5. 采集完成后,调用stop方法,停止录制。

   ```
   await audioCapturer.stop();
   if (audioCapturer.state == audio.AudioState.STATE_STOPPED) {
       console.info('AudioRecLog: Capturer stopped');
   } else {
       console.info('AudioRecLog: Capturer stop failed');
   }
   ```

6. 任务结束,调用release()方法释放相关资源。

Z
zengyawen 已提交
110
   ```js
L
doc  
lwx1059628 已提交
111 112 113 114 115 116 117
   await audioCapturer.release();
   if (audioCapturer.state == audio.AudioState.STATE_RELEASED) {
       console.info('AudioRecLog: Capturer released');
   } else {
       console.info('AudioRecLog: Capturer release failed');
   }
   ```