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

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

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

开发环境 版本号 项目创建方式
Mac 15.6 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

PC开发环境操作系统版本号:15.6

HBuilderX类型:正式

HBuilderX版本号:4.36

手机系统:Android

手机系统版本号:Android 14

手机厂商:OPPO

手机机型:open reno10

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX


4 回复

代码太长了,请删减代码,使用简单的 audio 是否可以复现?请提供可以直接运行的简单代码方便我测试和定位问题,提供更多信息,有助于定位和解答你的问题。


多次切换播放url就会导致 onTimeUpda打印频率增加 并且多次出发play事件也会

2024 12月10日 最新bug 在平板端 当调用seek播放指定的播放位置的声音和按照顺序的差2秒上下。手机端不会 比如一个10分钟的小说正常播放到214秒和调到214秒声音是不同的 在平板 你好

在处理 uni-app 中使用 uni.createInnerAudioContext() 时遇到的安卓设备上 onTimeUpdate 事件触发频繁的问题,这通常是由于系统音频处理机制导致的。尽管我们不能直接控制事件触发的频率,但可以通过一些编程技巧来优化事件处理,减少不必要的性能开销。以下是一个通过节流(throttling)技术优化 onTimeUpdate 事件处理的示例代码。

// 创建一个音频上下文
const innerAudioContext = uni.createInnerAudioContext();

// 节流函数,限制函数执行频率
function throttle(func, wait) {
    let context, args, timeout;
    return function () {
        const now = Date.now();
        if (!previous) previous = now;
        const remaining = wait - (now - previous);
        context = this;
        args = arguments;
        if (remaining <= 0 || remaining > wait) {
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            func.apply(context, args);
            previous = now;
        } else if (!timeout) {
            timeout = setTimeout(function () {
                previous = Date.now();
                timeout = null;
                func.apply(context, args);
            }, remaining);
        }
    };
}

// 定义一个处理时间更新的函数
function handleTimeUpdate() {
    console.log('当前播放时间:', innerAudioContext.currentTime);
    // 在这里添加你的逻辑处理,比如更新UI等
}

// 监听时间更新事件,并使用节流函数包装
const throttledHandleTimeUpdate = throttle(handleTimeUpdate, 1000); // 每秒最多触发一次
innerAudioContext.onTimeUpdate(throttledHandleTimeUpdate);

// 设置音频源并开始播放
innerAudioContext.src = 'https://example.com/audio.mp3';
innerAudioContext.play();

// 其他可能的音频控制逻辑,如暂停、停止等
// innerAudioContext.pause();
// innerAudioContext.stop();

在这个示例中,throttle 函数用于创建一个节流包装器,它限制了 handleTimeUpdate 函数的执行频率。这里设置为每秒最多触发一次,你可以根据需要调整这个频率。这样,即使在安卓设备上 onTimeUpdate 事件触发得非常频繁,我们的处理函数也不会过于频繁地执行,从而减少了性能开销。

注意,节流是一种常用的性能优化技术,但具体实现可能需要根据实际场景进行调整。此外,确保音频URL是有效的,且在实际应用中处理音频加载、播放错误等异常情况。

回到顶部