2017-12-10 22 views
0

필자가 작성한 Android 5.2 애플리케이션으로 내 태블릿의 전면 카메라에서 여러 동영상을 녹화했습니다. 각 비디오의 시작 타임 스탬프를 밀리 초 (유닉스 시간)로 저장했습니다.동영상의 각 프레임의 타임 스탬프 받기

불행히도 각 동영상마다 다른 프레임 속도 (20에서 30까지)가 있습니다. OpenCV의와 나는 각각의 비디오 프레임 속도를 얻을 수 있어요 :

import cv2 
video = cv2.VideoCapture(videoFile) 
fps = video.get(cv2.CAP_PROP_FPS) 

이 잘 작동하고 이론적으로 난 그냥 비디오의 각 프레임 (때문에 밀리 초) 1000/FPS를 추가 할 수 있습니다. 그러나 이것은 전체 레코딩에서 프레임 속도가 안정적이라고 가정합니다. 이것이 사실인지 나는 모른다.

프레임 속도와 독립적으로 비디오의 각 프레임의 타임 스탬프 (밀리 초)를 가져올 가능성이 있습니까?

+0

동영상을 어떻게 만들었습니까? 어떤 코덱/컨테이너입니까? –

답변

2

당신은 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 초짜리 비디오를위한 것입니다. 어쨌든이 속성을 사용하는 것이 더 쉽습니다.

+0

답변 해 주셔서 감사합니다. CAP_PROP_POS_MSEC는 비디오 녹화 도중 변화하는 프레임 속도를 보상합니까? – machinery

+0

@ 기계 번호. 맨 위의 코드는 OpenCV의 소스 코드에서부터 프레임 속도 계산을 통해 계산되므로 계산하는 것처럼 계산됩니다. 그것은 일정한 FPS를 가정합니다. 실제 프레임 속도가 가변적입니까? 그다지 흔한 일이 아닙니다. –