HarmonyOS 鸿蒙Next 请问不同的soundpool加载不同的声音,播放时只要soundid相同播放的声音也相同怎么解决?让其播放对应加载的声音。
HarmonyOS 鸿蒙Next 请问不同的soundpool加载不同的声音,播放时只要soundid相同播放的声音也相同怎么解决?让其播放对应加载的声音。
由于现在需要加载60个声音如果只创建一个soundpool加载60个声音时会出现界面卡死,所以我需要创建多个soundpool但是出现以下问题。 以下代码soundPool1加载的声音是“one.ogg(对应按钮测试一)和“two.ogg(对应按钮测试二)”,soundPool2加载的声音是“three.ogg(对应按钮测试三)”和“four.ogg(对应按钮测试四)“,播放的时候按钮一却播放"three.ogg"声音,请问怎么解决。
import { media } from '@kit.MediaKit';
import { audio } from '@kit.AudioKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';
let audioRendererInfo: audio.AudioRendererInfo = { usage: audio.StreamUsage.STREAM_USAGE_MOVIE, rendererFlags: 0 }
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
@Entry
@Component
struct BorderExample3 {
soundId1: number = 0;
soundId2: number = 0;
soundId3: number = 0;
soundId4: number = 0;
soundPool1?: media.SoundPool
soundPool2?: media.SoundPool
async aboutToAppear(): Promise<void> {
let file1 = context.resourceManager.getRawFdSync('one.ogg');
let file2 = context.resourceManager.getRawFdSync('two.ogg');
let file3 = context.resourceManager.getRawFdSync('three.ogg');
let file4 = context.resourceManager.getRawFdSync('four.ogg');
this.soundPool1 = await media.createSoundPool(2, audioRendererInfo);
this.soundId1 = await this.soundPool1.load(file1.fd, file1.offset, file1.length)
this.soundId2 = await this.soundPool1.load(file2.fd, file2.offset, file2.length)
console.log("sound1",
this.soundId1)
//1
console.log("sound2", this.soundId2)
//2
this.soundPool2 = await media.createSoundPool(2, audioRendererInfo);
this.soundId3 = await this.soundPool2.load(file3.fd, file3.offset, file3.length)
this.soundId4 = await this.soundPool2.load(file4.fd, file4.offset, file4.length)
console.log("sound3",
this.soundId3)
//1
console.log("sound4", this.soundId4)
//2
// }
build() {
Column() {
Button("测试1").onClick(() => {
this.soundPool1?.play(this.soundId1)
})
Button('测试2').onClick(() => {
this.soundPool1?.play(this.soundId2)
})
Button('测试3').onClick(() => {
this.soundPool2?.play(this.soundId3)
})
Button('测试4').onClick(() => {
this.soundPool2?.play(this.soundId4)
})
}
}
}
}
soundpool当前最多支持32个并行流,可以在需要加载第33个音频时,将之前加载的音频通过unload卸载掉。
在HarmonyOS鸿蒙系统中,使用SoundPool加载和播放声音时,确保每个SoundPool实例或加载的声音具有唯一的SoundID是关键。若遇到SoundID相同导致播放错误声音的问题,通常是因为在加载声音时管理不当或SoundPool使用方式有误。
要解决这个问题,可以采取以下措施:
-
确保唯一性:每次加载声音时,检查并确保SoundID的唯一性。可以通过维护一个SoundID的映射表来管理每个声音与其对应的SoundID。
-
分开管理:如果多个SoundPool实例需要同时工作,确保它们各自管理自己的声音资源,避免SoundID冲突。
-
正确加载与释放:在加载新声音前,确保旧声音已被正确释放,避免内存泄漏和SoundID重用。
-
使用高级API:检查HarmonyOS的SoundPool API文档,看是否有提供更高级的接口或方法来管理SoundID,或是否有推荐的最佳实践。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。