HarmonyOS 鸿蒙Next: Audiorenderer停止播放的时机?

HarmonyOS 鸿蒙Next: Audiorenderer停止播放的时机? 各位好!我在Audiorenderer的writedata回调中判断pcm数据全部写入缓冲区后,调用了stop,但是实际运行时,有时(不是总是)末尾几秒到十几秒的音频会没播放就停止了。请问如何解决?

(this.renderModel as audio.AudioRenderer).on('writeData', (buffer1: ArrayBuffer) => {
  try {
    if(this.progCurr>=Vars.PCMLen){ //这里判断如果数据已经全部提供给缓冲区,就调用停止播放。但是运行时有时(不是总是)末尾几秒到十几秒的音频会没播放就停止了!
      this.PlayerStop();
      return audio.AudioDataCallbackResult.VALID;;
    }
    let bufView=new Uint8Array(buffer1);
    let ptrCurr=this.progCurr;
    for(let i=0;i<buffer1.byteLength;i++){
      bufView[i]=this.bufPCM.readUInt8(ptrCurr+i);
    }
    this.progCurr += this.PlayerBufferSize;
    return audio.AudioDataCallbackResult.VALID;
  } catch (error) {
    console.error('Error reading PCM source:', error);
    // API version 11 不支持返回回调结果,从 API version 12 开始支持返回回调结果
    return audio.AudioDataCallbackResult.INVALID;
  }
});

更多关于HarmonyOS 鸿蒙Next: Audiorenderer停止播放的时机?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

我是从内存中读取的数据,读完之后stop,但是经常已读取的部分尾部数据没有播放,不知为什么。Audiorender是否有缓冲区播放完毕的回调,在这里stop可能就可不会漏播了?或者还有什么办法防止漏播尾部?

更多关于HarmonyOS 鸿蒙Next: Audiorenderer停止播放的时机?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


AudioRender不感知文件,播放到某个进度需要收到一个回调可以用OH_AudioRenderer_SetMarkPosition。TS层参考:JS APIs Audio

markReach、periodReach,

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

我的buffer是从文件读取出来的, 我在文件读取完之后stop play, 检查实际读取到的字节数为0就认为读取完了。

在HarmonyOS中,AudioRenderer停止播放的时机通常由以下几个情况决定:

  1. 手动停止:调用AudioRendererstop()方法,音频播放会立即停止。

  2. 播放完成:当音频数据全部播放完毕,且没有新的数据写入时,AudioRenderer会自动停止播放。

  3. 资源释放:调用AudioRendererrelease()方法,释放相关资源,播放会停止。

  4. 异常情况:如音频设备被占用、音频数据格式不支持等异常情况,AudioRenderer会停止播放并抛出相应错误。

  5. 系统事件:如系统进入休眠状态或应用被挂起,AudioRenderer可能会被系统强制停止播放。

这些是AudioRenderer停止播放的主要时机。

回到顶部