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
使用如下代码,获取录音&播放音频的最大分贝,有音频播出,但是最大分贝为 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');
}
}
测试代码,注意 getDeviceInputMaxAmp
和 getDeviceOutputMaxAmp
需要 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)
监听振幅变化,并在回调中输出当前振幅值。