HarmonyOS鸿蒙Next中音频的录制和播放。求!

HarmonyOS鸿蒙Next中音频的录制和播放。求! 在AudioCapture和AudioRender两大文档中,只是提供相关功能。并不提供如何使用这两个功能实现音频的录制和播放。我该如何在应用中实现这两个功能?再者,录制是不是要有且只要申请MICROPHONE权限?如果是的话该如何申请?

5 回复

建议多看官方文档的例子,例子写的挺好的,需要多看 才能熟练运用

更多关于HarmonyOS鸿蒙Next中音频的录制和播放。求!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


第一步,初始化

//1录音 设置录音相关的参数
let audioCapturerOptions: audio.AudioCapturerOptions = {
  streamInfo: {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 采样率
    channels: audio.AudioChannel.CHANNEL_1, // 通道
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
  },
  //录制设备的信息
  capturerInfo: {
    //麦克风
    source: audio.SourceType.SOURCE_TYPE_MIC,
    capturerFlags: 0
  }
};
//将录音参数传进去后创建出录音对象
this.audioCapturer = await audio.createAudioCapturer(audioCapturerOptions)

//音频输入时,音频流 写入到 缓存中的指定文件下
this.audioCapturer.on('readData', (buffer: ArrayBuffer) => { //buffer缓冲区二进制的数据.也是音频流文件
  let uint8Array: Uint8Array = new Uint8Array(buffer);  //将二进制的音频流文件转化格式
  // 可以通过如下方式获取音频流:1、通过录音获取音频流;2、从音频文件中读取音频流
  // 2、从音频文件中读取音频流:demo参考
});  

第二步,开始录音

```javascript
await this.audioCapturer.start();

this.voiceState = VoiceState.VOICING //自己创建一个voiceState变量,更新状态。录音中

第三步,结束录音

```javascript
async closeRecord() {
  //3录音,停止录制
  await this.audioCapturer?.stop();
  this.voiceState = VoiceState.VOICEOVER
}

第四步,获取麦克风权限

```javascript
// 校验权限
permissionPlugin.requestPermissions(['ohos.permission.MICROPHONE'])
  .then(() => {
    window.getLastWindow(getContext())
      .then(win => {
        win.getUIContext()
          .setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE)
      })
  })

如果期间有其他业务需要或调用时机需要自行判断

HarmonyOS Next中音频录制使用AudioCapturer API,支持PCM格式采集。播放使用AudioPlayer API,支持多种音频格式。通过AudioManager管理音频流和焦点。录制参数可设置采样率、声道数、位宽等属性。播放支持本地文件或网络流媒体,提供音量调节、进度控制等功能。音频数据可通过回调或轮询方式获取。系统提供低延迟音频处理能力。

在HarmonyOS Next中实现音频录制和播放,可以通过以下方式:

  1. 音频录制实现:
  • 首先在config.json中声明麦克风权限:
"reqPermissions": [
  {
    "name": "ohos.permission.MICROPHONE",
    "reason": "用于音频录制"
  }
]
  • 代码实现示例:
import audio from '@ohos.multimedia.audio';

// 1. 创建音频录制实例
let audioCapturer = await audio.createAudioCapturer();

// 2. 配置参数
let capturerConfig = {
  audioSampleRate: audio.AudioSampleRate.SAMPLE_RATE_44100,
  audioChannels: audio.AudioChannel.CHANNEL_1,
  audioSampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
  audioEncodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};

// 3. 初始化配置
await audioCapturer.init(capturerConfig);

// 4. 开始录制
await audioCapturer.start();

// 5. 读取音频数据
let buffer = await audioCapturer.read(bufferSize, isBlocking);

// 6. 停止录制
await audioCapturer.stop();
  1. 音频播放实现:
import audio from '@ohos.multimedia.audio';

// 1. 创建音频播放实例
let audioRenderer = await audio.createAudioRenderer();

// 2. 配置参数
let rendererConfig = {
  audioSampleRate: audio.AudioSampleRate.SAMPLE_RATE_44100,
  audioChannels: audio.AudioChannel.CHANNEL_2,
  audioSampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
  audioEncodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};

// 3. 初始化配置
await audioRenderer.init(rendererConfig);

// 4. 开始播放
await audioRenderer.start();

// 5. 写入音频数据
await audioRenderer.write(buffer);

// 6. 停止播放
await audioRenderer.stop();

注意:录制确实只需要申请MICROPHONE权限,运行时还需要动态申请权限:

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

let atManager = abilityAccessCtrl.createAtManager();
try {
  await atManager.requestPermissionsFromUser(this.context, ['ohos.permission.MICROPHONE']);
} catch (err) {
  console.error('权限申请失败');
}
回到顶部