import matplotlib.pyploy as plt
import cv2
def getFrame(cap):
frameRate = 25
frameId = cap.get(cv2.CAP_PROP_POS_FRAMES)
ret, frame = cap.read()
if not ret:
return None
print frameId
if frameId < 0:
return None
if not (frameId % int(frameRate)):
cap.set(cv2.CAP_PROP_POS_FRAMES, frameId + frameRate)
return frame
return None
videoFile = 'filename.webm'
cap = cv2.VideoCapture(videoFile,cv2.CAP_FFMPEG)
image = getFrame(cap)
plt.imshow(image)
cap.set(cv2.CAP_PROP_POS_FRAMES,4000.0)
image = getFrame(cap)
while(image is not None):
plt.imshow(image)
image = getFrame(cap)
cap.release()
Я запускаю вышеуказанный код в цикле while и отображаю изображение.Кажется, что после примерно 4250 кадров возвращаемый кадр будет таким же, как кадр в начале.Этот цикл продолжается после 4250 кадров.
Файл, который я читаю, - это mp4 и файл webm.Поведение одинаково для обоих типов файлов.videoCapture использует бэкэнд FFMPEG.Версия Opencv = 3.4.1, python 2.7.
Еще одним заметным поведением является то, что чтение кадра замедляется при увеличении кадра, а затем снова возвращается к быстрому после 4250 кадров.
Редактировать:
Я редактировал код.Я думаю, вы можете попробовать запустить это с файлом mp4 / webm дольше 5 минут.Я не могу загрузить видео по причине конфиденциальности, потому что оно записано в офисе.
Когда я модифицировал код только с помощью cap.read (), ошибка исчезла.Я подозреваю, что это как-то связано с cap.set ()