Javascript函数检测视频的不同关键帧

标签 javascript video html5-video mediaelement.js mediaelement

我正在开发一个简单的应用程序,您可以在其中实时比较两个视频。该项目的一个要求是它们完全同步。我做了很多研究,并尝试了几乎所有我能在 Stack Overflow 上找到的加载事件,但没有成功。我有一个新想法,我不知道这是否可以用Javascript实现。首先,这是我的代码:

HTML:

<video id="leftVideo" src="before.mp4" oncanplaythrough="leftVideoLoaded()" alt="before" loop="true" width="600" height="366"></video>
<video id="rightVideo" src="after.mp4" oncanplaythrough="rightVideoLoaded()" alt="after" loop="true" width="600" height="366"></video>

JS:

var leftVideoLoadedCheck = 0;
var rightVideoLoadedCheck = 0;
function leftVideoLoaded() {
    leftVideoLoadedCheck = 1;
}

function rightVideoLoaded() {
    rightVideoLoadedCheck = 1;
}

$(document).ready(function() {
    $("#container").beforeAfter();

    var leftPlayer = new MediaElement("leftVideo");
    var rightPlayer = new MediaElement("rightVideo");

    var refreashLoadedEvent = setInterval(function(){
        if(leftVideoLoadedCheck == 1 && rightVideoLoadedCheck == 1) {

            setTimeout(function() {
                leftPlayer.play();
                rightPlayer.play();
            }, 1000);

            clearInterval(refreashLoadedEvent);
        }
    }, 50);
});

这是一个现场演示:

http://amarsyla.com/sandbox/beforeafter/

我得到了一些不错的结果,但如果视频继续循环几次,它们之间就会失去同步。有没有一种方法可以设置一个每 500 毫秒运行一次的函数,并检测每个视频的关键帧。当关键帧不相同时,暂停两个视频,然后在同一关键帧处重新开始播放。所以,我正在寻找这样的东西:

setInterval(function() {
    firstVideoKeyframe = ...
    secondVideoKeyframe = ...

    if(firstVideoKeyframe != secondVideoKeyFrame) {
        firstVideo.pause();
        secondVideo.pause();

        var keyframeToPlay = Math.min(firstVideoKeyframe, secondVideoKeyframe);

        firstVideo.playAtKeyframe(keyframeToPlay);
        secondVideo.playAtKeyframe(Math.min(keyframeToPlay));
    }
}, 500);

我希望这不是只有我的想象力才能做到的事情......

非常感谢。

最佳答案

如果您对同时在两个视频上调用 .play() 的效果感到满意,那么最简单的解决方案可能是使用 loop="true" 使视频循环播放。相反,检测两个视频何时结束(使用 onished 事件),然后再次播放它们。 (您可能需要寻找两者的开头,然后等待两者的oneeked,以确保它们都准备好播放。)

仍然存在一个视频落后于另一个视频的危险,主要是由于缓冲问题。您可以通过查看 .currentTime 来检测每个视频的播放位置。如果 .currentTime 的两个值相距太远,那么您需要将其中一个值指定为另一个值。 (不要期望它们完全相等。)

同步两个视频的“正确”方法是使用 MediaController ,但据我所知,还没有浏览器实现这一点。当它们这样做时,您可以通过为两个视频元素设置相同的 mediagroup 属性值来轻松同步视频(这会自动创建一个 MediaController 并将其附加到两个视频)。

关于Javascript函数检测视频的不同关键帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29502686/

相关文章:

javascript - Nativescript旋转动画无限迭代不起作用

ios - 在 QBVideoChat 中公开 AVAudioSession

google-chrome - 在 Chrome 打包应用中播放本地视频文件

javascript - HTML5 视频作为背景在窗口调整大小时留下 HTML 工件

javascript - 我如何检查 "canplaythrough"是否为真?

javascript - 通过javascript从浏览器获取奥尔森时区ID信息

javascript - React - 导入非模块化 sass 文件返回空对象

javascript - Angular JS 中的必填字段验证

javascript - 如何获取网页上嵌入视频的当前播放时间?

android - 如何停止 youtube 视频或在 android 的 youtube-api 中设置缓冲区限制