Получение времени видеофайла через 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 шт):
Не совсем ответ, но обнаружил следующее: при чтении видеопотока с IP камеры, сначала камера "сливает" буфер, а потом уже начинает слать фреймы со скоростью, соответствующей FPS.
То есть если я записываю видеофрагмент с камеры в файл 5 секунд, и камера настроена на 4FPS, то получаю видео за 5 секунд ДО начала записи и заканчивается ровно по времени записи. (На камере отображается время в картинку, так что хорошо видно тот факт, что полученный фрагмент раньше начала записи).
Соответственно, если рассчитать "реальный" FPS, то в моих условиях получался 9 кадров вместо 4.
Если ставлю интервал записи в 10 секунд - так же получаю где-то секунду "до" и остальное. И уже "реальный" FPS будет 6.
Возможно с видеофайлом происходит или подобная штука, или, что скорее всего - в результате работы кодека фреймы выдаются неравномерно. Из-за того, что в файле могут быть "полные" (опорные) фреймы и разница, которая восстанавливается в полный фрейм для выдачи в VideoCapture.