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

Posted

技术标签:

【中文标题】如何确定 html 视频元素的预期帧速率【英文标题】:How to determine the intended frame-rate on an html video element 【发布时间】:2015-04-09 20:08:20 【问题描述】:

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

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

以下是我的失败尝试:

寻找视频元素本身的 FPS 或 FrameCount 属性——不!

查找有关 FPS 或 FrameCount 的跨视频格式标头信息——没有一致的!

寻找在帧改变时触发的事件——不!

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

在我做复杂的尝试之前,有人有更简单的答案吗?

【问题讨论】:

mp4 容器(MOOV atom)确实包含目标帧率,所以我假设用户代理读取它并使用它来控制目标播放率 @Offbeatmammal,谢谢,即使浏览器不使用它来控制播放速率,mp4 上的该属性也很有用。但是,这是一个部分解决方案,因为我在其他编码上找不到类似的帧速率属性。 :-/ 【参考方案1】:

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

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

因此,如果您希望始终在画布上显示最新帧同时避免过度绘制,解决方案可能是: - 在每个 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 暂停。

【讨论】:

谢谢,感谢您的回答!那么,您是说当且仅当绘制新帧时 currentTime 才会更改?你确定吗?如果是,那么 currentTime 对我来说将非常非常有用,因为它相当于“丢失”的 onFrameChange 事件。 对 currentTime 的简单数字比较很诱人。如果我对同一帧进行两次分析,项目结果将出现偏差,并且无法识别同一帧“重复”抽样的成本很高。同样,在使用 rAF 在运行序列中捕获帧时,理论上可能存在丢失帧的高成本。坦率地说,这些可能性让我担心。因此,鉴于缺乏明确的答案,我必须将每个视频都拉到 Premier 中,这样我才能确定帧数。不过,谢谢——我接受你的回答并投票。 如果我理解你的要求,你应该使用一个软件,除非你成功地使用了一个技巧。看我上面的cmets......现在去睡觉......作为10K! ;-) 恭喜你达到了 10K...太好了! 这似乎不适用于最近的 chrome,因为它显示了间隔时间。 currentTime 似乎在帧之间插值,因为它在每个间隔步骤中发生变化

以上是关于如何确定 html 视频元素的预期帧速率的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 不报告准确的帧速率/计数

如何保持 Android Camera 的帧速率恒定

视频帧速率影响清晰度吗

浏览器如何计算 HTML5 <video> 的帧速率 (fps) 以实现准确的帧搜索?

以恒定帧速率捕获网络摄像头视频的方法?

openGL 中的帧速率和绘制流程