HarmonyOS 鸿蒙Next soundpool在load后立即执行play操作会报错
由于soundPool最多支持32个并行流,所以我超过32个的音频文件只能使用时先load再play,但play操作会报错5400102,这是为什么?
let sound = this.mSoundPoolMap.get(str);
if (sound == undefined) {
let unInitSound = this.mUnInitSoundMap.get(str);
if (this.soundPool != undefined && unInitSound != undefined) {
let file = getContext().resourceManager.getRawFdSync(unInitSound.res);
this.soundPool.load(file.fd, file.offset, file.length, (error: BusinessError, soundId: number) => {
if (this.soundPool != undefined) {
this.soundPool.play(soundId, playParameters, (error: BusinessError, id: number) => {
LogUtil.error(`Failed to play : errCode is ${error.code}, errMessage is ${error.message} `);
LogUtil.error('error = ' + error + ', id = ' + id);
this.mCurrentStreamId = id;
});
}
});
}
}
更多关于HarmonyOS 鸿蒙Next soundpool在load后立即执行play操作会报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
报错5400102当前操作不允许:
soundpool当前最多支持32个并行流。soundpool不支持多实例,多次创建对应的是同个实例
加载音频资源时,soundPool.load()的回调中并未真正加载成功,不能在load的回调中直接play,可以在media.createSoundPool()创建soundPool实例后,在soundPool实例的回调监听soundPool.on(‘loadComplete’)中调用play方法;
参考代码:
import { media } from '@kit.MediaKit';
import { audio } from '@kit.AudioKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
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("y1491.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, // 循环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);
});
});
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在load后立即执行play操作会报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
看下你这个是不是这个原因,同一个音频资源文件被多个`SoundPool`都`load`了,导致播放时error了。
(你说的32个并行流是`createSoundPoo()l`时传入的`maxStreams`参数嘛,好奇一个短时音频有这么多并行播放是什么使用场景啊哈哈哈。还是指的你有很多个短时音频资源文件需要同时播放,如果共用了同一个`SoundPool`是不是没有及时`unload()`掉上一个短时音频资源。)
感谢答复
在HarmonyOS(鸿蒙)系统中,当使用Next soundpool组件时,如果在load
方法调用后立即执行play
操作,可能会遇到报错情况。这通常是由于soundpool内部资源尚未准备完成所导致。
HarmonyOS的soundpool在加载音频资源时,需要一定的时间来完成解码和缓存,这个过程是异步的。如果load
方法调用后立刻尝试播放,此时音频资源可能还未加载完成,因此会触发错误。
为了避免这种情况,可以采取以下措施:
- 监听加载完成事件:使用soundpool提供的回调接口或监听器,确保在音频资源加载完成后再执行播放操作。
- 延迟播放:可以在
load
后设置一个合理的延时(如使用定时器),确保资源有足够的时间加载完成,然后再调用play
方法。不过这种方法不如监听加载完成事件可靠。
简而言之,确保在音频资源加载完成后再进行播放操作,可以有效避免此类错误。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html