在鸿蒙(HarmonyOS)开发中,audiocapture
和 AVRecorder
是两种用于音视频录制的不同模块,其定位和使用场景有显著差异。以下是它们的核心对比及使用建议:
一、功能定位对比
模块 | @ohos.multimedia.audio (AudioCapturer) | @ohos.multimedia.media (AVRecorder) |
---|---|---|
核心功能 | 纯音频采集(原始 PCM 数据) | 音视频混合录制(封装成文件,如 MP4、AAC) |
输出形式 | 原始音频流(需手动编码保存) | 直接生成标准音视频文件 |
适用场景 | 实时音频处理(如语音识别、通话) | 音视频录制保存(如录像、录音机) |
技术复杂度 | 高(需处理编码、同步) | 低(API 封装完善) |
性能开销 | 低(仅采集原始数据) | 较高(需编码和文件 IO) |
二、核心差异详解
1. 输入与输出
-
audiocapture
- 输入:仅支持麦克风音频输入。
- 输出:原始 PCM 数据流(需手动转码为 WAV/MP3)。
- 代码示例:
const audioCapturer = await audio.createAudioCapturer(config); const pcmData = await audioCapturer.read(bufferSize);
-
AVRecorder
- 输入:支持麦克风(音频)和摄像头(视频)输入。
- 输出:直接生成 MP4、AAC 等格式文件。
- 代码示例:
const avRecorder = await media.createAVRecorder(); avRecorder.prepare({ audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, videoSourceType: media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV, outputFormat: media.ContainerFormatType.CFT_MPEG_4, }); avRecorder.start();
2. 功能扩展性
-
audiocapture
- 优势:灵活处理原始音频流(如实时降噪、回声消除)。
- 局限:不直接支持视频录制,文件保存需自行实现编码逻辑。
-
AVRecorder
- 优势:开箱即用的音视频混合录制,支持主流格式和参数配置。
- 局限:难以修改底层编码逻辑(如自定义音频采样率或视频码率)。
3. 典型应用场景
场景 | 推荐模块 | 原因 |
---|---|---|
语音备忘录 | AVRecorder | 直接生成 AAC/MP3 文件,无需处理编码逻辑 |
实时语音通话 | audiocapture | 需要获取原始 PCM 进行网络传输或实时处理 |
视频录制(带音频) | AVRecorder | 支持音视频同步录制,自动封装为 MP4 文件 |
音频分析(如分贝检测) | audiocapture | 直接访问原始 PCM 数据,实时计算音量波形 |
三、代码实现对比
录音并保存为文件
使用 audiocapture
(需手动编码)
import audio from '@ohos.multimedia.audio';
import fs from '@ohos.file.fs';
// 1. 创建采集器
const config: audio.AudioCapturerOptions = { /* 配置参数 */ };
const audioCapturer = await audio.createAudioCapturer(config);
await audioCapturer.start();
// 2. 创建 WAV 文件头
const wavHeader = createWavHeader(sampleRate, channels, bitDepth);
// 3. 采集 PCM 并写入文件
const file = await fs.open('audio.wav', fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
await fs.write(file.fd, wavHeader);
while (isRecording) {
const pcmData = await audioCapturer.read(bufferSize);
await fs.write(file.fd, pcmData);
}
// 4. 释放资源
await audioCapturer.stop();
fs.close(file);
使用 AVRecorder
(自动编码)
import media from '@ohos.multimedia.media';
// 1. 创建录制器
const avRecorder = await media.createAVRecorder();
// 2. 配置参数
await avRecorder.prepare({
audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
outputFormat: media.ContainerFormatType.CFT_MPEG_4,
audioEncoder: media.AudioEncoderType.AUDIO_AAC,
audioEncodeBitRate: 128000,
url: 'file:///data/storage/audio.aac'
});
// 3. 开始录制
await avRecorder.start();
// 4. 停止并保存
setTimeout(async () => {
await avRecorder.stop();
await avRecorder.release();
}, 5000);
四、选择建议
-
选择
audiocapture
当且仅当:- 需要获取 原始音频流 进行实时处理或自定义编码。
- 仅需音频输入,无需视频录制。
- 对录制过程有精细控制需求(如动态调整采样率)。
-
选择
AVRecorder
当且仅当:- 需要快速实现音视频录制并保存为标准文件。
- 需同时录制视频和音频。
- 无需修改底层编码逻辑。
五、混合使用场景
若需同时 录制视频文件 和 实时处理音频,可混合使用两个模块:
// 使用 AVRecorder 录制视频+音频到文件
const avRecorder = await media.createAVRecorder();
avRecorder.prepare({ /* 视频配置 */ });
// 使用 AudioCapturer 单独处理音频流
const audioCapturer = await audio.createAudioCapturer(config);
audioCapturer.start();
// 实时分析音频(不影响 AVRecorder 录制)
audioCapturer.on('data', (pcmBuffer) => {
analyzeVolume(pcmBuffer);
});
// 开始录制
avRecorder.start();
总结:根据需求复杂度选择工具——AVRecorder
适合快速实现标准录制,audiocapture
则为需要深度定制音频处理的场景提供底层支持。