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

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

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

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

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


person Frankie    schedule 01.03.2018    source источник
comment
Количество кадров * частота, насколько я помню.   -  person Mathieu    schedule 01.03.2018
comment
@Mathieu на самом деле это количество кадров / частота. (частота имеет единицу измерения 1/сек). Таким образом, видео с 60 кадрами и частотой 30 Гц имеет продолжительность 2 секунды.   -  person Dorian    schedule 15.04.2020


Ответы (5)


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
person ivan_pozdeev    schedule 01.03.2018
comment
Вызов v.get(cv2.CAP_PROP_POS_MSEC) может не возвращать правильное значение, если только v.read() не вызывается после установки позиции, включая поиск до конца. См. github.com/opencv/opencv/issues/15749. - person kfx; 29.06.2020
comment
@kfx Понятно. Итак, это новое поведение в 4.1.2. Когда я в конце, я получаю неправильный номер даже после read(); из кода, похоже, что он не должен требовать вызова read(), потому что он устанавливает picture_pts. Так что это ошибка в моей книге. - person ivan_pozdeev; 30.06.2020

В OpenCV 3 решение:

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()
person Ryan Loggerythm    schedule 27.08.2018
comment
Почему вы импортируете cv2, когда начинаете свой ответ, говоря, что используете OpenCV 3? Разве cv2 не означает OpenCV 2, или я ошибся? - person HelloGoodbye; 29.10.2019
comment
@HelloGoodbye, эта страница должна объяснить это: stackoverflow.com/questions/44102738/ - person Ryan Loggerythm; 29.10.2019

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

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")
person lakjeewa Wijebandara    schedule 01.04.2020

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

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

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

 duration = float(num_frames) / float(fps) # in seconds
person Mitiku    schedule 01.03.2018
comment
К сожалению, это не всегда работает. CAP_PROP_FPS берется из данных заголовка, рассчитывается ненадежно - person Connor; 21.05.2019

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

Я предполагаю, что продолжительность видео должна быть деленной значением TOTAL FRAMES на FPS, но оно всегда не совпадает. Продолжительность видео будет больше, чем мы рассчитывали. Учитывая то, что делает FFMPEG, в исходном видео могут быть пустые кадры.

Надеюсь, это поможет.

person FantasyJXF    schedule 19.11.2019