如何确定html视频元素上的预期帧速率

时间:2015-02-09 22:32:41

标签: javascript html5 video canvas

有没有办法确定在html视频元素中播放的内容的预期帧速率?

视频元素是否知道预期的FPS或帧数,或者它只是“猜测”(可能是24fps)并以猜测的速度播放?

以下是我不成功的尝试:

  • 在视频元素本身上查找FPS或FrameCount属性 - 不是!

  • 查找有关FPS或FrameCount的跨视频格式标题信息 - 没有任何一致性!

  • 寻找在换帧时触发的事件 - Nope!

我的下一次尝试更复杂:通过捕获画布元素的帧来对视频进行采样,并通过确定像素何时发生变化来计算帧数。

在进行复杂尝试之前,有没有人有更简单的答案?

1 个答案:

答案 0 :(得分:14)

了解视频的帧速率并不像您想象的那样有用 浏览器使用一些技巧来匹配电影的帧速率和屏幕的刷新率,所以如果你看currentTime属性,你会看到实际帧持续时间(== currentTime - 上一个currentTime)不是常数,它在帧与帧之间有所不同。

在此示例视频中:http://jsfiddle.net/3qs46n4z/3/模式为:
     4-1-5-1:
     4帧,21.3 + 1帧,32 + 5帧,21.3 + 1帧,32。

因此,如果您希望始终在画布上显示最新帧,同时避免过度绘制,则解决方案可能是:
   - 在每个rAF上,查看视频的当前时间:
      •相同? - >什么也不做       •改变了? - >更新框架。

无论你想做什么,比较两个currentTime ===两个数字可能比比较两个imageDatas更快;-)

编辑:查看规范以找到我的说法的证据,我发现这个注释的细微差别:

 Which frame in a video stream corresponds to a particular playback position is defined by the video stream's format.

http://www.w3.org/TR/2011/WD-html5-20110113/video.html时的4.8.6注释)

严格地说,我们只能说(当前时间相同)暗示(帧是相同的) 我只能打赌倒数是真的=>不同的时间意味着不同的框架 在上面的示例中,Chrome试图通过尝试获得45 Hz(= 60/2 + 60/4)来匹配60Hz计算机上的24Hz电影,最接近48 = 2 * 24。 对于21个创建的帧,我不知道它是插值还是仅复制帧。它肯定会根据浏览器/设备(尤其是Gpu)而改变。我打赌任何最近的台式机或功能强大的智能手机都会插补。

无论如何,考虑到使用imageData检查的成本很高,你比画面检查要好两倍。

Rq1:我想知道在一次使用Xor模式+测试0 32位的程度会增加比较时间。 (getImageData 慢。)

Rq2:我确定有一种使用播放率来同步'的黑客方法。视频和显示,以及知道哪个帧是真正的(==非插值)帧。 (所以两个传递到这里1)同步2)倒带和检索帧。)

Rq3:如果您的目的是获取每个视频帧且仅视频的帧,那么浏览器就不可能了。如上所述,(桌面)浏览器进行内插以尽可能接近地匹配显示帧速率。那些帧在原始流中。甚至还有一些高端的3D' (2D +时间)插值设备,其中甚至不打算显示初始帧(!)。 另一方面,如果您对(插值)输出流没问题,则在rAF上进行轮询将提供您看到的每个帧(您不能错过一个帧(除了显然您的应用是忙着做别的事情。)

Rq4:插值(==无重复帧)在最近/体面的GPU供电桌面上有99.99%的可能性。

Rq5:确保温暖你的功能(在启动时调用它们100次)并且不产生垃圾以避免jit / gc暂停。