<video>
的方法。情景描述:有一个视频,以及一个附加的按钮,按下该按钮会跳转到下一帧。
你认为最好的方法是什么?
- 正常播放视频,监听
timeUpdate
事件,在Firefox中为每一帧调用一次,然后暂停视频。但是,其他浏览器的行为不像Firefox。 - 手动更改
currentTime
元素到+1 / 24秒,其中“24”是帧速率。但是我不知道如何获得FPS。 - 如果您有任何其他有用的方式。
编辑
我发现这个非常有用的HTML5测试页面,它跟踪所有浏览器实现准确的帧查找的能力。
<video>
的方法。timeUpdate
事件,在Firefox中为每一帧调用一次,然后暂停视频。但是,其他浏览器的行为不像Firefox。currentTime
元素到+1 / 24秒,其中“24”是帧速率。但是我不知道如何获得FPS。我发现这个非常有用的HTML5测试页面,它跟踪所有浏览器实现准确的帧查找的能力。
似乎大多数浏览器都允许第二种方法,尽管您需要知道帧速率。不过,Opera是个例外,需要类似于您的第一个方法(结果并不完美)的方法。这里是我创建的一个演示页面,使用29.97帧/秒的视频(美国电视标准)。请注意,它尚未经过广泛测试,因此可能无法在IE 9、Firefox 4或任何浏览器的未来版本中运行。 demo page
HTML:
<p id="time"></p>
<video id="v0" controls tabindex="0" autobuffer preload>
<source type="video/webm; codecs="vp8, vorbis"" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.webm"></source>
<source type="video/ogg; codecs="theora, vorbis"" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.ogv"></source>
<source type="video/mp4; codecs="avc1.42E01E, mp4a.40.2"" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.mp4"></source>
<p>Sorry, your browser does not support the <video> element.</p>
</video>
JavaScript (在页面加载时运行,使用jQuery 1.4.4为了简洁):
var vid = $('#v0')[0];
vid.onplay = vid.onclick = function() {
vid.onplay = vid.onclick = null;
setTimeout(function() {
vid.pause();
setInterval(function() {
if($.browser.opera) {
var oldHandler = vid.onplay;
vid.onplay = function() {
vid.pause();
vid.onplay = oldHandler;
};
vid.play();
} else {
vid.currentTime += (1 / 29.97);
}
}, 2000);
}, 12000);
setInterval(function() {
$('#time').html((vid.currentTime * 29.97).toPrecision(5));
}, 100);
};
刚刚我也遇到了同样的问题,我想出了一种暴力方法来查找帧速率。知道帧速率不会超过每秒60帧,我通过1/60秒的步长在视频中进行搜索。将视频放入画布元素中并使用getImageData获取像素数据,逐帧与上一帧进行比较。我在一秒钟的视频中执行此操作,然后计算总唯一帧数以获得帧速率。
您不必检查每个单独的像素。我抓取大约2/3的视频内部,然后每隔8个像素横向和纵向检查一次(取决于大小)。您只需比较一个像素即可停止比较,因此这种方法相当快速可靠,当然无法与读取frameRate属性相比,但比猜测要好。
在标准确认并实施之前,你可以做的最好的事情(那会儿要等很久!)就是猜测帧率并按照该时间递增。除非你处于受控环境中,否则我建议不要过度依赖HTML5...尽管我喜欢它的功能,但它不会得到可靠的支持。
keyPress
处理程序。paused
状态,则跳过帧。const video = document.querySelector('#yourVideo')
const expectedFramerate = 60 // yourVideo's framerate
function handleKey(ev) {
let d = 0;
switch (ev.key) {
case ",": d = -5; break; // normal
case ".": d = +5; break;
case "?": d = -10; break; // shift
case ":": d = +10; break;
case "<": d = -2; break; // rightAlt
case ">": d = +2; break;
case " ": togglePlayback(); break;
}
if (d) {
if (video.paused) video.currentTime += Math.sign(d) * 1/expectedFramerate
else video.currentTime += d
}
}
document.onkeypress = handleKey
function togglePlayback() {
video.paused
? video.play()
: video.pause()
}
注意,您可以轻松地添加一个按键绑定来动态调整expectedFramerate
的增加/减少/切换以适应您的需求。
https://gist.github.com/ackvf/b180e9883069ad753969a30cb2622787
请看这个链接:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seekToNextFrame
目前它还处于实验阶段,不应在生产网站中使用,但看起来是最新的解决方案。
它目前只适用于 Firefox 56。
var seekCompletePromise = HTMLMediaElement.seekToNextFrame();
HTMLMediaElement.seekToNextFrame();