Получение времени видеофайла через OpenCV

Для получения времени видео решил использовать один из быстрых инструментов. Код примерно такой:

import cv2 
def timevideo(pathVideoFile):
    video = cv2.VideoCapture(pathVideoFile)
    rate = video.get(5)
    rate = float("%.2f" % rate)
    FrameNumber = video.get(7)
    duration = FrameNumber / rate / 60.00
    print("%.2f" % duration)

В итоге протестировал два видеофайла и полученное время не совпадает с тем что указано в windows-проводнике. Первое видео со временем 4.43, но получено время 4.72. Второе - 1.34, но получено 1.58. Помогите разобраться как получить верное время видеофайла.


Ответы (1 шт):

Автор решения: Alex V

Не совсем ответ, но обнаружил следующее: при чтении видеопотока с IP камеры, сначала камера "сливает" буфер, а потом уже начинает слать фреймы со скоростью, соответствующей FPS.

То есть если я записываю видеофрагмент с камеры в файл 5 секунд, и камера настроена на 4FPS, то получаю видео за 5 секунд ДО начала записи и заканчивается ровно по времени записи. (На камере отображается время в картинку, так что хорошо видно тот факт, что полученный фрагмент раньше начала записи).

Соответственно, если рассчитать "реальный" FPS, то в моих условиях получался 9 кадров вместо 4.

Если ставлю интервал записи в 10 секунд - так же получаю где-то секунду "до" и остальное. И уже "реальный" FPS будет 6.

Возможно с видеофайлом происходит или подобная штука, или, что скорее всего - в результате работы кодека фреймы выдаются неравномерно. Из-за того, что в файле могут быть "полные" (опорные) фреймы и разница, которая восстанавливается в полный фрейм для выдачи в VideoCapture.

→ Ссылка