2014-07-18 101 views
10

我想捕获视频的每个帧编号,但它看起来像没有办法实现它。所以我开始自己的时钟,以匹配视频的帧数,但他们从来没有匹配,随着视频的进步,差异不断增加。获取HTML5视频中的帧编号

请看看我的垃圾箱。 http://jsbin.com/dopuvo/4/edit

我已将帧号添加到来自Adobe After Effects的视频的每个帧中,以便我获得更准确的差异信息。视频运行速度为29.97fps,requestAnimationFrame也设置为以相同速率增加数量,但我不确定这种差异来自哪里。

有时他们匹配,有时他们不匹配。我也尝试过离线,但我得到了相同的结果。任何帮助。

+0

[可以获取HTML5视频中当前帧的编号吗?](http://stackoverflow.com/questions/7177073/can-i-get-the-number-of-the-current -html5-video) –

+0

谢谢Samuel,是的,事实上这是我遵循的解决方案,但我需要在视频向前移动时继续获取帧数。此外,我尝试没有舍去整个框架,但没有运气。 – SayedTaqui

+0

它可能(如果你控制它正在绘制的画布),以保持一个柜台:http://www.kaizou。org/2012/09/frame-by-frame-video-effects-using-html5-and /虽然这也看起来像从我的角度来看黑魔法大声笑请参阅http://stackoverflow.com/questions/17044567/get-frame -change-in-video-html5 – rogerdpack

回答

10

我在github上找到了这个东西。所以它再次工作更新拨弄到新的视频:https://github.com/allensarkisyan/VideoFrame

我在这拨弄实现它:http://jsfiddle.net/Ck6Zq/184/

var currentFrame = $('#currentFrame'); 
var video = VideoFrame({ 
    id : 'video', 
    frameRate: 29.97, 
    callback : function(frame) { 
     currentFrame.html(frame); 
    } 
}); 

$('#play-pause').click(function(){ 
    if(video.video.paused){ 
     video.video.play(); 
     video.listen('frame'); 
     $(this).html('Pause'); 
    }else{ 
     video.video.pause(); 
     video.stopListen(); 
     $(this).html('Play'); 
    } 
}); 

编辑。

+0

有时在视频停止时为1帧,但可能通过在视频暂停/停止时再次设置帧号html来解决此问题 – 2pha

+0

出现该库会完成帧率跟踪设置一个计时器,轮询它“追踪者每次预期的帧率”两次:) – rogerdpack

+0

'frameRate'应该匹配视频中的实际帧率。将其设置为100不会影响播放速度,但它会影响帧计数。 –

4

问题是setTimeout不是真正可预测的,所以您不能确定每次运行函数时都会显示一个新的帧。每次更新帧显示并将其乘以帧速率时,您需要检查视频的currentTime

下面是一个工作示例:http://jsbin.com/xarekice/1/edit它关闭了一帧,但看起来您可能在开始标记为“000000”时有两个帧。

有关您可能希望知道的视频元素有几件事情:

  1. 你似乎已经发现,有确定的帧速率没有可靠的方法,所以你必须发现它并在其他地方对其进行硬编码。有一些有趣的事情发生在video metrics,但它们是非标准的,没有得到广泛的支持,并且根据我的经验,在确定实际帧速率时完全无效。

  2. currentTime并不总是完全代表屏幕上的内容。有时候会比较有前途,特别是在寻求时(这是为什么在我的JSBin中,当你寻找时我没有更新框架)。

我相信从实际的视频绘制一个单独的线程currentTime更新,因此它种就像它自己的时钟,只是不断去。这是视频想要成为的地方,不一定在哪里。所以你可以接近,但是你需要对框架计算的结果进行四舍五入,有时候,你可能会关闭一帧。

+0

谢谢你,这很刺激。 – SayedTaqui