【问题标题】:prevent video to download certain source on mobile防止视频在移动设备上下载某些源
【发布时间】:2021-01-12 08:43:02
【问题描述】:

我正在构建一个包含多个视频的网页,因此我为每个视频导出了 2 种不同的媒体:一种用于在桌面上显示的高质量媒体,另一种用于在移动设备上显示的较低质量的媒体。

为此,我为我的视频元素设置了如下样式:

<video autoplay muted loop playsinline id="video-1">
            <source class="mob-hidden" src="video-1.mp4" type="video/mp4">
            <source class="des-hidden" src="video-1-low.mp4" type="video/mp4">
              Your browser does not support HTML5 video.
</video>

其中 mob-hidden 和 des-hidden 是带有显示的 css 类:无;以防止它们出现在移动设备或桌面设备中。

问题是我注意到,在移动设备和桌面设备上,即使只使用一个,页面仍然会下载两个视频版本,所以我猜使用 css 类是不够的。

您能否帮助了解如何防止网页下载不会使用的媒体?所以在桌面上的视频质量很差,而在移动设备上的视频质量很高。

非常感谢!

【问题讨论】:

  • 您可以使用 2 个不同的视频标签,一个用于桌面,一个用于移动设备,并且只向视频标签添加一个来源。
  • 您可以使用 JavaScript 来检测某些功能,例如触摸、陀螺仪等手机应该具备的功能。然后根据该查询添加高分辨率或低分辨率视频。
  • @EmielZuurbier 最好只检查屏幕尺寸。由于 iPad(和一些笔记本电脑)也具有这些功能,但它们的屏幕可能足够大,可以播放高分辨率视频。

标签: javascript html css html5-video


【解决方案1】:

试试这个:

<video controls>
    <source src="the-sky-is-calling-large.mp4" media="screen and (min-width:800px)">
    <source src="the-sky-is-calling-large.webm" media="screen and (min-width:800px)">
    <source src="the-sky-is-calling-small.mp4" media="screen and (max-width:799px)">
    <source src="the-sky-is-calling-small.webm" media="screen and (max-width:799px)">
</video>

【讨论】:

    【解决方案2】:

    我可以在这里看到 3 种潜在的方法

    在 CSS 中检查页面的宽度

    由于您的视频有两个不同的类,您可以编写类似这样的代码

    .des-hidden{
     display: none;
    }
    
    @media only screen and (max-width: 768px) {
      /* For mobile phones: */
      .des-hidden{
         display:none
       }
       .mob-hidden{
         display: block;
       }
    }
    
    

    但是您必须将您的 HTML 更改为类似的内容才能使其正常工作

    <video autoplay muted loop playsinline id="video-1" class="mob-hidden">
        <source src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" type="video/mp4">
    </video>
    
    <video autoplay muted loop playsinline id="video-2" class="des-hidden">
        <source src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4" type="video/mp4">
        Your browser does not support HTML5 video.
    </video>
    

    在JS中检查页面的宽度

    您可以使用类似的方法更改您的 ID 类:

    window.addEventListener("resize", function(event) {
        if (document.body.clientWidth <= 768) {
            document.getElementById("des-hidden").style.display = "none";
            document.getElementById("mob-hidden").style.display = "block";
        } else {
            document.getElementById("des-hidden").style.display = "block";
            document.getElementById("des-hidden").style.display = "none";
        }
    });
    
    

    在后端检查设备

    根据您的后端,如果您有一个 (PHP, Node.Js) ,您可以检查用户代理,并决定显示一个视频或另一个

    如果你使用 PHP,你可以看看这个: Simplest way to detect a mobile device in PHP

    或者如果你使用 NodeJs : Identify if the request is coming from mobile or not

    更多详情

    在最近的浏览器上,使用display:none CSS 属性将完全跳过文件加载,这意味着视频甚至不会被浏览器请求,从而节省加载时间和数据使用 (见Does “display:none” prevent an image from loading?

    使用后端解决方案有助于确保正确的视频接收正确的视频,从而避免无用的加载时间,但如果加载后页面宽度发生变化,您的页面将更难适应

    所以如果你不想处理 Ajax 或 nodeJs 异步,我建议使用 CSS 选项

    【讨论】:

    • 感谢您的回答,您推荐的 CSS 方法基本上就是我正在做的。问题是显示块或不显示元素似乎不足以阻止页面下载源
    • 我正在看这个,我会给你一个带有工作示例的 codepen 链接!
    • @baband 我更新了我的答案,我还创建了一个工作示例:Video Mediaquery
    • 非常感谢您的回答和示例,我已将其应用于我的代码,但不幸的是,浏览器不断下载桌面和移动 src 文件
    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2021-11-28
    相关资源
    最近更新 更多