HTML5逐帧查看/寻帧?

Ory*_*and 51 html video html5 html5-video

我正在寻找一种<video>逐帧查看HTML5的方法.

场景:有一个视频,有一个额外的按钮,按下时会跳到下一帧.

您认为最好的方法是什么?

  1. 正常播放视频,收听timeUpdate每个帧调用FireFox的事件,然后暂停视频.但是,其他浏览器的行为与Firefox不同.
  2. currentTime手动将元素更改为+1/24秒,其中"24"是帧速率.但是,我不知道如何获取FPS.
  3. 您可以想到的任何其他有用的方式.

编辑

我找到了这个非常有用的HTML5测试页面,它跟踪所有浏览器实现准确帧搜索的能力.

Ple*_*and 28

似乎大多数浏览器都允许第二种方法,尽管您需要知道帧速率.然而,Opera是例外,需要一种类似于你的第一种方法(结果并不完美).这是我提出的使用29.97帧/秒视频(美国电视标准)的演示页面.请注意,它尚未经过广泛测试,因此可能无法在IE 9,Firefox 4或任何浏览器的未来版本中使用.

HTML:

<p id="time"></p>
<video id="v0" controls tabindex="0" autobuffer preload>
    <source type="video/webm; codecs=&quot;vp8, vorbis&quot;" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.webm"></source>
    <source type="video/ogg; codecs=&quot;theora, vorbis&quot;" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.ogv"></source>
    <source type="video/mp4; codecs=&quot;avc1.42E01E, mp4a.40.2&quot;" src="http://www.html5rocks.com/tutorials/video/basics/Chrome_ImF.mp4"></source>
    <p>Sorry, your browser does not support the &lt;video&gt; element.</p>
</video>
Run Code Online (Sandbox Code Playgroud)

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);
};
Run Code Online (Sandbox Code Playgroud)

  • 只是一个FYI,var something = things ='stuff'; 实际上使"事物"全球化.在这种情况下它可以工作,在其他情况下它可能不会 (2认同)

Bli*_*n67 8

刚刚解决了这个同样的问题,我采用蛮力方法来找到帧速率.知道帧速率永远不会超过60帧,我以1/60秒的步长搜索视频.通过将视频放到canvas元素上然后使用getImageData获取像素数据,将每个帧与最后一帧进行比较.我在一秒钟的视频中执行此操作,然后计算唯一帧的总数以获得帧速率.

您不必检查每个像素.我抓住视频内部的大约2/3rds,然后检查每个第8个像素的横向和向下(取决于大小).你可以用不同的单个像素来停止比较,这样这个方法合理快速可靠,与读取frameRate属性相比,不如猜测好.

  • 我开始寻找 video.currentTime = time; 然后时间 = 时间 + 1/60;在 video.seeked 事件中,我使用 setTimeout(frameCompare.bind(videoHandler),0); 比较帧,然后如果时间 &lt; 1 则开始下一次搜索 (2认同)
  • 如果视频有一个空白的起始部分,或者任何一秒钟都没有改变的随机部分怎么办? (2认同)

Qwe*_*rty 7

这是我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()
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以轻松添加键绑定来expectedFramerate动态增加/减少/切换以满足您的需求。


奖励:将脚本添加为书签

小书签

https://gist.github.com/ackvf/b180e9883069ad753969a30cb2622787


Nat*_*nes 6

在标准得到确认和实施之前(这将需要很长时间!),您可能能做的最好的事情就是猜测当时的帧速率和增量。除非您处于受控环境中,否则我建议不要严重依赖 HTML5...尽管我很喜欢它的功能,但它不会得到可靠的支持。

  • 但这正是我想做的!使用 HTML5 以网络应用方式完成此操作!:) 这就是挑战所在。 (5认同)