【问题标题】:How can I show the same HTML 5 Video twice on a website without loading it twice?如何在网站上显示相同的 HTML 5 视频两次而不加载两次?
【发布时间】:2014-06-30 18:29:30
【问题描述】:

我的 html 页面上目前有 2 个视频元素。
两者都从相同的 URL 嵌入完全相同的 .mp4 视频。

有没有办法告诉浏览器从第一个视频元素复制渲染的视频,而不是让浏览器下载两个视频?

您可以清楚地看到这两个视频是分开加载的,因为它们有时在播放前有不同的缓冲时间,而且视频每次播放都不同步。

我的代码:

<video autoplay id="previewVideo" data-videoid="JYpUXXD4xgc">
    <source src="video.php?videoid=JYpUXXD4xgc" type="video/mp4"/>
</video>

<video autoplay id="bigVideo"     data-videoid="JYpUXXD4xgc">
    <source src="video.php?videoid=JYpUXXD4xgc" type="video/mp4"/>
</video>

【问题讨论】:

  • 您绝对可以在 JS 中加载一次视频,然后在整个页面中任意调用它。

标签: javascript html video


【解决方案1】:

首先,使用 JavaScript 制作 &lt;video&gt; 元素,然后将其放在您想要的位置。

var video1 = document.createElement("video");
video1["data-videoid"] = "JYpUXXD4xgc";
var sourceElem = document.createElement("source");
sourceElem.src = "video.php?videoid=JYpUXXD4xgc";
sourceElem.type = "video/mp4";
video1.appendChild(sourceElem);

var video2 = video1.cloneNode(true); //This makes a copy of the element, but makes sure it's not treated as the same element. This means you can add video1 AND this _different_ element to the document. However, unfortunately, everything still needs to get loaded again. I think this is the easiest way to copy an element over, though.
video2.id = "bigVideo";
video1.id = "previewVideo";

document.addEventListener("DOMContentLoaded", function() {
    //Now put video1 and video2 where you want.
});

【讨论】:

  • 哇,这是一个很棒的解决方案!我不会想到这一点,我会尽快尝试。只是一个问题,第 8 行中的 videoElem 定义在哪里,你的意思是 video1 可能吗?
  • 对不起!是的,我的意思是video1,而不是videoElem。很抱歉造成混乱!
  • 我目前在事件侦听器之外的 video.id 定义之后直接有 place.prepend(video1); $('body').prepend(video2); video1.play(); video2.play();,因为我开始在自定义 js 函数中播放视频,该函数是在用户交互时启动的。不幸的是,只有最后一个前置视频(在这种情况下为 video2)被添加到站点,如果我切换两个前置的顺序也是如此。似乎 jquery 或 video 元素不支持将几乎相同或相同的元素两次添加到一个页面。你能帮我把这两个视频添加到页面吗?
  • 哦...我猜你需要使用video1.cloneNode()方法。但是,这意味着您需要重新加载video1,即使您不再写出代码。
  • 我尝试使用.cloneNode(),但正如您已经说过的,两个视频都再次单独加载。还有其他想法吗?
【解决方案2】:

这可以通过 Javascript 和 Canvas 元素通过一些非常简单的步骤完成:

HTML:

<video autoplay id="previewVideo" data-videoid="JYpUXXD4xgc">
    <source src="video.php?videoid=JYpUXXD4xgc" type="video/mp4"/>
</video>    
<canvas id="bigVideo"></canvas>

JavaScript:

document.addEventListener('DOMContentLoaded', function() {
  var v = document.getElementById('previewVideo');
  var canvas = document.getElementById('bigVideo');
  var context = canvas.getContext('2d');
  var cw = Math.floor(canvas.clientWidth);
  var ch = Math.floor(canvas.clientHeight);
  canvas.width = cw;
  canvas.height = ch;
  v.addEventListener('play', function() {
    updateBigVideo(this, context, cw, ch);
  }, false);
}, false);


function updateBigVideo(v, c, w, h) {
  if (v.paused || v.ended) return false;
  c.drawImage(v, 0, 0, w, h);
  setTimeout(updateBigVideo, 20, v, c, w, h);
}

画布获取视频图像并在 BigVideo 上再次显示。
updateBigVideo() 函数每 20 毫秒调用一次,帧速率约为 50 FPS。

Read more

【讨论】:

  • 真的像一个魅力,看不到单口吃:)
  • 这可能行得通,但它的处理开销确实很高。正确的答案应该是 Noble Mushtak 的。那是为我工作的那个。此外,如果视频来自另一个域并且该域未启用 CORS,则此方法将不起作用。
  • 如果视频源是 iframe 元素,这种方法可以工作吗?例如,如果 previewVideo 是正在播放的 YouTube 嵌入?
【解决方案3】:

最优解

let videoPlayCount = 1;
    let video = document.getElementById('amplify-mould-video');

    video.addEventListener('ended',videoHandler,false);
    function videoHandler() {
        if(videoPlayCount < 2){
            videoPlayCount++;
            video.play();
        }else{
            video.pause();
            video.removeEventListener('ended',videoHandler)
        }
    }
<video id="video" muted="" autoplay="" controls>
    <source src="#" type="video/mp4">
</video>

【讨论】:

  • 你好萨尔曼,谢谢你的回答。据我了解这段代码,这将连续播放一个视频两次。相比之下,我的问题是如何同时在两个视频元素或其他画布选项中播放相同的视频源 - 理想情况下无需从网络加载两次。
【解决方案4】:

一个简单的解决方案可以是使用 #anything 在 url 的末尾添加一个值

由于您正在将视频加载到一个视频元素中,并且想在另一个视频元素中再次加载它,您可以使用 unique url 如下所示进行排列:

<video autoplay id="mainVideo">
    <source src="video.php?videoid=JYpUXXD4xgc&item=1" type="video/mp4"/>
</video>

<video autoplay id="previewVideo">
    <source src="video.php?videoid=JYpUXXD4xgc&item=2" type="video/mp4"/>
</video>

【讨论】:

  • 我想你误解了我的问题,它是关于告诉浏览器从第一个视频元素“复制”或“复制”渲染的视频,而不是让浏览器下载两个视频。你可以找到我想要的解决方案here
猜你喜欢
  • 2019-01-18
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2013-10-03
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多