繁体   English   中英

同步多个 HTML5 视频

[英]Synchronizing multiple HTML5 videos

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

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

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

✌ & ♡

不幸的是,浏览器中没有同步机制(即时间码/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)
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM