How to get the duration of video using cv2

前端 未结 5 1924
北恋
北恋 2021-01-03 19:24

I can only get the number of frames CAP_PROP_FRAME_COUNT using CV2.

However, I cannot find the parameter to get the duration of the video using cv2.

相关标签:
5条回答
  • 2021-01-03 20:04

    In OpenCV 3, the solution is:

    import cv2
    
    cap = cv2.VideoCapture("./video.mp4")
    fps = cap.get(cv2.CAP_PROP_FPS)      # OpenCV2 version 2 used "CV_CAP_PROP_FPS"
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    duration = frame_count/fps
    
    print('fps = ' + str(fps))
    print('number of frames = ' + str(frame_count))
    print('duration (S) = ' + str(duration))
    minutes = int(duration/60)
    seconds = duration%60
    print('duration (M:S) = ' + str(minutes) + ':' + str(seconds))
    
    cap.release()
    
    0 讨论(0)
  • 2021-01-03 20:09

    Capture the video and output the duration is seconds

    vidcapture = cv2.VideoCapture('myvideo.mp4')
    fps = vidcapture.get(cv2.CAP_PROP_FPS)
    totalNoFrames = vidcapture.get(cv2.CAP_PROP_FRAME_COUNT);
    durationInSeconds = float(totalNoFrames) / float(fps)
    
    print("durationInSeconds: ",durationInSeconds,"s")
    
    0 讨论(0)
  • 2021-01-03 20:17

    cv2 is not designed to explore video metadata, so VideoCapture doesn't have API to retrieve it directly.

    You can instead "measure" the length of the stream: seek to the end, then get the timestamp:

    >>> v=cv2.VideoCapture('sample.avi')
    >>> v.set(cv2.CAP_PROP_POS_AVI_RATIO,1)
    True
    >>> v.get(cv2.CAP_PROP_POS_MSEC)
    213400.0
    

    Checking shows that this sets the point after the last frame (not before it), so the timestamp is indeed the exact total length of the stream:

    >>> v.get(cv2.CAP_PROP_POS_FRAMES)
    5335.0
    >>>> v.get(cv2.CAP_PROP_FRAME_COUNT)
    5335.0
    
    >>> v.set(cv2.CAP_PROP_POS_AVI_RATIO,0)
    >>> v.get(cv2.CAP_PROP_POS_FRAMES)
    0.0        # the 1st frame is frame 0, not 1, so "5335" means after the last frame
    
    0 讨论(0)
  • 2021-01-03 20:18

    I noticed a weird phenomenon that many video DO NOT HAVE as much frames as the vid.get(cv2.CAP_PROP_FRAME_COUNT) gets.

    I suppose that the video duration should be the divided value of TOTAL FRAMES by FPS, but it always mismatch. The video duration would be longer than we calculated. Considering what FFMPEG does, the original video might has some empty frames.

    Hope this help.

    0 讨论(0)
  • 2021-01-03 20:24

    First calculate frame per second like this

    fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
    

    Then duration can be calculated as (number of frames) / (frames per second)

     duration = float(num_frames) / float(fps) # in seconds
    
    0 讨论(0)
提交回复
热议问题