uni-app uni.createInnerAudioContext() 安卓onTimeUpdate事件触发频繁
uni-app uni.createInnerAudioContext() 安卓onTimeUpdate事件触发频繁
bug1: 测试音频地址 https://cdnws.51tyty.com/ugc/audio/2024/8/11/3ed0ce340ed34bb48c11362123b78fff.mp3
当用 seek 跳转播放位置 比如 214.885秒 手机的 214.885 和平板的 214.885 所对应的语音不同 基本上 seek 跳转的会错开个 2 秒左右
bug2 onTimeUpdate 函数有问题 比如我多次切换 url 地址 她的 onTImeUpdate 会一秒内多打印很多次 直到死机
原因是 onTimeupdate 内部 没有监听暂停事件 这是第一个。第二个是 onTImeUpdate 必须要在切换 url 时候 先暂停 在切换 否则会增加多个队列 虽然打印的是最后一个 url 的播放时间
我看你发不了好几条信息,是同一个问题吗
2024 12月10日 最新bug 在平板端 当调用seek播放指定的播放位置的声音和按照顺序的差2秒上下。手机端不会 比如一个10分钟的小说正常播放到214秒和调到214秒声音是不同的 在平板 你好
在uni-app中使用uni.createInnerAudioContext()
创建音频上下文时,onTimeUpdate
事件在安卓设备上触发频繁的问题确实比较常见。这通常是由于安卓系统的音频处理机制较为敏感,导致时间更新事件频繁触发。虽然无法直接通过配置减少触发频率,但可以通过编程技巧来优化处理逻辑,减少不必要的操作。
以下是一个示例代码,展示了如何使用uni.createInnerAudioContext()
并处理onTimeUpdate
事件,同时优化处理逻辑以避免性能问题:
// 创建一个音频上下文
const innerAudioContext = uni.createInnerAudioContext();
// 设置音频源
innerAudioContext.src = 'https://example.com/audio/file.mp3';
// 定义一个变量来存储上一次触发时间更新事件的时间戳
let lastTimeUpdate = 0;
// 定义时间更新事件处理函数
innerAudioContext.onTimeUpdate(() => {
const currentTime = Date.now();
// 检查上一次触发时间,如果距离当前时间超过一定阈值(例如100毫秒),则处理更新
if (currentTime - lastTimeUpdate > 100) {
lastTimeUpdate = currentTime;
// 在这里处理时间更新逻辑,例如更新进度条
console.log('Current time:', innerAudioContext.currentTime);
// 示例:更新页面上的进度条
// this.progress = innerAudioContext.currentTime / innerAudioContext.duration;
}
});
// 播放音频
innerAudioContext.play();
// 其他事件处理,如暂停、停止等
innerAudioContext.onPause(() => {
console.log('Audio paused');
});
innerAudioContext.onStop(() => {
console.log('Audio stopped');
});
// 清理资源(可选,在组件销毁或页面卸载时调用)
// innerAudioContext.destroy();
在上述代码中,我们通过lastTimeUpdate
变量来记录上一次触发onTimeUpdate
事件的时间戳,并在每次触发时检查当前时间与上一次触发时间的差值。如果差值超过设定的阈值(例如100毫秒),则处理时间更新逻辑,否则忽略此次触发。这种方法可以在一定程度上减少因频繁触发onTimeUpdate
事件而导致的性能问题。
请注意,根据具体需求,你可能需要调整时间阈值以达到最佳效果。此外,确保在适当的时机(如组件销毁或页面卸载)清理音频资源,以避免内存泄漏。