javascript - 如何使用 javascript 缓冲/预加载 html5 视频

标签 javascript html html5-video buffer

我正在运行以下代码,它在每个视频的末尾更改 html5 视频的来源,以便它不断地播放一个接一个的视频。第一个视频结束后,它会运行第二个,然后是第三个,最后从头开始,从而导致无限循环。它还选择一个随机起点,但这对我的问题并不重要。

在下面的代码中,您只会找到两个视频源,但最终代码将使用大约十个。

我的问题是在一个视频的结尾和下一个视频的开头之间有一个小的停顿。我将视频标签的背景色设为红色,这样您就可以在每个视频播放之间看到红色闪光。

我猜这可以通过预加载在 javascript 代码中指定的所有视频来解决。所以我想要实现的是在当前视频播放时仅预加载 javascript 代码内指定列表中的下一个视频。所以当视频 nr。 5 正在播放,它应该预加载视频 nr。 6等..

或者这不是可以通过有效缓冲/预加载来解决的问题吗?我也很高兴有任何其他建议..

var vidElement = document.getElementById('video');
    var vidSources = [
      "http://www.w3schools.com/html/mov_bbb.mp4",
      "http://www.w3schools.com/html/movie.mp4"
      ];
    var activeVideo = Math.floor((Math.random() * vidSources.length));
    vidElement.src = vidSources[activeVideo];
    vidElement.addEventListener('ended', function(e) {
      // update the active video index
      activeVideo = (++activeVideo) % vidSources.length;
      if(activeVideo === vidSources.length){
        activeVideo = 0;
      }

      // update the video source and play
      vidElement.src = vidSources[activeVideo];
      vidElement.play();
    });
video { background-color: red }
<video src="http://www.w3schools.com/html/mov_bbb.mp4" id="video" autoplay muted playsinline></video>
<p>(each video is just ~ 10 seconds)</p>

最佳答案

您可以使用 preload 属性创建 video 元素,并将其添加到 div 容器中,如下所示:

function initVideoElement(videoEl)
{
    videoEl.playsinline = true;
    videoEl.muted = false;
    videoEl.preload = 'auto'; //but do not set autoplay, because it deletes preload

    //loadedmetadata is wrong because if we use it then we get endless loop
    videoEl.onplaying = function(e)
    {
        if(++nextActiveVideo == 2)
            nextActiveVideo = 0;

        //replace the video elements against each other:
        if(this.inx == 0)
            nextVideoElement = videoElements[1];
        else
            nextVideoElement = videoElements[0];

        nextVideoElement.src = vidSources[nextActiveVideo];
        nextVideoElement.pause();
    };

    videoEl.onended = function(e)
    {
        this.style.display = 'none';
        nextVideoElement.style.display = 'block';
        nextVideoElement.play();
    };
}

var videoContainer = document.getElementById('videoContainer'),
    nextActiveVideo = 0,
    nextVideoElement,
    videoElements =
    [
        document.createElement('video'),
        document.createElement('video')
    ],
    vidSources =
    [
        "http://www.w3schools.com/html/mov_bbb.mp4",
        "http://www.w3schools.com/html/movie.mp4"
    ];

videoElements[0].inx = 0; //set index
videoElements[1].inx = 1;

initVideoElement(videoElements[0]);
initVideoElement(videoElements[1]);

videoElements[0].autoplay = true;
videoElements[0].src = vidSources[0];
videoContainer.appendChild(videoElements[0]);

videoElements[1].style.display = 'none';
videoContainer.appendChild(videoElements[1]);
video{background-color: red}
<div id="videoContainer"></div>

关于javascript - 如何使用 javascript 缓冲/预加载 html5 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52503280/

相关文章:

javascript - 取消将对象加载到 THREE.js 中的场景中

javascript - Select2 AJAX 选定值未出现在框中

html - 如何使用 CSS 将图像添加到 anchor 标记?

javascript - HTML5 视频在完全可见时运行

javascript - 如何防止在 Firefox 中点击 HTML5 视频控件时出现事件冒泡

javascript - 使用纯javascript获取 "position: fixed"元素的Y位置

javascript - HTML/JavaScript 中可用的分层下拉列表?

javascript - 如何返回由 Javascript 更改的 onClick 值?

javascript - 提交表单而不重新加载页面

android - html5 中的 hls 在 android chrome 浏览器中不起作用