我用自己编写的Android 5.2应用程序从平板电脑的前置摄像头录制了几段视频,并以毫秒(Unix时间)为单位存储了每段视频的开始时间戳。
不幸的是,每个视频都有不同的帧率(范围从20到30)。使用OpenCV,我可以获得每个视频的帧率:
import cv2
video = cv2.VideoCapture(videoFile)
fps = video.get(cv2.CAP_PROP_FPS)
这很好用,理论上我可以为视频中的每一帧增加1000/fps(由于毫秒)。但这是假设帧率在整个录制过程中保持稳定。我不知道是否是这样。
在Python中是否有可能获得视频中每一帧的时间戳(以毫秒为单位),而不依赖于帧速率?
5条答案
按热度按时间xe55xuns1#
您需要
cv2.CAP_PROP_POS_MSEC
。请在此处查看所有不同的捕获属性。编辑:实际上,正如Dan Mašek向我指出的那样,当您获取该属性时,看起来OpenCV确实在进行该计算(至少假设您使用的是FFMPEG):
因此,你似乎总是依赖于恒定的帧速率假设。然而,即使假设恒定的帧速率,重要的是你乘以帧数,而不是一直添加
1000/fps
。当你重复添加浮点数时,错误会累积起来,这在长视频中会产生很大的差异。例如:帧0差异:0.0
帧1差异:0.0
帧2差异:0.0
帧3的差异:1.4210854715202004e-14
第4帧差异:0.011111111111091532
第5帧差异:0.011111111111091532
帧6差异:0.011111111111091532
帧7差异:0.011111111111119953
第8帧差异:0.022222222222183063
帧9差异:0.022222222222183063
...
帧294差异:0.8111111111411446
当然,这是以毫秒为单位的,所以可能看起来并不大。但是在这里,我在计算中几乎差了1毫秒,而且这只是针对11秒的视频。无论如何,使用这个属性更容易。
bfrts1fy2#
这是一个简化的版本,它只读取视频并打印出帧编号及其时间戳。
这会产生如下所示的输出:
8dtrkrch3#
我用moviey来计算每一帧秒数
第一个
bzzcjhmw4#
通常这些相机有一个滚动快门,这意味着图像是逐行扫描的,所以严格地说,一个人不能把一个时间戳的图像。(iPhone 6)使用精确定时的(ns-scale)led闪光灯。我发现帧速率是可变的(高速时标称为240 fps,但在239,something和241,something之间变化。相互同步最高可达1/500000 s,但这需要一个特殊的设置。如果你感兴趣,我可以给你一些文档(我的软件恐怕是在Matlab,所以没有现成的Python代码)
a14dhokn5#
我用多个库做了一些测试。
以下是获取24分钟mkv的时间戳所需的时间。