HarmonyOS 语音播报当中加上soundPool.on('complete')之后语音就不播报了

在解决UI卡顿之前,使用的SoundPool来进行语音播报时不播报出现几率较少,当时是直接load之后就调用了play,但是解决UI卡顿之后,语音播报时不播报出现几率增多,排查发现是未判断on导致,后来加了on的判断,发现已经不播报了,帮忙看下。

代码流程是:每帧进来之后,依次调用SoundPoolHelper.ets的playSound(status: FaceStatusNewEnum)方法,经过一系列判断之后,调用SoundPlayer.ets中的static async play(context: Context, rawPath: string)方法。

HarmonyOS
2025-01-10 08:40:17
1025浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
put_get

on(loadComplete)时机不对,没有执行,要写在load前面,只需要把回调放在load前面就行了。load底层是起了一个异步线程去进行解封装和解码的 await不会等待这个异步线程的, 所以await load后play也可能会出问题,所以标准的用法就是在loadComplete里面收到回调以后进行play。

private static async loadCallback() {
  // 加载完成回调
  SoundPlayer.sSoundPlayer!.mSoundPool!.on('loadComplete', async (soundId_: number) => {
    console.log('loadCallback')
    hilog.error(0x0000, 'testTag', '%{public}s', 'success = ' + soundId_);
    if (SoundPlayer.sSoundPlayer != undefined) {
      // 获取当前时间
      SoundPlayer.sPlayTime = systemDateTime.getTime(false);
      // play
      SoundPlayer.sSoundPlayer!.mStreamId = await SoundPlayer.sSoundPlayer.mSoundPool!.play(soundId_, SoundPlayer.sSoundPlayer.mPlayParameters);
    }
  });
}

public static async play(context: Context, rawPath: string) {
  if (SoundPlayer.sSoundPlayer == undefined) {
    SoundPlayer.sSoundPlayer = new SoundPlayer();
    await SoundPlayer.sSoundPlayer.init();
    SoundPlayer.loadCallback();
    SoundPlayer.sSoundPlayer.finishPlayCallback();
    SoundPlayer.sSoundPlayer.errorCallback();
  }
  let id: number = SoundPlayer.sSoundPlayer.mSoundPoolCache!.get(rawPath);
  if (id == undefined) {
    if (context == null) {
      return;
    }
    let fd = 0;
    let offset = 0;
    let length = 0;
    let rawFileDescriptor = context.resourceManager.getRawFdSync(rawPath);
    fd = rawFileDescriptor.fd;
    offset = rawFileDescriptor.offset;
    length = rawFileDescriptor.length;
    let soundId = await SoundPlayer.sSoundPlayer.mSoundPool!.load(fd, offset, length);
    SoundPlayer.sSoundPlayer.mSoundPoolCache!.set(rawPath, soundId);
  } else {
    try {
      SoundPlayer.sSoundPlayer.mStreamId = await SoundPlayer.sSoundPlayer.mSoundPool!.play(id,
        SoundPlayer.sSoundPlayer.mPlayParameters);
    } catch (e) {
      e.printStackTrace();
    }
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
分享
微博
QQ
微信
回复
2025-01-10 10:45:51


相关问题
HarmonyOS 文字转语音无法播报
797浏览 • 1回复 待解决
HarmonyOS 语音识别SDK
779浏览 • 1回复 待解决
HarmonyOS 语音播放问题
705浏览 • 1回复 待解决
HarmonyOS 语音识别报错
887浏览 • 1回复 待解决
HarmonyOS 如何实现语音转成文字
752浏览 • 1回复 待解决
HarmonyOS 如何实现语音助手的功能?
1162浏览 • 1回复 待解决
HarmonyOS 关于语音发送功能
830浏览 • 1回复 待解决
HarmonyOS 实时语音转文本
736浏览 • 1回复 待解决
ArkTS语言支持语音识别吗?
1966浏览 • 1回复 待解决
HarmonyOS pcm语音文件播放异常
797浏览 • 1回复 待解决
Sqlite sql 语音支持问题
895浏览 • 0回复 待解决
文本转语音的方法有哪些?
1114浏览 • 1回复 待解决