【问题标题】:how to play videos one after another without gap如何无间隙地一个接一个地播放视频
【发布时间】:2021-06-10 22:44:19
【问题描述】:

我有一个文件夹,其中包含数百个 mp4 文件,每个文件时长为 2 秒。 我想一个接一个地播放它们,它们之间没有任何故障。

我已经尝试了Playing videos one after another in html5 中的建议,但这并不能解决视频转换之间的故障问题。

<video width="256" height="192"  id="myVideo" controls autoplay>
    <source src="../uploads/VID_190923141334_20190923_141336.mp4" id="mp4Source" type="video/mp4">
    Your browser does not support the video tag.
</video>

<script type='text/javascript'>
    var player=document.getElementById('myVideo');
    var mp4Vid = document.getElementById('mp4Source');
    player.addEventListener('ended',myHandler_ended,false);

    function myHandler_ended(e)
    {
        mp4Vid.src = "../uploads/VID_190923141334_20190923_141338.mp4";
        player.load();
        player.play();
}
</script>

谁能指出正确的方向以消除每个视频转换中的故障?

【问题讨论】:

  • 这是什么“故障”?你能举一个效果的例子,并提供一个最小的可重现的例子吗?
  • 您还没有真正定义“故障”的含义,但我猜您的意思是一个视频结束和另一个视频开始之间的时间间隔?基于该代码,我希望在下载下一个视频的数据时,视频之间可能会有短暂的差距 - 在上一个视频停止播放之前,您不会开始下载。将数据从服务器移动到客户端不是即时操作。
  • 如果是这种情况,那么 OP 可以创建一个系统来更快地获取他的视频文件,以便在需要时下载并准备播放。
  • 是的,我所说的故障是指一个视频的结尾和下一个视频的开头之间的间隙。
  • 亲爱的 Emiel,请问 OP 是什么?

标签: javascript html video


【解决方案1】:

“2 玩家 1 隐藏”方法不稳定:它在移动设备上不起作用,并且在将一个玩家切换到另一个玩家时会在较旧/较慢的计算机上滞后。我想用这个方法做一个直播,但它是一个丑陋的DIY,不要这样做。

有一个 HTTP Live Streaming (HLS) 标准,通过它您可以连续播放小的 m3u8 (.ts) 块(videoJS 支持,OBS 也支持 m3u8 录制)。

我在 Sia Skynet 上制作了直播流,这是一个静态(不可修改)分散文件存储(类似于 IPFS,但不同)。在这里你可以找到一些演示和源代码:https://github.com/DaWe35/Skylive

【讨论】:

  • HLS 是一种 ABR 流媒体协议,您是对的,它绝对可以用来减少启动时间,但个别视频仍然会有加载时间。隐藏的 2 个播放器实际上可以使用,并且与 HLS 和 DASH(此时的另一个主要 ABR 流协议)一起使用
【解决方案2】:

一种方法是在您的网页上放置两个视频元素和播放器 - 这种方法通常用于前贴片广告、中贴片广告和后贴片广告,这些广告通常来自与主视频本身不同的来源。

两个视频元素在页面上的相同位置,一个在另一个之上。

您播放第一个视频,当您接近结束时预加载,然后暂停第二个视频,但保持播放器隐藏。

在第一个视频结束时,隐藏第一个播放器并显示并启动第二个播放器。

然后,您再次预加载并暂停您刚刚隐藏的播放器中的下一个视频,当正在播放的视频结束时,它会成为准备开始的视频。

下面的 sn-p 隐藏第二个视频,直到第一个视频结束,然后播放第二个隐藏第一个视频。这只是一个粗略的轮廓,您可以在播放电影的位置等进行播放。如果您将指针放在视频上,您可以观看时间线 - 电影淡入淡出,因此可能不明显它正在播放。

在 sn-p 播放时将鼠标悬停在视频上,以查看从一个切换到另一个的时间。

var vid1 = document.getElementById("MyVid1");
var vid2 = document.getElementById("MyVid2");
vid2.style.display = "none"

vid1.onloadeddata = function() {
    vid1.currentTime = 872;
    vid1.play()
};

vid2.onloadeddata = function() {
    vid2.currentTime = 10; //Just to illusrate as begining is black screen
    vid2.pause()
};

vid1.onended = function() {
    vid2.play()
    vid1.style.display = "none"
    vid2.style.display = "block"
};
<video id="MyVid1" width="320" height="176" controls preload="auto">
  <source   src="http://peach.themazzone.com/durian/movies/sintel-1024-surround.mp4" type="video/mp4">
  Your browser does not support this video format
</video>

<video id="MyVid2" width="320" height="176" controls preload="auto">
  <source src="http://ftp.nluug.nl/pub/graphics/blender/demo/movies/ToS/tears_of_steel_720p.mov" type="video/mp4">
  Your browser does not support this video format
</video>

【讨论】:

  • 你知道实现这个机制的任何代码吗?
  • @mquevedob - 是的,但不幸的是它无法共享。我会看看是否可以找到一个开源示例,如果可以,我会更新答案。
  • 你能提到做这件事的javascript函数是什么吗?
  • @mquevedob - 添加了一个非常简单的示例。
  • 非常感谢@Mick。我用我的视频测试了你的脚本,从 vid1 到 vid2 时我仍然可以看到一个小的差距。我认为,到执行 onended() 函数时,已经太晚了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多