加载优化(视频加载)

视频加载

与延迟加载图像资源类似,通过视频标签引入的视频资源也可进行延迟加载,但通常都会根据需求场景进行具体的处理,下面就来探讨一 些关于 视频加载的优化内容。

一、不需要自动播放

​ 由于Chrome等一些浏览器会对视频资源进行预加载,即在HTML完成加载和解析时触发DOMContentLoaded 事件开始请求视频资源,当请求完成后触发window. onload事件开始页面渲染,过程如图所示。

视频资源的加载

为了使页面更快地加载并渲染出来,可以阻止不需要自动播放的视频的预加载:其方法是通过视频标签的preload进行控制:

<video controls preload-"none" poster="default.1po9">
        <source src="simply.webm" type-"video/webm">
        <source src="simply.mp4" tye-"video/mp4">
</video>

标签的preload属性通常的默认值为auto,表示无论用户是否希望,所有视频文件都会被自动下载,这里将其设置为none,来阻止视频的自动加载。同时这里还通过poster属性为视频提供占位符图片,它的作用是当视频未加载出来时,不至于在页面中呈现一块让用户未知的空白。考虑类似边缘异常场最是必要的,因为浏览器对视烦的加载行为可能存在较大差别。

  • Chrome之前的版本中,preload的默认值是auto,从64版本以后其默人值改为了metadata, 表示仅加载视频的元数据,Firefox、 IE11和Edge等浏览器的行为类似。
  • Safari 11.0的Mac版会默认进行部分视频资源预加载,11.2的Mac版后仅可预加载元数据,但ios的Safari不会对视频预加载。
  • 若浏览器开启了流量节省模式后,preload 将默认设置为none.

​ 当浏览器支持preload的metadata属性值后,这将会是一种兼顾了 性能与体验后更优的方式,因为从体验上讲,对于不自动播放的视频场景,在单击播放之前,若能提前告知视频的播放时长、播放列表等元数据,便能带给用户更好的可控感,同时又不至于提前加载了过多资源而阻塞页面渲染。

另外, 如果你的站点中包含了同一域名下的多个视频资源,那么推荐最好将preload属性设置为metadata,或者定义poster属性值时将preload设置为none,这样能很好地避免HTTP的最大连接数,因为通常HTTP 1.1协议规定同一城名下的最大连接数为6,如果同时有超过此数量的资源请求连接,那么多余的连接便会被挂起,这无疑也会对性能造成负面影响。

二、视频代替GIF动画

​ 另一种视频的使用场最是在前面章节讲到的:应当尽量用视频代替尺寸过大的GIF动画,虽然GIF动画的应用历史和范围都很广泛,但其在输出文件大小、图像色彩质量等许多方面的表现均不如视频。GIF动画相对于视频具有三个附加的特性:没有音轨、连续循环播放、加载完自动播放,替换成视频后类似于:

<video autoplay muted loop playsinline>
        <source src-"video.webm" type-"video/webm">
        <source srC-"video .mp4"type-"video/mp4">
</video>

​ 其中在视频标签中附加的属性含义分别为:autoplay自动播放、muted 静音播放及loop循环播放,而playsinline属性则是用于在ios中指定自动播放的。虽然有了GIF图像的替代方案,但并非所有浏览器都像Chrome一样, 能自动进行延迟加载。接下来就需要进行一些配置开发, 使该场最的视频也能延迟加载。首先修改HTML标签如下:

<video autoplay muted loop playsinline width="610" height="254" poster="video-poster.jpg">
        <source data-src="video. webm" type="video/webm">
        <source data-src="video .mp4" type="video/mp4">
</video>

​ 这里进行了两处修改:首先是为视频标签添加了poster 属性,意为使用poster中指定的图片作为视频延迟加载出现前的占位;其次是使用了类似应对图像延迟加载的方式,将真实视频资源的URL放在data-src属性中,然后基于Intersection Observer用JavaScript实现对延迟加载的控制:

Document.addEventListener("DOMContentLoaded", () => {
  const lazyVideos = [].slice.call(document.querySelectorAll("video.lazy"));
  if ("IntersectionObserver" in window) {
    const lazyVideoObserver = new IntersectionObserver((entries, observer) => {
      entries.forEach((video) => {
        if (video.isIntersecting) {
          for (const source in video.target.children) {
            const videoSrc = video.target.children[source];
            if (
              typeof videoSrc.tagName === "string" &&
              videoSrc.tagName === "source"
            ) {
              videoSrc.src = videoSrc.dataset.src;
            }
          }
          video.target.load();
          video.target.classList.remove("lazy");
          lazyVideoObserver.unobserve(video.target);
        }
      });
    });

    lazyVideos.forEach((lazyVideo) => {
      lazyVideoObserver.observe(lazyVideo);
    });
  }
});

​ 对视频标签的延迟加载有点类似,需要对所有 子元素进行选代解析,将data-src上的属性值迁移到src属性上。不同的是,需要额外显示调用元素的load方法来触发加载,然后视频才会根据autoplay属性开始进行自动播放。如此便可使用低于GIF动画的流量消耗,进行资源的延迟加载。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 alan_mf
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信