我看看有没有懂的!!!! HarmonyOS鸿蒙Next中AudioRender如何准确获取播放时间

我看看有没有懂的!!! HarmonyOS鸿蒙Next中AudioRender如何准确获取播放时间

AudioRender如何准确获取播放时间

逻辑是从本地读取test.wav文件之后,直接开始写入播放,每30ms左右获取一次当前播报进度。

问题出在,前面两次调用的时候,获取的时间是准确的,后面就乱了,求解。

简单代码:

init() {
  // 1. 配置参数
  const config = this.getAudioConfig();
  // 2. 创建实例
  audio.createAudioRenderer(config, (err, renderer) => {
    if (err) {
      return console.error('初始化失败:', err);
    }

    this.renderer = renderer;
    this.renderer?.on('writeData', this.handleAudioData.bind(this));
    try {
      this.file = fs.openSync(this.filePath, fs.OpenMode.READ_ONLY);
    } catch (e) {
      console.error(e)
    }
  });
}

private handleAudioData(buffer: ArrayBuffer): audio.AudioDataCallbackResult {
  // 读取文件数据到buffer
  const view = new DataView(buffer);
  const bytesRead = fs.readSync(this.file!.fd, buffer);
  if (bytesRead === 0) {
    // 末尾处理:填充静音
    view.setUint8(0, 0); // 单字节静音
    return audio.AudioDataCallbackResult.VALID;
  }

  return audio.AudioDataCallbackResult.VALID;
}
play(){
this.renderer?.start((err) => {
  err ? console.error('启动失败:', err) : console.log('播放开始');
});
}

先调用init方法,后调用play,音频播报正常。

获取播放时间的打印如下:

this.renderer?.getAudioTime().then((timestamp: number) => {
  console.info(`Current timestamp11111: ${timestamp}`);
}).catch((err: BusinessError) => {
  console.error(`ERROR: ${err}`);
});

日志:可以发现奇怪的时间

03-24 11:54:19.134   11840-11840   demo  I     Current timestamp11111: 1743597783066432800
03-24 11:54:19.169   11840-11840   demo  I     Current timestamp11111: 1743597783101127700
03-24 11:54:19.205   11840-11840   demo  I     Current timestamp11111: 809324038580672
03-24 11:54:19.239   11840-11840   demo  I     Current timestamp11111: 809324078469672
03-24 11:54:19.279   11840-11840   demo  I     Current timestamp11111: 809324118751672
03-24 11:54:19.304   11840-11840   demo  I     Current timestamp11111: 809324138251672
03-24 11:54:19.339   11840-11840   demo  I     Current timestamp11111: 809324178539672
2 回复

在HarmonyOS鸿蒙Next中,AudioRender组件用于音频渲染。要准确获取播放时间,可以使用AudioRender提供的getCurrentTime方法。该方法返回当前音频播放的时间戳,单位为毫秒。通过调用getCurrentTime,可以实时获取音频的播放进度。

具体步骤如下:

  1. 创建AudioRender实例并配置音频源。
  2. 调用start方法开始播放音频。
  3. 在需要获取播放时间时,调用getCurrentTime方法。

示例代码片段如下:

let audioRender = new AudioRender();
audioRender.setSource('path/to/audio/file');
audioRender.start();
let currentTime = audioRender.getCurrentTime();
console.log('Current playback time:', currentTime);

getCurrentTime方法会返回从音频开始播放到当前时刻的累计时间,可以用于同步显示播放进度条或实现其他与时间相关的功能。

更多关于我看看有没有懂的!!!! HarmonyOS鸿蒙Next中AudioRender如何准确获取播放时间的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,准确获取AudioRender的播放时间可以通过调用getCurrentTime方法实现。该方法返回当前音频播放的时间戳,单位为毫秒。确保在播放过程中调用此方法,以获取实时进度。示例代码如下:

AudioRenderer renderer = new AudioRenderer();
long currentTime = renderer.getCurrentTime();

此外,建议结合OnPlaybackPositionUpdateListener监听器,实时更新播放时间,确保精确性。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!