HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据
HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据 在使用Audio Kit录制音频数据的时候,指定SourceType(https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-audio-e#sourcetype8)参数为:SOURCE_TYPE_UNPROCESSED,即可获取到麦克风采集到的纯净音频数据(系统不做任何算法处理)
更多关于HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html
如果目标是拿连续 PCM 流做算法处理,建议直接用 AudioCapturer,而不是 AVRecorder 这类偏文件录制的接口。
SourceType.SOURCE_TYPE_UNPROCESSED 可以表达“尽量获取未处理音频”的诉求,但还要注意:
- 仍需声明并动态申请 MICROPHONE 权限。
- 配置采样率、声道数、sampleFormat 后,从 AudioCapturer.read 读取 PCM 数据。
- 不同设备/系统策略下,是否完全关闭所有前处理能力要以实际采集效果验证。
- 如果后续要保存成文件,需要自己补 WAV/PCM 封装或编码流程。
所以结论是:实时原始流走 AudioCapturer;录制成音频文件走 AVRecorder/录音相关封装。
更多关于HarmonyOS 鸿蒙Next中录音流如何获取麦克风原始音频数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
Audio模块下的接口支持PCM编码,包括AudioRenderer、AudioCapturer、TonePlayer、OpenSL ES等。
开发方式选择参考《如何选择音频录制开发方式》《音频录制默认打断策略表》。
示例:参考鸿蒙 gitcode上。

要拿连续的麦克风 PCM 数据,建议用 AudioCapturer,而不是 AVRecorder。AVRecorder 更偏录制成文件,AudioCapturer 才适合边采集边处理。
配置时可以设置采样率、声道数、sampleFormat,并把 sourceType 设为 SOURCE_TYPE_UNPROCESSED 来请求尽量少的系统音效处理。需要注意的是,这个值更像“希望获取未处理音频”的采集源选择,不一定能保证所有设备都绕过硬件或系统链路里的处理。
实际业务里建议按 read() 读取 PCM 帧,再送到算法或编码器;同时检查麦克风权限、设备能力和采样参数是否被系统接受。
帮顶
如果是在 HarmonyOS NEXT Audio Kit 中,将录音源设置为:
sourceType: audio.SourceType.SOURCE_TYPE_UNPROCESSED
理论上表示:
请求系统提供未经 AGC(自动增益)、AEC(回声消除)、NS(降噪)等音频算法处理的原始麦克风数据。
但这里有几个容易误解的地方。
1. SOURCE_TYPE_UNPROCESSED ≠ 100% 原始 PCM
它的真实含义是:
应用请求原始音频
↓
Audio Framework
↓
HAL/驱动
↓
麦克风
系统会尽量关闭:
- AEC(回声消除)
- AGC(自动增益)
- NS(噪声抑制)
- Beamforming(波束成形)
但最终是否真的完全关闭:
取决于设备硬件实现。
部分设备底层 Codec 或 DSP 可能仍然存在:
- High Pass Filter
- DC Offset Filter
- Mic Calibration
这些属于硬件级处理。
所以:
UNPROCESSED
≠
绝对原始ADC数据
而是:
尽可能未经系统音频算法处理
2. 如何拿到实时PCM数据
不要使用:
AVRecorder
因为它主要用于录音文件。
而应该使用:
AudioCapturer
例如:
let capturer = await audio.createAudioCapturer({
streamInfo: {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
},
capturerInfo: {
source: audio.SourceType.SOURCE_TYPE_UNPROCESSED
}
})
然后:
capturer.start()
let buffer = new ArrayBuffer(4096)
let readSize = await capturer.read(buffer)
此时:
buffer
↓
PCM数据
↓
YUV里的ByteBuffer类似概念
你就可以直接:
- 声纹识别
- ASR
- VAD
- RNNoise
- WebRTC
- AI降噪
- 关键词检测
3. 如果做AI语音识别
推荐参数:
16kHz
Mono
PCM16
即:
samplingRate: 16000
channels: 1
sampleFormat: S16LE
这样:
- Whisper
- Sherpa-ONNX
- Porcupine
- PaddleSpeech
- FunASR
都可以直接吃。
4. 如何验证是不是真正的原始音频
录制两份:
第一份
SOURCE_TYPE_MIC
第二份
SOURCE_TYPE_UNPROCESSED
对着风扇录音。
如果:
MIC
↓
风扇噪声明显被压制
而:
UNPROCESSED
↓
风扇噪声完整保留
说明设备支持原始采集路径。
5. HarmonyOS NEXT目前的限制
如果你的目标是:
DSP级原始麦克风数据
例如:
- 声学定位
- 波束成形
- 声源分离
- 超声波通信
- 医疗声学分析
目前公开 Audio Kit 并没有开放:
Mic Raw ADC
DSP Bypass
Audio HAL Direct
这种级别接口。
开发者能拿到的最高级别通常就是:
AudioCapturer
+
SOURCE_TYPE_UNPROCESSED
对于大多数场景(语音识别、声纹识别、AI对话、唤醒词检测),目前 HarmonyOS NEXT 推荐方案也是:
AudioCapturer
+
SOURCE_TYPE_UNPROCESSED
+
PCM实时读取
可以直接用 AudioCapturer,它拿到的是 PCM 原始帧,不要走 AVRecorder 这类文件封装。先声明并动态申请 ohos.permission.MICROPHONE,然后配置 source 为 SOURCE_TYPE_MIC,encodingType 为 ENCODING_TYPE_RAW,sampleFormat 常用 SAMPLE_FORMAT_S16LE。
核心代码:
const capturer = await audio.createAudioCapturer(opt)
capturer.on('readData', (buf: ArrayBuffer) => { /* buf就是PCM */ })
await capturer.start()
如果要落盘,就把 ArrayBuffer 写成 .pcm,播放或算法侧按同采样率、声道数解释。结束时按 stop() -> release()。参考来源:官方《使用AudioCapturer开发音频录制功能》。
在 HarmonyOS Next 中,使用 @ohos.multimedia.audio 的 AudioCapturer 获取麦克风原始 PCM 数据。
创建 AudioCapturer 实例,配置 audioSource 为 MIC,encoding 为 ENCODING_PCM,设置采样率、位深、通道数。
调用 start() 后通过 on('data') 或 read() 接收原始音频缓冲区。
在 HarmonyOS Next 中,创建音频采集实例时,将 SourceType 设置为 SOURCE_TYPE_UNPROCESSED,系统即可输出麦克风原始的未经算法处理的音频数据。该参数位于 audio.AudioCapturerOptions 的 sourceType 属性中,需与 AudioCapturer 配合使用。

