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
浏览
收藏 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();
    }
  }
}
分享
微博
QQ
微信
回复
2025-01-10 10:45:51
相关问题
HarmonyOS 文字转语音无法播报
350浏览 • 1回复 待解决
HarmonyOS 语音识别报错
410浏览 • 1回复 待解决
HarmonyOS 语音识别SDK
331浏览 • 1回复 待解决
HarmonyOS 语音播放问题
356浏览 • 1回复 待解决
HarmonyOS 实时语音转文本
278浏览 • 1回复 待解决
HarmonyOS 关于语音发送功能
407浏览 • 1回复 待解决
ArkTS语言支持语音识别吗?
1426浏览 • 1回复 待解决
HarmonyOS 如何实现语音转成文字
357浏览 • 1回复 待解决
HarmonyOS 如何实现语音助手的功能?
691浏览 • 1回复 待解决
HarmonyOS pcm语音文件播放异常
429浏览 • 1回复 待解决
文本转语音的方法有哪些?
690浏览 • 1回复 待解决
Sqlite sql 语音支持问题
548浏览 • 0回复 待解决
HarmonyOS 录音和语音播放相关demo
295浏览 • 1回复 待解决