【问题标题】:Synchronizing multiple HTML5 videos同步多个 HTML5 视频
【发布时间】:2016-04-02 15:09:09
【问题描述】:

我希望同步播放 3 个视频,一次只能看到一个视频,并且可以选择在它们之间切换。所有文件都必须彼此同步并且有一个音轨(如果这样更容易的话,可以只是其中一个视频文件的音轨)。

我只读过非常悲观的文章,关于在众多媒体文件中保持稳定和同步的帧速率几乎是不可能的。 FPS 据说会轻微偏移并且无法控制。(?)

由于我一次只需要一个可见的,我希望这对我有利,但我想知道是否有任何人可以向我指出的任何 goto 程序。不找人为我写任何代码,只是好奇我的研究是否误导了我。

✌&♡

【问题讨论】:

标签: javascript html video html5-video popcornjs


【解决方案1】:

很遗憾,浏览器中没有同步机制(即时间码/SMTPE 或类似的 sinc)来实现与不同视频源的完美同步。

由于延迟,强制 currentTime 更新可能会适得其反。

要正确同步视频部分,所有视频都必须来自同一视频源(本例中为文件)。可以对视频进行预编辑,以便将要显示的所有部分一起编辑,共享视频图像表面。

然后只需使用画布(或使用 CSS 进行剪辑)在页面的不同元素中显示视频的不同部分。

更新:概念验证演示现已删除,抱歉。答案的内容仍然有效。

使用画布元素使用drawImage() 剪辑功能在“当前”部分中绘制。在 OSX 中使用视频作为drawImage() 的图像源存在一个已知问题;您可以为这些情况预加载图像序列。

您可以为每个部分设置地图 - 在本例中,我将使用 HD720 作为总尺寸:

var map = [
        {x: 0, y:0},
        {x: 640, y:0},
        {x: 0, y:360}
    ];

现在您可以使用按钮/选择器/收音机来更改要显示的视频的索引。宽高已知:

<canvas width=640 height=360></canvas>

在 JavaScript 中:

var pos = map[index]; // source rect:         Dest rect:
ctx.drawImage(video, pos.x, pos.y, 640, 360,  0, 0, 640, 360);

您现在需要做的就是将绘图放入一个循环中:

function render() {
    var pos = map[index];
    ctx.drawImage(video, pos.x, pos.y, 640, 360, 0, 0, 640, 360);
    requestAnimationFrame(render)
}

如果您想将所有视频同时渲染到屏幕上,但渲染到不同的位置,您可以使用相同的地图,但使用不同的画布调用 drawImage() 三次:

<div>
    <canvas width="640" height="360"></canvas>
</div>

<div style="margin-left:400px">
    <canvas width="640" height="360"></canvas>
</div>

<div>
    <canvas width="640" height="360"></canvas>
</div>

在 JavaScript 中:

function render() {
    for(var i = 0, pos; i < ctx.length; i++) {
        pos = map[i];
        ctx[i].drawImage(video, pos.x, pos.y, 640, 360, 0, 0, 640, 360);
    }
    requestAnimationFrame(render)
}

提示:画布的大小可以与视频部分不同。只需更新最后的宽度和高度(dest. rect)即可填充画布。

提示 2:您也可以使用此技术叠加文字或徽标等。

【讨论】:

  • 哇,谢谢你,我正在等待完整的视频文件来测试这个,但演示很棒我只是希望结合三个大高清的单个视频文件不要太多
  • K3N,正如另一位用户已经提到的(作为答案),您的答案中提到的演示不再有效。
  • @g00glen00b 演示链接暂时被删除。我会看看我以后有没有时间上传它们。答案的内容仍然有效(顺便说一句,添加另一个答案时没有通知,需要像您一样在 cmets 中发送给用户)。
  • 这确实有效,但浏览器将为每个视频元素下载一次源文件,即使它们指向同一个源文件。 stackoverflow.com/q/27236480/1934286 不过,这可能在三年内发生了变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多