本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、音频录制方式

1.1 三种录制方式对比

方式 语言 输出格式 特点 适用场景
AVRecorder ArkTS/JS m4a等编码格式 集成了录音、编码、封装全流程 普通录音,开箱即用
AudioCapturer ArkTS/JS PCM原始数据 需持续读取音频数据,可后处理 专业音频处理、数据分析
OHAudio Native C/C++ PCM原始数据 支持低时延通路 Native层开发、性能要求高

1.2 选择

需要录制音频
    ↓
需要直接生成音频文件(如m4a)?
    ├── 是 → 使用 AVRecorder(开箱即用)
    └── 否 → 需要PCM原始数据
            ├── ArkTS/JS开发 → 使用 AudioCapturer
            └── Native C/C++开发 → 使用 OHAudio

二、各录制方式

2.1 AVRecorder(推荐首选)

定位:用于音频录制的ArkTS/JS API,集成了音频输入录制、音频编码和媒体封装的功能。

输出格式:m4a等编码格式的音频文件

优势

  • 开箱即用,无需关心编码细节

  • 直接生成标准音频文件

  • 支持多种音频格式

// AVRecorder使用示例
import { media } from '@kit.MediaKit';

let avRecorder = await media.createAVRecorder();
await avRecorder.prepare({
    audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
    profile: {
        audioBitrate: 48000,
        audioCodec: media.CodecMimeType.AUDIO_AAC,
        audioSampleRate: 44100,
        audioChannels: 2
    },
    url: 'file:///data/storage/el2/base/haps/entry/files/recording.m4a'
});
await avRecorder.start();

2.2 AudioCapturer(专业数据处理)

定位:用于音频输入的ArkTS/JS API,仅支持PCM格式,需要应用持续读取音频数据。

输出格式:PCM原始数

要求

  • 仅支持PCM格式

  • 需要应用持续读取音频数据

  • 开发者需具备音频处理基础知识

// AudioCapturer使用示例
import { audio } from '@kit.AudioKit';

let audioCapturer = await audio.createAudioCapturer({
    streamInfo: {
        samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
        channels: audio.AudioChannel.CHANNEL_2,
        sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
        encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
    }
});

await audioCapturer.start();
// 持续读取PCM数据
let buffer = await audioCapturer.read(size);

2.3 OHAudio(Native层开发)

定位:用于音频输入的Native API,同时支持普通音频通路和低时延通路。

输出格式:PCM原始数据

适用场景

  • 依赖Native层实现音频输入功能的场景

  • 需要极致性能的音频应用

  • C/C++开发的游戏或应用

  • 需要低时延的实时音频处理

优势

  • Native层实现,性能更优

  • 支持低时延通路

  • C/C++接口,适合跨平台

三、开发音频录制应用须知

3.1 权限申请

应用可以调用麦克风录制音频,但该行为属于隐私敏感行为,在调用麦克风前,需要先向用户申请授权:

权限 说明
ohos.permission.MICROPHONE 麦克风权限,必须申请
// 申请麦克风权限
import { abilityAccessCtrl } from '@kit.AbilityKit';

let atManager = abilityAccessCtrl.createAtManager();
await atManager.requestPermissionsFromUser(context, ['ohos.permission.MICROPHONE']);

3.2 麦克风管理

如何使用和管理麦克风请参考管理麦克风静音状态

3.3 后台录制要求

需求 要求
持续录制或后台录制 必须申请长时任务,避免进入挂起(Suspend)状态
录制启动位置 必须在前台启动,启动后可以退后台
后台启动 在后台启动录制将会失败
// 申请长时任务示例
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';

await backgroundTaskManager.startBackgroundRunning(this.context,
    backgroundTaskManager.BackgroundMode.AUDIO_RECORDING, wantAgent);

3.4 音频流类型选择

录制音频时需要使用合适的录制流类型,请参考使用合适的音频流类型

3.5 屏幕录制

如果需要实现屏幕录制功能,可参考:

核心要点

要点 说明
权限申请 必须申请ohos.permission.MICROPHONE权限
后台录制 必须申请长时任务,且必须在前台启动
AVRecorder 推荐首选,直接生成m4a文件
AudioCapturer 获取PCM原始数据,适合专业处理
OHAudio Native层方案,性能最优

   鸿蒙音频录制提供了AVRecorder(开箱即用,生成m4a)、AudioCapturer(PCM原始数据,专业处理)和OHAudio(Native层,高性能)三种方案,录制前需申请麦克风权限,后台录制需申请长时任务。

Logo

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

更多推荐