你想要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秒的视频。无论如何,使用这个属性更容易。