HarmonyOS鸿蒙NEXT应用开发如何使用AVScreenCapture捕获内部音频(非麦克风输入)?
HarmonyOS鸿蒙NEXT应用开发如何使用AVScreenCapture捕获内部音频(非麦克风输入)? 音乐创作、线上音频会议等APP需要开发音频内录,同时需要实时绘制音频波形,请问怎么实现?
参考文档:Native实现音频内录
更多关于HarmonyOS鸿蒙NEXT应用开发如何使用AVScreenCapture捕获内部音频(非麦克风输入)?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
AVScreenCapture捕获内部音频
在鸿蒙NEXT中,AVScreenCapture支持捕获内部音频。
使用步骤
-
声明权限 在
module.json5文件中声明ohos.permission.CAPTURE_SCREEN权限。 -
创建实例与配置
- 创建AVScreenCapture实例。
- 调用
setAudioSourceType(AudioSourceType.AUDIO_SOURCE_TYPE_INTERNAL)方法将音频源设置为内部音频。
-
参数配置 配置
AudioCapturerConfig参数,例如采样率、声道数等。 -
开始捕获 调用
prepare()和start()方法即可开始捕获内部音频流。 -
获取数据 捕获的音频数据通过回调函数
onAudioBufferAvailable获取。
在HarmonyOS NEXT中,使用AVScreenCapture进行应用内音频捕获(内录)并实时绘制波形,核心是配置AudioCaptureConfig并处理音频数据流。以下是关键步骤和代码要点:
1. 配置与初始化
创建AVScreenCapture实例时,在AudioCaptureConfig中明确设置音频源为内部音频(AVAudioSource.AUDIO_SOURCE_INTERNAL),并指定采样率、声道等参数。
import avScreenCapture from '@ohos.multimedia.avScreenCapture';
import { BusinessError } from '@ohos.base';
let audioCaptureConfig: avScreenCapture.AudioCaptureConfig = {
audioSource: avScreenCapture.AVAudioSource.AUDIO_SOURCE_INTERNAL, // 关键:内部音频源
audioSampleRate: avScreenCapture.AudioSampleRate.AUDIO_SAMPLE_RATE_44100,
audioChannels: avScreenCapture.AudioChannels.AUDIO_CHANNEL_STEREO,
audioCodec: avScreenCapture.AudioCodec.AUDIO_CODEC_AAC
};
let avScreenCaptureInstance: avScreenCapture.AVScreenCapture = avScreenCapture.createAVScreenCapture(audioCaptureConfig);
2. 获取原始音频数据并绘制波形
通过监听audioBufferAvailable事件获取原始的PCM音频数据块,直接用于波形计算。
import buffer from '@ohos.buffer';
avScreenCaptureInstance.on('audioBufferAvailable', (audioBuffer: ArrayBuffer) => {
// audioBuffer 为PCM格式的原始音频数据
let pcmData: Int16Array = new Int16Array(audioBuffer);
// 实时计算波形数据(例如:计算均方根振幅)
let rms: number = calculateRMS(pcmData);
// 更新UI波形绘制(需在主线程通过ArkUI状态更新)
updateWaveform(rms);
});
function calculateRMS(pcmData: Int16Array): number {
let sum: number = 0;
for (let i: number = 0; i < pcmData.length; i++) {
sum += pcmData[i] * pcmData[i];
}
return Math.sqrt(sum / pcmData.length);
}
UI层可通过Canvas组件实时绘制波形,将计算出的振幅(如RMS)映射为图形高度。
3. 权限与隐私
- 必须配置权限:在
module.json5中声明ohos.permission.CAPTURE_SCREEN和ohos.permission.MICROPHONE(即使使用内部音频,该权限仍可能被系统用于音频流标识)。 - 动态申请权限:在捕获开始前,通过
abilityAccessCtrl动态申请CAPTURE_SCREEN权限。 - 用户提示:开始内录时,系统会自动生成屏幕录制提示框,告知用户正在捕获屏幕/音频,确保符合隐私规范。
4. 控制捕获流程
- 开始捕获:
avScreenCaptureInstance.start()。 - 停止捕获:
avScreenCaptureInstance.stop()。停止后需释放资源。 - 错误处理:监听
error事件,处理可能的中断或权限问题。
注意事项
- 实时性:音频数据回调频率高,波形计算应尽量高效,避免阻塞UI线程。
- 格式统一:确保
AudioCaptureConfig中的参数(采样率、声道数)与波形计算逻辑匹配。 - 系统约束:部分场景(如播放DRM保护内容)可能限制内部音频捕获,需测试目标场景兼容性。
此方案直接利用系统提供的内部音频源接口,避免了麦克风输入干扰,适合音乐创作、会议录制等内录需求。

