【问题标题】:Multiple HTML5 Video Tags on 1 page1 页上有多个 HTML5 视频标签
【发布时间】:2015-04-01 05:29:32
【问题描述】:

我有一个网页,其中页面顶部是一个全屏 div,带有视频背景。我也有,在页面更下方的另一个视频(用于测试目的相同的视频)。

我有一个有趣的场景要弄清楚...

  • 视频 1(位于页面顶部)在 Firefox、Safari、Chrome、IE 上完美运行
  • 视频 2(页面的一半)在 Firefox、Safari 和 IE 上运行良好。 不是 Chrome

由于我的工作性质,我必须确保我开发的网站是浏览器安全的。有谁知道为什么 1 个视频可以在 Chrome 中运行,而另一个不能?

在页面顶部

<video id="video" poster="img/poster.png" loop muted class="video-js vjs-default-skin" preload="none" width="100%" height="100%" data-setup="{}">
    <source src='img/video.mp4' type="video/mp4"/>
</video>

下半页

<video  id="s-video" poster="img/poster.png" loop muted class="bg_video video-js vjs-default-skin" preload="none" width="100%" height="100%" data-setup="{}">
    <source src="img/video.mp4" type="video/mp4" />
</video>

我的页面底部也有这段 DOM Javascript

<script>
    document.getElementById('video').play();
    document.getElementById('s-video').play();
</script>

【问题讨论】:

    标签: html html5-video


    【解决方案1】:

    我猜(因为这里没有太多信息)当play() 被执行时,数据很快就准备好了会有问题。

    您可以尝试更改以下内容:

    • 我自己的标签,把preload改成auto
    • 在 JavaScript 中,为 canplay 事件的元素添加侦听器

    例子:

    <video id="video" poster="img/poster.png" loop muted class="video-js vjs-default-skin" preload="auto" width="100%" height="100%" data-setup="{}">
        <source src='img/video.mp4' type="video/mp4"/>
    </video>
    
    <video  id="s-video" poster="img/poster.png" loop muted class="bg_video video-js vjs-default-skin" preload="auto" width="100%" height="100%" data-setup="{}">
        <source src="img/video.mp4" type="video/mp4" />
    </video>
    

    <script>
        var video1 = document.getElementById('video');
        var video2 = document.getElementById('s-video');
    
        video1.addEventListener("canplay", start);
        video2.addEventListener("canplay", start);
    
        function start() {this.play()};  // "this" = current element calling
    </script>
    

    更新

    如果您想将preload 设置为none,这也可以工作:

    <script>
        var video1 = document.getElementById('video');
        var video2 = document.getElementById('s-video');
    
        video1.addEventListener("canplay", start);
        video2.addEventListener("canplay", start);
    
        function start() {this.play()};  // "this" = current element calling
    
        video1.load();  // start loading video (metadata + data)
        video2.load();
    </script>
    

    【讨论】:

    • 你是救生员!非常感谢你!
    • @ZachRoss-Clyne 没问题,很高兴我能帮上忙! :)
    • @KenFyrstenberg,我真的不明白为什么这不适用于 preload="none",并且无需等待“canplay”。如果尚未开始加载,则调用 play() 应该加载媒体。它是同一视频的两个副本的事实是可疑的。我想知道这是否与this bug 有关,据说它已修复。
    • @aldel 也许您正在考虑 load()?尝试调用 load() 而不是使用 preload=auto。在任何情况下,您都必须收听 canplay(或 canplaythrough)。调用 play()。答案已更新。
    • @KenFyrstenberg,不,没有考虑 load()。看看the spec,我认为如果 play() 还没有开始,它应该开始加载媒体。此外,两个视频元素中的一个仅与 play() 一起工作,再加上两个视频标签在其他浏览器中都工作的事实,加强了我对这是一个 Chrome 错误的怀疑。
    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 2012-08-01
    • 2011-07-11
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多