如何确定 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 视频元素的预期帧速率的主要内容,如果未能解决你的问题,请参考以下文章