按顺序在线播放视频文件,视频之间无延迟/缓冲

Mar*_*rko 6 html flash video actionscript ffmpeg

是否可以在线播放由两个或多个视频文件组成的视频?

由于我原来的帖子不够清楚,这里有扩展的解释和问题。

我的网站托管在 Linux/Apache/PHP 服务器上。我有 FLV/F4V 格式的视频文件。如有必要,我还可以将它们转换为其他可用格式。所有视频都具有相同的宽高比和其他参数。

我想要的是构建(或使用如果存在)在线视频播放器,该播放器实时播放由多个视频文件连接在一起组成的视频,即当用户单击查看视频时。

例如,访问者来到我的网站并看到标题为“欢迎”的视频可供播放。当他/她点击播放该视频时,我会获取视频文件“Opening.f4v”、“Welcome.f4v”和“Ending.f4v”,并将它们依次加入/合并/连接,以动态创建一个连续的视频。

生成的视频看起来就像一个视频,没有视觉线索、滞后,甚至视频部分之间可观察到的最小延迟。基本上所做的是某种形式的即时编辑或预编辑,用户会看到结果。生成的视频不会保存在服务器上,它只是实时合成和播放。

此外,如果可能的话,不应让用户在看到生成的视频之前等待合并结束,而是能够在合并同时完成的同时立即播放视频的第一部分。

这可以通过 flash/actionscript、ffmpeg、html5 或其他在线技术实现吗?我不需要解释它是如何可能的,只是点头表示它是可能的以及一些进一步调查的链接。

另外,如果一种选择是使用 Flash,那么当从 iphone/ipad 访问网站时,有哪些替代方案可以实现此功能?

Mic*_*ick 6

当前适用于某些浏览器以及未来大多数浏览器的一种方法是使用 HTML5 视频媒体源扩展机制。

这本质上允许您使用动态 src 缓冲区替换 HTML5 页面中视频的静态“src”文件,然后您可以使用自己的 Javascript 代码以任何您想要的方式填充该缓冲区。

因此,您可以编写代码来在第一个视频即将结束时预缓冲第二个视频,然后立即开始将第二个视频中的数据包添加到第一个视频的最后一个数据包之后的 src 中。

从非常高的层面来看,这看起来像:

用于将视频插入页面中所需位置的 HTML:

.
.
.
<div>
  <video id="yourVideo1" controls="" autoplay="" width="320" height="240"></video> 
</div>
.
.
.
Run Code Online (Sandbox Code Playgroud)

您的 Javascript 为您的视频提供源:

//Get the video element
var videoElement = document.getElementById('yourVideo1');

//Create a 'MediaSource' and associate it with this video
var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);

//Add a listener to the MediaSource object to check for
//the video been opened. In this function you can add your
//code to get the get your videos from the servers and add
//'chunks' to the media source buffer

mediaSource.addEventListener('sourceopen', function(e) {

  //Set the format of the source video
  var mediaSourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');

  //Get your video from the web
  while (not the end of your video playlist) {
    ...
    //Stream video from server 
    ...
    //Add packets received to the media source bufer
    mediaSourceBuffer.appendBuffer(receivedVideoPackets);

    //If near end of video start fetching next video to 
    //avoid buffering delay
    ...

    //If end of video go to next video in playlist
    ...

  }


}, false);
Run Code Online (Sandbox Code Playgroud)

请查看下面的 HTML5 Rocks 演示,了解其实际效果(针对略有不同的用例)。

考虑到视频操作的棘手性和格式的多样性等,如果现有的视频播放器之一提供开箱即用的功能,那么对您来说会容易得多,所以我仍然会尝试评论中提到的他们的论坛,但至少你知道这在技术上是可行的。

MSE 规范可在此处获取:

这里有一个很好的介绍博客和演示(确保您的浏览器支持 MSE - 最新版本的 Chrome 支持):

您可以在这里找到最新的浏览器支持: