HarmonyOS 鸿蒙Next soundpool在load后立即执行play操作会报错

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

由于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

4 回复

报错5400102当前操作不允许:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/errorcode-media-V5#section5400102-当前状态机不支持此操作

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()`掉上一个短时音频资源。)cke_223.png

在HarmonyOS(鸿蒙)系统中,当使用Next soundpool组件时,如果在load方法调用后立即执行play操作,可能会遇到报错情况。这通常是由于soundpool内部资源尚未准备完成所导致。

HarmonyOS的soundpool在加载音频资源时,需要一定的时间来完成解码和缓存,这个过程是异步的。如果load方法调用后立刻尝试播放,此时音频资源可能还未加载完成,因此会触发错误。

为了避免这种情况,可以采取以下措施:

  • 监听加载完成事件:使用soundpool提供的回调接口或监听器,确保在音频资源加载完成后再执行播放操作。
  • 延迟播放:可以在load后设置一个合理的延时(如使用定时器),确保资源有足够的时间加载完成,然后再调用play方法。不过这种方法不如监听加载完成事件可靠。

简而言之,确保在音频资源加载完成后再进行播放操作,可以有效避免此类错误。

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

回到顶部