HarmonyOS 鸿蒙Next SoundPool播放rawfile目录下的音频资源不发声
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目录下的音频资源不发声的问题,以下是一些可能的解决方案:
- 检查音频资源:确保音频文件已正确放置在rawfile目录下,并且文件格式被HarmonyOS鸿蒙Next系统支持。支持的音频格式包括AAC、MPEG(MP3)、Flac、Vorbis等。
- 加载音频资源:使用SoundPool的load方法加载音频资源时,需要传入正确的文件描述符(fd)。确保通过resourceManager.getRawFd方法获取到的fd是有效的。
- 检查播放参数:配置正确的播放参数,如循环次数、播放速率、音量等。错误的参数设置可能导致播放失败。
- 监听回调:注册并监听SoundPool的加载完成、播放完成和错误回调,以便在加载或播放过程中出现问题时及时获取错误信息。
如果以上步骤均无法解决问题,可能是SoundPool的API使用不当或系统存在bug。此时,建议检查SoundPool的API文档和开发者指南,确保使用正确的方法和参数。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。