Как узнать продолжительность видео с помощью cv2

Я могу получить только количество кадров CAP_PROP_FRAME_COUNT используя CV2.

Однако я не могу найти параметр, чтобы получить продолжительность видео с помощью cv2.

Как это сделать?

Большое спасибо.

6 ответов

Решение

cv2 не предназначен для изучения метаданных видео, поэтому VideoCapture не имеет API, чтобы получить его напрямую.

Вместо этого вы можете "измерить" длину потока: искать до конца, а затем получить отметку времени:

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

Проверка показывает, что это устанавливает точку после последнего кадра (не перед ним), поэтому отметка времени действительно является точной общей длиной потока:

>>> 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

В OpenCV 3 решение состоит в следующем:

import cv2

cap = cv2.VideoCapture("./video.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)      # OpenCV2 version 2 used "CV_CAP_PROP_FPS"
frameCount = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
duration = frameCount/fps

print('fps = ' + str(fps))
print('number of frames = ' + str(frameCount))
print('duration (S) = ' + str(duration))
minutes = int(duration/60)
seconds = duration%60
print('duration (M:S) = ' + str(minutes) + ':' + str(seconds))

cap.release()

Захватить видео и вывести продолжительность в секундах

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")

Сначала рассчитайте кадр в секунду, как это

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

Тогда продолжительность может быть рассчитана как (количество кадров) / (кадров в секунду)

 duration = float(num_frames) / float(fps) # in seconds

В моем личном опыте я использовал opencvметод. Попробуйте этот код:

      import cv2
def get_dur(filename):
    video = cv2.VideoCapture(filename)
    fps = video.get(cv2.CAP_PROP_FPS)
    frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
    seconds = frame_count / fps
    minutes = int(seconds / 60)
    rem_sec = int(seconds % 60)
    return f"{minutes}:{rem_sec}"
print(get_dur("dafuck.mp4"))

Я заметил странное явление, что во многих видео НЕ ИМЕЕТ такого количества кадров, как вvid.get(cv2.CAP_PROP_FRAME_COUNT) получает.

Я предполагаю, что длительность видео должна быть делением ВСЕГО КАДРОВ на FPS, но это всегда несовпадение. Продолжительность видео будет больше, чем мы рассчитали. Учитывая то, что делает FFMPEG, в исходном видео могут быть пустые кадры.

Надеюсь на эту помощь.

Другие вопросы по тегам