如何帮助移动浏览器在单个页面上处理多个 HTML5 音频和视频对象?

How to help mobile browsers handle multiple HTML5 audio and video objects on a single page?

我在单个页面上有一个控制台。控制台上的每个按钮(许多按钮中的一个)都会激活一个从右侧滑入的新信息面板,并且:

使用笔记本电脑浏览器(Firefox 58 和 Chrome 64),我可以循环浏览任意数量的滑入式面板,视听效果不断涌现。

N.B. 每个滑入的新面板都会暂停前一个面板中的所有 AudioVideo 对象.

在我的 Android Phone(Firefox 和 Chrome)上使用移动浏览器时,声音效果将在面板 2 或 3 上开始滞后,通常如果我打开第 5 个或第 6 个面板,音视频全部放弃

此时javascript将不再创建新的Audio对象,也不会播放HTML5 <video>元素。在浏览器中刷新页面也不会给它带来新的生命。事实上,唯一的选择是关闭手机浏览器,然后重新打开。

我不能确定,但​​我猜浏览器可能因对象过载而拒绝允许更多对象来响应?

为了检验这个理论,而不是:

var beep = new Audio('/beep.mp3');
beep.play;

我试过了:

// GLOBAL SCOPE

var beeps = [];

// FUNCTION SCOPE

beeps[beeps.length] = new Audio('/.assets/media/audio/fixournhs/beep.mp3');
beeps[(beeps.length - 1)].play();

setTimeout(function(){

    if (beeps.length > 1) {
        beeps[0] = undefined;
        beeps.shift();
    }
}, 600);

但同样的延迟和最终的半关闭发生了。

这里发生了什么?它绝对是特定于移动设备的,因为我笔记本电脑上的浏览器可以很好地处理脚本。

试试这个

var beep = new Audio('/beep.mp3');
beep.play;
beep.onended = function(){
    beep.remove() //Remove when played.
  };

这可能有助于浏览器知道在完成后删除您的 Beep 音频对象。

如果该测试失败,请尝试将 'beep' 实际放入 dom,并使用 document.body.appendChild(audio);

事实证明 - 通过一些横向思考 - 有一种替代方法可以生成 audio-visual 键入序列,它不需要为每个字母创建一个新的 Audio 对象,因此,不会创建大量导致音频和视觉效果滞后的对象。

关键是要有一个 5 秒的声音效果(即比任何单独的打字序列都长),它会发出一连串的长而重复的哔哔声。

然后脚本:

  • 在字母开始出现的同时 .play() 激活 5 秒的声音文件
  • 在最后一个字母出现后 this.pause(); this.currentTime = 0; 停止 5 秒的声音文件

由于蜂鸣声以与屏幕上出现的字母完全(或几乎)相同的间隔重复,因此给用户一种令人信服的印象,即蜂鸣声与字母相关联(因为它们 实际上 当声音效果由一系列 0.3 秒的音频对象组成时)。

而事实上,正在播放的 5 秒声音文件独立于使每个字母按顺序出现的脚本。