당신은 cv2.CAP_PROP_POS_MSEC
을 원합니다. 다양한 캡처 속성 here을 모두보십시오. '그래서 당신을 보인다
case CV_FFMPEG_CAP_PROP_POS_MSEC:
return 1000.0*(double)frame_number/get_fps();
:
편집 : Dan Mašek 나에게 지적 당신이 그 속성을 잡아 때 OpenCV의이 exactly doing that calculation (적어도 당신이 FFMPEG를 사용하는 가정)처럼 실제로, 그것은 본다 항상 일정한 프레임 속도 가정에 의존 할 것입니다. 그러나 일정한 프레임 속도를 가정하더라도 프레임 번호로 곱해야하며 단지 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))
프레임 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
이 밀리 초 물론, 그래서 어쩌면 그렇게 큰 것 같지 않습니다. 하지만 여기서는 계산에서 거의 1ms 밖에 안 남았는데, 이것은 단지 11 초짜리 비디오를위한 것입니다. 어쨌든이 속성을 사용하는 것이 더 쉽습니다.
동영상을 어떻게 만들었습니까? 어떤 코덱/컨테이너입니까? –