HarmonyOS 鸿蒙Next 请问不同的soundpool加载不同的声音,播放时只要soundid相同播放的声音也相同怎么解决?让其播放对应加载的声音。

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

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)
        })
      }
    }
  }
}
2 回复
soundpool不支持多实例,多次创建对应的是同个实例,同时media.createSoundPool()会清空内容重新初始化;

soundpool当前最多支持32个并行流,可以在需要加载第33个音频时,将之前加载的音频通过unload卸载掉。

在HarmonyOS鸿蒙系统中,使用SoundPool加载和播放声音时,确保每个SoundPool实例或加载的声音具有唯一的SoundID是关键。若遇到SoundID相同导致播放错误声音的问题,通常是因为在加载声音时管理不当或SoundPool使用方式有误。

要解决这个问题,可以采取以下措施:

  1. 确保唯一性:每次加载声音时,检查并确保SoundID的唯一性。可以通过维护一个SoundID的映射表来管理每个声音与其对应的SoundID。

  2. 分开管理:如果多个SoundPool实例需要同时工作,确保它们各自管理自己的声音资源,避免SoundID冲突。

  3. 正确加载与释放:在加载新声音前,确保旧声音已被正确释放,避免内存泄漏和SoundID重用。

  4. 使用高级API:检查HarmonyOS的SoundPool API文档,看是否有提供更高级的接口或方法来管理SoundID,或是否有推荐的最佳实践。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部