uni-app uni.createInnerAudioContext() 安卓onTimeUpdate事件触发频繁

发布于 1周前 作者 wuwangju 来自 Uni-App

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 的播放时间


3 回复

我看你发不了好几条信息,是同一个问题吗


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事件而导致的性能问题。

请注意,根据具体需求,你可能需要调整时间阈值以达到最佳效果。此外,确保在适当的时机(如组件销毁或页面卸载)清理音频资源,以避免内存泄漏。

回到顶部