HarmonyOS 鸿蒙Next SoundPool播放rawfile目录下的音频资源不发声

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next SoundPool播放rawfile目录下的音频资源不发声

快速点击按钮时播放一个短音频文件,每点击一次播放一次。在使用SoundPool直接播放rawfile目录下的短音频文件没有播放声音。 
 

2 回复

A: 最后确定的方案:创建两个页面全局的soundPool实例,同时对需要播放的音频文件进行预加载,按钮点击时切换不同的soundPool实例播放音频文件。

创建两个soundPool实例:

async function create() {

//创建soundPool实例

soundPool = await media.createSoundPool(10, audioRendererInfo);

soundPool2 = await media.createSoundPool(10, audioRendererInfo);

//注册监听

loadCallback();

finishPlayCallback();

setErrorCallback();

CreatAudio('audio1.mp3')

}

​

预加载音频资源:

async function CreatAudio(path:string) {

let context = getContext(SoundPoolDemo) as common.UIAbilityContext;

let fileDescriptor = await context.resourceManager.getRawFd(path);

soundPool.load(fileDescriptor.fd,fileDescriptor.offset,fileDescriptor.length).then((soundId1: number) => {

console.info('soundPool load uri success');

soundIda=soundId1;

console.log(`${soundId1}`)

}).catch((err: BusinessError) => {

console.error('soundPool load failed and catch error is ' + err.message);

})

soundPool2.load(fileDescriptor.fd,fileDescriptor.offset,fileDescriptor.length).then((soundId2: number) => {

console.info('soundPool load uri success');

soundIdb=soundId2;

console.log(`${soundId2}`)

}).catch((err: BusinessError) => {

console.error('soundPool load failed and catch error is ' + err.message);

})

}

​

设置音频加载完成的监听:

async function loadCallback() {

soundPool.on('loadComplete', (soundId_: number) => {

console.info('loadComplete, soundId: ' + soundId_);

})

soundPool2.on('loadComplete', (soundId_: number) => {

console.info('loadComplete, soundId: ' + soundId_);

})

}

​

设置播放完成监听:

async function finishPlayCallback() {

soundPool.on('playFinished', () => {

console.info("recive play finished message");

})

soundPool2.on('playFinished', () => {

console.info("recive play finished message");

})

}

​

设置播放错误监听:

function setErrorCallback() {

soundPool.on('error', (error) => {

console.info('error happened,message is :' + error.message);

})

soundPool2.on('error', (error) => {

console.info('error happened,message is :' + error.message);

})

}

​

音频播放:

async function PlaySoundPool1() {

console.log("开始播放");

streamIda = await soundPool.play(soundIda,PlayParameters);

}

async function PlaySoundPool2() {

console.log("开始播放");

streamIdb = await soundPool2.play(soundIdb,PlayParameters);

}

​

停止播放并释放资源关闭监听:

async function release() {

if (streamIda!=0 || streamIdb!=0) {

//终止指定流的播放

soundPool.stop(streamIda);

soundPool2.stop(streamIdb);

// 卸载音频资源

await soundPool.unload(soundIda);

await soundPool2.unload(soundIdb);

}

//关闭监听

setOffCallback();

// 释放SoundPool

await soundPool.release();

await soundPool2.release();

}

async function unload(){

//终止指定流的播放

soundPool.stop(streamIda);

soundPool2.stop(streamIdb);

// 卸载音频资源

await soundPool.unload(soundIda);

await soundPool2.unload(soundIdb);

}

//关闭监听

function setOffCallback() {

soundPool.off('loadComplete');

soundPool.off('playFinished');

soundPool.off('error');

soundPool2.off('loadComplete');

soundPool2.off('playFinished');

soundPool2.off('error');

}

​

ArKTS中的调用:

@Entry

@Component

struct SoundPoolDemo {

@State message: string = '播放音频';

async aboutToAppear(): Promise<void> {

create();

}

async aboutToDisappear() {

release();

}

build() {

Row() {

Column() {

Text(this.message)

.fontSize(50)

.fontWeight(FontWeight.Bold)

Button('切换音频1').onClick((event: ClickEvent) => {

console.log((new Date().getTime()).toString())

unload()

CreatAudio('audio1.mp3')

console.log((new Date().getTime()).toString())

})

Button('切换音频2').onClick((event: ClickEvent) => {

unload()

CreatAudio('muyu0.mp3')

})

Button('播放').onClick((event: ClickEvent) => {

flag == true?PlaySoundPool1():PlaySoundPool2();

flag=!flag

})

}

.width('100%')

}

.height('100%')

}

}

更多关于HarmonyOS 鸿蒙Next SoundPool播放rawfile目录下的音频资源不发声的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next SoundPool播放rawfile目录下的音频资源不发声的问题,以下是一些可能的解决方案:

  1. 检查音频资源:确保音频文件已正确放置在rawfile目录下,并且文件格式被HarmonyOS鸿蒙Next系统支持。支持的音频格式包括AAC、MPEG(MP3)、Flac、Vorbis等。
  2. 加载音频资源:使用SoundPool的load方法加载音频资源时,需要传入正确的文件描述符(fd)。确保通过resourceManager.getRawFd方法获取到的fd是有效的。
  3. 检查播放参数:配置正确的播放参数,如循环次数、播放速率、音量等。错误的参数设置可能导致播放失败。
  4. 监听回调:注册并监听SoundPool的加载完成、播放完成和错误回调,以便在加载或播放过程中出现问题时及时获取错误信息。

如果以上步骤均无法解决问题,可能是SoundPool的API使用不当或系统存在bug。此时,建议检查SoundPool的API文档和开发者指南,确保使用正确的方法和参数。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部