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
在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();
// 处理播放时间和总时长
}
}
});