引言:语音交互已成为鸿蒙生态的核心能力,本文将深入解析HarmonyOS录音功能的完整实现方案,涵盖API调用、格式选择、权限处理及实战技巧,助你快速集成语音能力!

一、鸿蒙录音核心API详解

鸿蒙通过 @ohos.multimedia.audio 模块提供专业级录音能力,核心类如下:

类名 作用 关键方法
AudioCapturer 音频采集引擎,控制录音流程 start()stop()read()release()
AudioCapturerInfo 配置录音参数(采样率/声道/格式) sampleRatechannelCountsampleFormatencodingType
AudioStreamInfo 定义音频流属性(与系统音频策略交互) samplingRatechannelsformatstreamUsage
二、录音全流程代码实战
步骤1:声明权限(必须!)
// module.json5 添加权限
"requestPermissions": [
  {
    "name": "ohos.permission.MICROPHONE"  // 麦克风权限
  }
]
步骤2:配置录音参数
import audio from '@ohos.multimedia.audio';

// 创建录音配置
const capturerInfo: audio.AudioCapturerInfo = {
  source: audio.SourceType.SOURCE_TYPE_MIC, // 音源类型(麦克风)
  capturerFlags: 0 // 默认标志位
};

const streamInfo: audio.AudioStreamInfo = {
  samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, // 44.1kHz采样率
  channels: audio.AudioChannel.CHANNEL_1,                 // 单声道
  sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 16位小端格式
  encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW   // 原始PCM数据
};

// 创建录音实例
const audioCapturer = await audio.createAudioCapturer(capturerInfo, streamInfo);
步骤3:启动录音并保存文件
// 启动录音
await audioCapturer.start();

// 创建文件保存路径
const filePath = context.filesDir + '/record.pcm';

// 循环读取音频流并写入文件
while (isRecording) {
  const buffer = await audioCapturer.read(bufferSize); // 读取PCM数据
  fs.writeSync(filePath, buffer); // 写入原始PCM文件
}

// 停止录音并释放资源
audioCapturer.stop();
audioCapturer.release();
三、录音文件格式解析

鸿蒙录音默认输出 原始PCM数据,开发者需自主转换为通用格式:

格式 特点 转换方案
WAV 无损音质,含44字节文件头 在PCM数据前添加WAV文件头
AAC 有损压缩,体积小(适合网络传输) 使用avcodec库编码
MP3 通用性强 调用lame等三方库转换

格式选择指南

  • 语音识别场景 → 优先WAV(保证识别准确率)
  • 网络传输场景 → 使用AAC(节省70%流量)
  • 音乐录制场景 → 选择FLAC/WAV(保留高频细节)
 四、进阶实战技巧
1. 实时音频处理
// 在read()后插入音频处理逻辑
const buffer = await audioCapturer.read();
const processedBuffer = noiseReduction(buffer); // 降噪处理
fs.writeSync(filePath, processedBuffer);
2. 分布式录音(鸿蒙独家能力)
// 调用附近手机的麦克风录音
const remoteDeviceId = '123456'; 
const capturer = await audio.createRemoteCapturer(remoteDeviceId, capturerInfo);
3. 录音状态监听
audioCapturer.on('stateChange', (state) => {
  if (state === audio.AudioState.STATE_RELEASED) {
    showToast('录音资源已释放');
  }
});
五、避坑指南
  1. 权限拒绝处理

    try {
      await audioCapturer.start();
    } catch (err) {
      if (err.code === 201) { // 权限未授予
        requestPermissions(); // 触发动态授权
      }
    }
    

    2.中断事件处理

    // 来电时自动暂停录音
    call.on('callStateChange', (state) => {
      if (state === 'ACTIVE') audioCapturer.pause();
    });
    

    3.文件写入优化

    • 使用BufferPool减少IO操作
    • 分块写入避免内存溢出
结语:录音能力扩展思路
  • 语音转文字:对接华为ASR服务(@ohos.ai.asr
  • 声纹识别:提取PCM特征值生成声纹模型
  • 实时翻译:录音流分段发送至翻译引擎
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐