HarmonyOS鸿蒙Next中ArkTS录音组件录音过程实时获取amplitude代码实现

HarmonyOS鸿蒙Next中ArkTS录音组件录音过程实时获取amplitude代码实现 我们有个需求需要在录音的时候试试获取音量的最大分贝振幅,咱们华为开发者给了建议使用api:getMaxAmplitudeForInputDevice。我在使用的过程中拿不到值一直报错,使用的代码如下:

try {
    let audioManager = audio.getAudioManager();
    let groupId: number = audio.DEFAULT_VOLUME_GROUP_ID;
    let audioVolumeGroupManager = await audioManager.getVolumeManager().getVolumeGroupManager(groupId)
    let audioRoutingManager: audio.AudioRoutingManager = audioManager.getRoutingManager();
    let capturerInfo: audio.AudioCapturerInfo = { source: audio.SourceType.SOURCE_TYPE_MIC, capturerFlags: 0 }
    let descriptors: audio.AudioDeviceDescriptors = await audioRoutingManager.getPreferredInputDeviceForCapturerInfo(capturerInfo)
    let num = await audioVolumeGroupManager.getMaxAmplitudeForInputDevice(descriptors[0])
    console.log('分贝:' + num)
} catch (e) {
    console.log('')
}

麻烦看下上述代码有什么问题一直失败err,或者说有其它api方案可以达到实时获取的效果


更多关于HarmonyOS鸿蒙Next中ArkTS录音组件录音过程实时获取amplitude代码实现的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

使用如下代码,获取录音&播放音频的最大分贝,有音频播出,但是最大分贝为 0

async function getDeviceInputMaxAmp() {
    try {
        let audioRoutingManager: audio.AudioRoutingManager = this.audioManager.getRoutingManager();
        
        let descriptors: audio.AudioDeviceDescriptors = await audioRoutingManager
            .getPreferredInputDeviceForCapturerInfo(this.audioCapturerOptions.capturerInfo);
        
        let num = await this.audioVolumeGroupManager?.getMaxAmplitudeForInputDevice(descriptors[0]);
        
        console.log('输入分贝: ' + num);
    } catch (e) {
        console.log('分贝: error');
    }
}

async function getDeviceOutputMaxAmp() {
    try {
        let audioRoutingManager: audio.AudioRoutingManager = this.audioManager.getRoutingManager();
        
        let descriptors: audio.AudioDeviceDescriptors = await audioRoutingManager
            .getPreferOutputDeviceForRendererInfo(this.audioRendererOptions.rendererInfo);
        
        let num = await this.audioVolumeGroupManager?.getMaxAmplitudeForOutputDevice(descriptors[0]);
        
        console.log('输出分贝: ' + num);
    } catch (e) {
        console.log('分贝: error');
    }
}

测试代码,注意 getDeviceInputMaxAmpgetDeviceOutputMaxAmp 需要 20ms 循环调用,防止两次调用时间间隔较长

正常输出:输入分贝: 0.021576587110757828

async function aboutToAppear(): Promise<void> {
    console.log('NomalCapturer aboutToAppear');

    await this.initResource();

    this.audioVolumeGroupManager = await this.audioManager
        .getVolumeManager()
        .getVolumeGroupManager(audio.DEFAULT_INTERRUPT_GROUP_ID);

    setInterval(async () => {
        await this.getDeviceInputMaxAmp();
        await this.getDeviceOutputMaxAmp();
    }, 20);
}

async function getDeviceInputMaxAmp() {
    try {
        let audioRoutingManager: audio.AudioRoutingManager = this.audioManager.getRoutingManager();
        let descriptors: audio.AudioDeviceDescriptors = await audioRoutingManager
            .getPreferredInputDeviceForCapturerInfo(this.audioCapturerOptions.capturerInfo);

        let num = await this.audioVolumeGroupManager?.getMaxAmplitudeForInputDevice(descriptors[0]);
        console.log('输入分贝: ' + num);
    } catch (e) {
        console.log('分贝: error');
    }
}

async function getDeviceOutputMaxAmp() {
    try {
        let audioRoutingManager: audio.AudioRoutingManager = this.audioManager.getRoutingManager();
        let descriptors: audio.AudioDeviceDescriptors = await audioRoutingManager
            .getPreferOutputDeviceForRendererInfo(this.audioRendererOptions.rendererInfo);

        let num = await this.audioVolumeGroupManager?.getMaxAmplitudeForOutputDevice(descriptors[0]);
        console.log('输出分贝: ' + num);
    } catch (e) {
        console.log('分贝: error');
    }
}

更多关于HarmonyOS鸿蒙Next中ArkTS录音组件录音过程实时获取amplitude代码实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用ArkTS实现录音过程中实时获取amplitude的代码如下:

import audio from '@ohos.multimedia.audio';
import { BusinessError } from '@ohos.base';

class AudioRecorder {
  private audioRecorder: audio.AudioRecorder | null = null;
  private audioStreamInfo: audio.AudioStreamInfo | null = null;
  private audioRecorderOptions: audio.AudioRecorderOptions | null = null;

  constructor() {
    this.initAudioRecorder();
  }

  private async initAudioRecorder() {
    try {
      this.audioRecorder = await audio.createAudioRecorder();
      this.audioStreamInfo = {
        samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
        channels: audio.AudioChannel.CHANNEL_1,
        sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
        encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
      };
      this.audioRecorderOptions = {
        streamInfo: this.audioStreamInfo,
        uri: 'file:///data/storage/el2/base/haps/entry/files/recording.pcm'
      };
      await this.audioRecorder.prepare(this.audioRecorderOptions);
    } catch (err) {
      console.error(`Failed to initialize audio recorder: ${(err as BusinessError).message}`);
    }
  }

  public async startRecording() {
    if (this.audioRecorder) {
      try {
        await this.audioRecorder.start();
        this.audioRecorder.on('audioAmplitude', (amplitude: number) => {
          console.log(`Current amplitude: ${amplitude}`);
        });
      } catch (err) {
        console.error(`Failed to start recording: ${(err as BusinessError).message}`);
      }
    }
  }

  public async stopRecording() {
    if (this.audioRecorder) {
      try {
        await this.audioRecorder.stop();
        await this.audioRecorder.release();
      } catch (err) {
        console.error(`Failed to stop recording: ${(err as BusinessError).message}`);
      }
    }
  }
}

// Usage
const recorder = new AudioRecorder();
recorder.startRecording();
// To stop recording, call recorder.stopRecording();

该代码通过audio.AudioRecorder组件实现录音,并通过audioAmplitude事件实时获取录音过程中的振幅值。

在HarmonyOS鸿蒙Next中,使用ArkTS实现录音并实时获取振幅(amplitude)的代码如下:

import audio from '@ohos.multimedia.audio';

// 创建录音实例
let audioRecorder = audio.createAudioRecorder();

// 配置录音参数
let audioRecorderConfig = {
  audioEncoder: audio.AudioEncoder.AAC_LC,
  audioSampleRate: audio.AudioSampleRate.SAMPLE_RATE_44100,
  numberOfChannels: audio.AudioChannel.CHANNEL_1,
  format: audio.AudioFormat.AAC_LC,
  uri: 'file:///data/storage/el2/base/cache/recording.aac'
};

// 初始化录音
audioRecorder.prepare(audioRecorderConfig);

// 开始录音
audioRecorder.start();

// 实时获取振幅
audioRecorder.on('audioAmplitude', (amplitude) => {
  console.log('Current amplitude: ' + amplitude);
});

// 停止录音
audioRecorder.stop();

// 释放资源
audioRecorder.release();

此代码通过audioRecorder.on('audioAmplitude', callback)监听振幅变化,并在回调中输出当前振幅值。

回到顶部