HarmonyOS 鸿蒙Next soundpool使用出现错误,请教
HarmonyOS 鸿蒙Next soundpool使用出现错误,请教
咨询描述:现在我需要实现点击按钮发出声音,当按钮点击很快的时候声音可以重叠于是用了soundpool但是出现错误
”soundPool load failed and catch error is No such file or directory“。
let soundPool: media.SoundPool;
let audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
rendererFlags: 1
}
media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
if (error) {
return;
} else {
let file: fs.File;
let soundID: number = 0;
let fileSize: number = 1; //通过fs.stat()获取size值
let uri: string = "";
//获取fd的描述信息
fs.open('/assets/addsub.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
file = file_;
console.info("file fd: " + file.fd);
uri = 'fd://' + (file.fd).toString()
soundPool = soundPool_;
soundPool.load(uri).then((soundId: number) => {
console.info('soundPool load uri success');
soundID = soundId;
console.info(`createSoundPool success`)
let playParameters: media.PlayParameters = {
loop: 1, // 循环4次
rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
leftVolume: 0.5, // range = 0.0-1.0
rightVolume: 0.5, // range = 0.0-1.0
priority: 0, // 最低优先级
}
soundPool.play(soundId, playParameters).then((streamId: number) => {
console.info('play success');
}, (err: BusinessError) => {
console.error('soundpool play failed and catch error is ' + err.message);
});
})
}, (err: BusinessError) => {
console.error('soundPool load failed and catch error is ' + err.message);
});
}
})
更多关于HarmonyOS 鸿蒙Next soundpool使用出现错误,请教的实战教程也可以访问 https://www.itying.com/category-93-b0.html
看你的报错内容,初步判断是soundPool的文件路径没有找到,请检查一下soundPool文件的路径是否正确。
以下是提供的方案,请您及时验证:
1、entry/src/main/ets/assets下的文件不能通过fs.open(’/assets/addsub.mp3’)获取到,可将需要的音频文件放到resources/rawfile目录或resources/resfile目录下,参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/resource-categories-and-access-V13
2、rawfile目录下文件可通过getContext(this).resourceManager.getRawFdSync(‘assets/addsub.mp3’)获取RawFileDescriptor,通过soundPool.load(fileDesc.fd,fileDesc.offset,fileDesc.length)加载,且只能通过这种方式加载,不能通过uri的形式加载;
3、resfile目录下文件可通过fs.open(getContext(this).resourceDir + ‘/assets/addsub.mp3’, fs.OpenMode.READ_ONLY)方式获取到文件,通过soundPool.load(‘fd://’ + (file.fd))加载;
4、soundPool.load()的回调中并未真正加载成功,不能在load的回调中直接play,可以在media.createSoundPool()创建soundPool实例后,在soundPool实例的回调监听soundPool.on(‘loadComplete’)中调用play方法。
参考demo如下:
import { media } from '[@kit](/user/kit).MediaKit';
import { audio } from '[@kit](/user/kit).AudioKit';
import { BusinessError } from '[@kit](/user/kit).BasicServicesKit';
import { common } from '[@kit](/user/kit).AbilityKit';
[@Entry](/user/Entry)
[@Component](/user/Component)
struct BorderExample3 {
private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
build() {
Button("测试").onClick(() => {
let soundPool: media.SoundPool;
let audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
rendererFlags: 1
};
media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
if (error) {
return;
} else {
console.info(`createSoundPool success`);
this.setCallBack(soundPool_);
let file = this.context.resourceManager.getRawFdSync('assets/addsub.mp3');
soundPool = soundPool_;
soundPool.load(file.fd, file.offset, file.length).then((soundId: number) => {
console.info('soundPool load uri success');
});
}
});
});
}
setCallBack(soundPool: media.SoundPool) {
soundPool.on('loadComplete', (soundId: number) => {
console.info('[SoundPoolDemo] loadComplete success,soundId:' + soundId);
let playParameters: media.PlayParameters = {
loop: 1, // 循环1次
rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
leftVolume: 0.5, // 范围 = 0.0-1.0
rightVolume: 0.5, // 范围 = 0.0-1.0
priority: 0 // 最低优先级
};
soundPool.play(soundId, playParameters).then((streamId: number) => {
console.info('play success');
}, (err: BusinessError) => {
console.error('soundpool play failed and catch error is ' + err.message);
});
});
soundPool.on('playFinished', () => {
console.info('[SoundPoolDemo] playFinished success');
});
soundPool.on('error', (error: BusinessError) => {
console.error(`error happened, and error is ${JSON.stringify(error)}`);
});
}
}
更多关于HarmonyOS 鸿蒙Next soundpool使用出现错误,请教的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
大概率是文件路径的问题,检查一下自己的路径,哪个 /assets/addsup.mp3 可能在实际运行的时候路径不正确,导致fs.open找不到文件,然后出现一串错误。
还有就是文件权限的问题,即使文件路径正确,但是如果应用没有足够的权限去读取该音频文件,也会出现找不到文件的类似错误提示。
SoundPool 本身的初始化参数或者配置问题,索然概率很小,但是也有一丢丢的可能,可以认真核查一下传入的参数是不是按照规定进行的。比如重新检查media.createSoundPool
函数传入的参数,如音频渲染器相关信息(audio.AudioRendererInfo
)中的各项属性值是否符合 HarmonyOS NEXT 文档中规定的要求。确保usage
、rendererFlags
等参数设置正确,例如STREAM_USAGE_MUSIC
这个使用场景的设置是否适用于当前音频播放的实际需求等。
针对HarmonyOS鸿蒙Next系统中soundpool使用出现错误的问题,以下是一些可能的解决方案:
- 检查资源加载:确保音频资源已正确加载到soundpool中,如果资源加载失败或路径错误,可能导致播放时出错。
- 并发流限制:soundpool有并发流数量的限制,如果尝试播放的音频流数量超过了soundpool的最大支持数,则需要先卸载不再需要的音频资源。
- 音频格式支持:检查音频文件的格式是否被soundpool支持,HarmonyOS鸿蒙Next系统支持的音频格式包括AAC、MPEG(MP3)、Flac、Vorbis等,但不支持WMV格式。
- 播放参数设置:检查播放参数(如循环次数、播放速率、音量等)是否设置正确,错误的参数设置可能导致播放失败。
如果以上措施均无法解决问题,建议仔细查阅soundpool的API文档和开发者指南,确保使用正确的方法和参数。同时,也可以考虑检查系统日志,以获取更详细的错误信息。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。