HarmonyOS鸿蒙NEXT应用开发如何使用AVScreenCapture捕获内部音频(非麦克风输入)?

HarmonyOS鸿蒙NEXT应用开发如何使用AVScreenCapture捕获内部音频(非麦克风输入)? 音乐创作、线上音频会议等APP需要开发音频内录,同时需要实时绘制音频波形,请问怎么实现?

3 回复

参考文档:Native实现音频内录

更多关于HarmonyOS鸿蒙NEXT应用开发如何使用AVScreenCapture捕获内部音频(非麦克风输入)?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


AVScreenCapture捕获内部音频

在鸿蒙NEXT中,AVScreenCapture支持捕获内部音频。

使用步骤

  1. 声明权限module.json5文件中声明ohos.permission.CAPTURE_SCREEN权限。

  2. 创建实例与配置

    • 创建AVScreenCapture实例。
    • 调用setAudioSourceType(AudioSourceType.AUDIO_SOURCE_TYPE_INTERNAL)方法将音频源设置为内部音频。
  3. 参数配置 配置AudioCapturerConfig参数,例如采样率、声道数等。

  4. 开始捕获 调用prepare()start()方法即可开始捕获内部音频流。

  5. 获取数据 捕获的音频数据通过回调函数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_SCREENohos.permission.MICROPHONE(即使使用内部音频,该权限仍可能被系统用于音频流标识)。
  • 动态申请权限:在捕获开始前,通过abilityAccessCtrl动态申请CAPTURE_SCREEN权限。
  • 用户提示:开始内录时,系统会自动生成屏幕录制提示框,告知用户正在捕获屏幕/音频,确保符合隐私规范。

4. 控制捕获流程

  • 开始捕获avScreenCaptureInstance.start()
  • 停止捕获avScreenCaptureInstance.stop()。停止后需释放资源。
  • 错误处理:监听error事件,处理可能的中断或权限问题。

注意事项

  • 实时性:音频数据回调频率高,波形计算应尽量高效,避免阻塞UI线程。
  • 格式统一:确保AudioCaptureConfig中的参数(采样率、声道数)与波形计算逻辑匹配。
  • 系统约束:部分场景(如播放DRM保护内容)可能限制内部音频捕获,需测试目标场景兼容性。

此方案直接利用系统提供的内部音频源接口,避免了麦克风输入干扰,适合音乐创作、会议录制等内录需求。

回到顶部