HarmonyOS鸿蒙Next中AudioRender如何准确获取播放时间

HarmonyOS鸿蒙Next中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方法。该方法返回当前音频播放的时间戳,单位为微秒(μs)。通过调用getCurrentTime,可以实时获取音频的播放进度。

示例代码如下:

import audio from '@ohos.multimedia.audio';

let audioRender: audio.AudioRender;
// 初始化AudioRender
audio.createAudioRender(audio.AudioRenderOptions, (err, render) => {
    if (!err) {
        audioRender = render;
    }
});

// 获取当前播放时间
let currentTime = audioRender.getCurrentTime();
console.log(\`Current playback time: \${currentTime} μs\`);

getCurrentTime方法返回的时间戳是基于系统时钟的,因此可以保证较高的准确性。需要注意的是,该方法只能在音频播放过程中调用,否则可能返回无效值。

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


在HarmonyOS鸿蒙Next中,通过AudioRender获取播放时间,可以使用getCurrentTime方法。该方法返回当前播放的时间戳,单位为微秒(μs)。为确保准确性,建议在onStateChange回调中监听播放状态变化,并在PLAYING状态下调用getCurrentTime。此外,结合getDuration方法获取音频总时长,可以更好地管理播放进度。示例代码如下:

AudioRender audioRender = new AudioRender();
audioRender.setOnStateChangeListener(new OnStateChangeListener() {
    @Override
    public void onStateChange(int state) {
        if (state == AudioRender.PLAYING) {
            long currentTime = audioRender.getCurrentTime();
            long duration = audioRender.getDuration();
            // 处理播放时间和总时长
        }
    }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!