python获取视频帧的时间_获取视频中每个帧的时间戳

本文介绍了如何使用OpenCV的cv2.CAP_PROP_POS_MSEC属性来获取视频帧的时间戳,并讨论了在计算连续帧时间间隔时的精度问题,强调了在长视频中浮点数误差积累的影响。通过示例代码展示了计算时间戳的差异,以说明正确处理帧速率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你想要cv2.CAP_PROP_POS_MSEC。查看所有不同的捕获属性here。

编辑:实际上,正如Dan Mašek向我指出的,当您获取该属性时,OpenCV看起来就像是exactly doing that calculation(至少假设您使用的是FFMPEG):case CV_FFMPEG_CAP_PROP_POS_MSEC:

return 1000.0*(double)frame_number/get_fps();

所以看起来你总是要依赖一个恒定的帧速率假设。然而,即使假设一个恒定的帧速率,重要的是要乘以帧数,而不是一直加1000/fps。当你反复添加浮动时,错误会累积起来,在一段长视频中,浮动会产生很大的影响。例如:import cv2

cap = cv2.VideoCapture('vancouver2.mp4')

fps = cap.get(cv2.CAP_PROP_FPS)

timestamps = [cap.get(cv2.CAP_PROP_POS_MSEC)]

calc_timestamps = [0.0]

while(cap.isOpened()):

frame_exists, curr_frame = cap.read()

if frame_exists:

timestamps.append(cap.get(cv2.CAP_PROP_POS_MSEC))

calc_timestamps.append(calc_timestamps[-1] + 1000/fps)

else:

break

cap.release()

for i, (ts, cts) in enumerate(zip(timestamps, calc_timestamps)):

print('Frame %d difference:'%i, abs(ts - cts))Frame 0 difference: 0.0

Frame 1 difference: 0.0

Frame 2 difference: 0.0

Frame 3 difference: 1.4210854715202004e-14

Frame 4 difference: 0.011111111111091532

Frame 5 difference: 0.011111111111091532

Frame 6 difference: 0.011111111111091532

Frame 7 difference: 0.011111111111119953

Frame 8 difference: 0.022222222222183063

Frame 9 difference: 0.022222222222183063

...

Frame 294 difference: 0.8111111111411446

这当然是毫秒级的,所以可能看起来没那么大。但在这里,我几乎在计算1毫秒,这只是一个11秒的视频。无论如何,使用这个属性更容易。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值