javascript - Internet Explorer 和 Edge 中的视频、内存管理问题,导致页面上的许多视频显示暗/黑和/或无法播放

标签 javascript html dom memory-management html5-video

我们有一个页面包含 77 个左右的视频缩略图。当视频缩略图悬停在上方时,视频开始在缩略图空间内播放。

当许多(8 到 60 个,具体取决于系统/浏览器)悬停在它们上方时,就会出现问题。视频开始播放不正确或不播放。基本上,平坦/冗余区域全部变暗。在 Edge 中,这种情况会在一两秒后自行纠正,但对于我们的客户来说,这是非常不受欢迎的行为。

我们进行了改进,通过调用 pause() 暂停每个视频,删除 src 属性,然后调用 load() 具有空 src 属性的元素,如下所示:

 function pauseVideo(e) {
     $('video', this).get(0).pause();
     $('video', this).get(0).removeAttribute('src');
     $('video', this).get(0).load();
 }

这会清理一些内存,但问题仍然存在,尽管在问题变得明显之前可以播放更多视频。

我似乎确实与内存有关,并且暴露了我们认为 Microsoft 浏览器中的内存泄漏问题。每个视频都会增加内存使用量,并且内存永远不会被清除,就像在 Chrome 和 Firefox 中一样。当任务管理器中的内存使用量接近 600mb 到 1gb(取决于系统)之间时,通常会出现此问题。 (Chrome 始终位于约 500-550 MB 左右。 Firefox 的大小约为 700-800 MB。)

我们注意到该行为开始发生的时间存在一些差异,具体取决于视频卡,但问题总是在某个时刻出现。

所有这些视频都显示在页面上的多个位置。所以我想知道的一件事是是否可以在元素之间共享视频内存。

还有一些其他可能相关的问题。在 IE 中,视频会变成全黑,并且它们的尺寸在屏幕上会发生变化,从而改变页面布局。

这是一个相关问题,但它不重复,因为它没有提供有关必须在 80 个左右的视频上提供便利的问题或解决方案一页:How to properly unload/destroy a VIDEO element

我们正在 IE 版本 11.228.17134.0 和 Edge 版本 42.17134.1.0 上进行测试,这两个版本都是目前的最新版本。

最初所需的功能是当用户将鼠标移开视频时视频在帧上暂停,但现在看来,如果我们必须卸载视频,我们将无法做到这一点。

我将在全天添加更多有关此问题的信息。

最佳答案

我们的团队有一个脚本可以检测 DOM 元素是否在页面的可视区域内,例如不滚动到顶部上方或底部下方。当用户滚动时,脚本添加/删除一个类,并为每个添加了行为的元素调度自定义事件。我能够利用这个系统来暂停、删除和处置(垃圾收集)不在 View 中的视频元素,然后在它们返回 View 时重新填充它们,并将原始属性存储在与每个视频/缩略图。

这将处理视频。该函数必须使用 .call() 调用,例如:disposeVideo.call(videoElement);

var disposeVideo = function () {
  this.pause();
  delete(this);
  $(this).remove();
}

奇怪的是,虽然 delete(this) 是一种 hack,并且不应该在任何浏览器中工作,但根据我读过的评论,它似乎在所有浏览器中都工作这个问题,以及我在 IE/Edge 中的发现。

在 IE(不是 Edge)上,这会产生减慢页面滚动速度的副作用。这是由于我们对页面上的 80 个项目应用了 View 内检查,或者与重新下载海报(缩略图)和视频有关,因为它似乎无法立即有效地缓存这些资源。 (重新)可供渲染器使用。

与上述相关的另一个副作用(也在 IE 中)是,当您滚动时,视频会显示为空白,直到重新下载资源。我们选择使用视频后面分层的图像,以便对被删除的视频元素使用海报属性。这样屏幕上就永远不会出现空白的视频缩略图。

更新:屏幕上有两个或多个视频元素可能会导致该问题。我们只显示一个(效果 100%),但没有尝试确定视频元素的可能最大数量。

关于javascript - Internet Explorer 和 Edge 中的视频、内存管理问题,导致页面上的许多视频显示暗/黑和/或无法播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52102976/

相关文章:

javascript - 是否可以动态获取适合固定宽度的文本的最后一行?

javascript - 数据表固定列在引导模式中未对齐

javascript - jquery - AnimatedModal,获取单击元素的 data-*

html - WordPress wp_editor 删除 html 标签 - 如何阻止它?

javascript - 更新 DOM 并发送当前时间

javascript - 如何在保留点击处理程序的同时重新排列一组 html 元素?查询

javascript - 如何调用HasOffers中的Api并建立服务器和客户端的连接

html - 如何使 <div> 宽度达到浏览器边缘?

javascript - Swiper Center Slide on click 事件

Java Dom问题