# 对于大视频文件,set pos速度很慢,不如直接grab
class FrameReaderV2:
def __init__(self, video_path):
self.video_path = video_path
self.cap = None
self.init_cap()
def init_cap(self):
if self.cap is not None:
self.cap.release()
self.frame_pos = -1
self.frame = None
self.finished = False
try:
self.cap = cv2.VideoCapture(self.video_path)
except Exception as e:
logger.error(f"{self.video_path} 读取失败")
logger.error(e)
self.cap = None
self.finished = True
self.fps = 0
return
if not self.cap.isOpened():
logger.error(f"{self.video_path} 读取失败")
self.cap = None
self.finished = True
self.fps = 0
return
self.fps = self.cap.get(cv2.CAP_PROP_FPS)
def read(self, frame_pos):
# 如果大于当前帧偏移量,则重新初始化cap
if frame_pos < self.frame_pos:
logger.info(f"重置{self.video_path}")
self.init_cap()
if self.cap is None or self.finished:
return None
if self.frame_pos == frame_pos:
return self.frame
while self.frame_pos < frame_pos:
try:
self.cap.grab()
self.frame_pos += 1
except Exception as e:
logger.error(e)
self.frame = None
self.finished = True
return self.frame
ret, self.frame = self.cap.retrieve()
self.finished = not ret
return self.frame
def isOpened(self):
return not self.finished
def __del__(self):
if self.cap is not None:
self.cap.release()
def release(self):
if self.cap is not None:
self.cap.release()
self.cap = None
跳帧读取视频文件类
最新推荐文章于 2022-08-02 17:43:36 发布