问题
很遗憾没有可供我们使用的帧 API - Firefox has some experimental features,但除此之外我们只能处理时间以及浏览器如何处理帧解码以及帧速率转换。 请参阅下面是更新。
例如,浏览器可能会或可能始终转换/标准化为 30 fps,如果是这样,可能会或可能不会假设丢帧(对于 29.97/59.94 fps/NTSC)。随着时间的推移,这将影响帧数并最终显示为偏移量,因为时间和帧数之间没有真正的联系。
此外,由于基于整数的转换可能会出现舍入误差,并且还可能取决于视频中的开始位置。根据浏览器的不同,对于如何在后台解码视频也有不同的解决方案,例如,Chrome 在底层使用 FFMpeg,Firefox 使用 OS* 中可用的任何内容(用于 MP4 编码视频)等等。
可能的解决方案
(更新:忘了提-)有支持VideoPlaybackQuality object的Media Source Extensions API。这目前 [在 Chrome 和 IE(在 Windows 8+ 上)以及 Firefox 中得到支持。
要使用你可以直接在 HTMLVideoElement 上调用它:
var q = video.getVideoPlaybackQuality();
然后使用其属性读出值:
var frames = q.totalVideoFrames;
请注意,无论实际播放位置如何,此值都可能会累积所有帧。您也许可以直接使用 MSE 解决这个问题。设置和处理有点繁琐,但this link 提供了一个很好的起点,以防您不熟悉 MSE。
另一种想法是在视频中编码一个特殊的条形码,然后使用画布读取它。它在实际的 SMPTE 时间码上是等效的,但这需要在某种程度上在视频中可见叠加层(将电视文本编码到视频的过扫描区域的旧方法)。如果视频是全帧的,则会出现其他问题,例如根据用于编码的颜色进行错误检测(或为其制作纯色背景)。
*)在思科免费发布他们的 mp4 解决方案后,最近的版本可能发生了变化。