Javascript 如何播放多个视频对象,一个接一个地使用缓冲

Javascript 如何播放多个视频对象,一个接一个地使用缓冲,javascript,node.js,html,video,Javascript,Node.js,Html,Video,我正在使用node.js,javascript和HTML5开发一个参考播放器应用程序。我有一个播放器,可以成功加载一个视频并从中生成诊断数据。我的目标是制作一个能够加载视频的播放器,并在当前视频结束前10秒开始缓冲下一个视频。我试图复制视频标签,它能够生成另一个视频对象,但只是将其显示在现有的视频对象旁边。谁能提供一些建议,如何实现这一点,请。先谢谢你 HTML5: <div id="player" class="video"> <video width=1280 height

我正在使用
node.js
javascript
HTML5
开发一个参考播放器应用程序。我有一个播放器,可以成功加载一个视频并从中生成诊断数据。我的目标是制作一个能够加载视频的播放器,并在当前视频结束前10秒开始缓冲下一个视频。我试图复制视频标签,它能够生成另一个视频对象,但只是将其显示在现有的视频对象旁边。谁能提供一些建议,如何实现这一点,请。先谢谢你

HTML5

<div id="player" class="video"> <video width=1280 height=720 autoplay data-dashjs-player controls id="video" src="{{{ src }}}"></video> // main video object that takes the src variable </div>
<script type="text/javascript">
// media events
var server_log, server_glob, videoArray = [{
    "MediaState": []
}];
// joins the media events into a 'glob' that can be sent every few seconds
server_glob = function(t, v) {
    console.log(t, v);
    videoArray[0]["MediaState"][t] = v;
}
server_log = function() {
    var out = "";
    // Serialize videoArray
    for (var i = 0; i < Object.values(videoArray[0]["MediaState"]).length; i++) {
        var key = Object.keys(videoArray[0]["MediaState"])[i];
        var value = JSON.stringify(videoArray[0]["MediaState"][key]);
        out += key + "=" + value + "&";
    }
    // send a xhr/ajax POST request with the serialized media events
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", "/tel", true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // this is my favourite format of POST request, looks alot like JSON
    xhttp.send(out);
}
</script>
//获取src变量的主视频对象
//媒体活动
var服务器日志、服务器全局、视频阵列=[{
“MediaState”:[]
}];
//将媒体事件加入“全局”,每隔几秒钟发送一次
服务器\全局=功能(t,v){
控制台日志(t,v);
视频阵列[0][“MediaState”][t]=v;
}
服务器日志=函数(){
var out=“”;
//序列化视频阵列
对于(var i=0;i
这将按顺序循环播放大量视频(您可以以任何方式加载阵列,例如硬编码或通过ajax调用)。在视频结束时,它将移动到下一个并继续围绕阵列循环

它都是原生JS,因此只要知道
元素的
ID
,就应该适用于
节点.JS
/
dashjs
设置

我通常的偏好是将处理逻辑转储到
中,并尽可能少地保留在主体中,但应在其他配置中工作

我不确定您是如何捕获要向服务器报告的媒体事件的,我假设对象上有一个
AddEventListener
,因此它应该能够遵循与捕获所有错误处理程序相同的格式

<head>
....
<script>
var videos = new Array("BigBuck.m4v","Video.mp4","BigBuck.m4v","Video2.mp4");
var currentVideo = 0;

function nextVideo() {
    // get the element
    videoPlayer = document.getElementById("video")
    // remove the event listener, if there is one
    videoPlayer.removeEventListener('ended',nextVideo,false);

    // update the source with the currentVideo from the videos array
    videoPlayer.src = videos[currentVideo];
    // play the video
    videoPlayer.play()

    // increment the currentVideo, looping at the end of the array
    currentVideo = (currentVideo + 1) % videos.length

    // add an event listener so when the video ends it will call the nextVideo function again
    videoPlayer.addEventListener('ended', nextVideo,false);
}

function ooops() {
    console.log("Error: " + document.getElementById("video").error.code)
}
</script>
</head>

<body> 

<div id="player" class="video">
    <video id="video" width="588" height="318" controls autobuffer muted>
    Your browser does not support the video tag.
    </video>    <!--end video container -->
</div>  

<script>
// add error handler for the video element, just to catch any other issues
document.getElementById("video").addEventListener('error', ooops,false);

// initialize and play the first video
nextVideo();

</script>

....
var videos=新阵列(“BigBuck.m4v”、“Video.mp4”、“BigBuck.m4v”、“Video2.mp4”);
var-currentVideo=0;
函数nextVideo(){
//获取元素
videoPlayer=document.getElementById(“视频”)
//删除事件侦听器(如果有)
videoPlayer.removeEventListener('ended',nextVideo,false);
//使用视频阵列中的当前视频更新源
videoPlayer.src=视频[当前视频];
//播放视频
播放
//增加currentVideo,在阵列末尾循环
当前视频=(当前视频+1)%videos.length
//添加事件侦听器,以便视频结束时再次调用nextVideo函数
videoPlayer.addEventListener('ended',nextVideo,false);
}
函数ooops(){
log(“错误:+document.getElementById(“视频”).Error.code)
}
您的浏览器不支持视频标记。
//为视频元素添加错误处理程序,以捕获任何其他问题
document.getElementById(“视频”).addEventListener('error',oops,false);
//初始化并播放第一个视频
nextVideo();

您可以在HTML视频
结束时加载新的video.src
事件,但这不会预缓冲。另一种方法是获取当前视频的持续时间,并在长度为10秒时加载一个隐藏的新视频元素,但将“预加载”设置为“自动”,当当前元素上的结束点触发时,将其交换(隐藏一个,显示另一个)@offbeatmal听起来很棒!你有一个编码的例子来说明这一点吗?哪个选项?两者都很简单。。。今天晚些时候我可以把一些东西拼凑起来。除非您通过XHR加载整个视频,否则可能无法实现100%无缝,但这会打开一个新的蠕虫罐!现在,只要把多个视频对象排队就可以了。我尝试实现这个方法(),但根本不起作用。如果您能拼凑出任何东西,我们将不胜感激。请参阅建议答案,该答案只需逐步浏览一系列视频即可。如果差距太大,请告诉我,我将使用预加载/交换第二个元素(增加了一系列复杂性!)。假定
dashjs
播放器正在包装一个标准的
元素。任何Qs,让我知道这看起来很棒!从逻辑上看,这似乎是合理的,但不幸的是,它不起作用。我照样复制了您的代码,将“Video.mp4”替换为我放在桌面上的视频的路径名,但不幸的是,什么也没发生。另一个视频没有按顺序播放。我有没有做错什么?浏览器控制台日志或网络工具中有没有错误?你能用已知的好来源(例如)替换阵列中的视频吗?您是以http://(在这种情况下,它可以看到您的桌面)还是文件的形式打开网页://?:)呸!希望这不会是那种“适合我”的问题。