为什么OpenCV VideoCapture读取帧的速度比我的HLS流的FPS快4倍
我使用下面的代码从HLS流中读取每个帧(我在下面使用HLS URL调用init_camera) 我只是在while循环中调用read_camera_frame(尽可能快,因为我相信读取应该以与视频流的FPS对应的速率阻止并返回帧) 我正在播放的视频的FPS大约是30。 但我看到帧的读取速度约为每秒130次。 为什么VideoCapture读取返回帧的速度大约是我预期的4倍为什么OpenCV VideoCapture读取帧的速度比我的HLS流的FPS快4倍,opencv,opencv-python,Opencv,Opencv Python,我使用下面的代码从HLS流中读取每个帧(我在下面使用HLS URL调用init_camera) 我只是在while循环中调用read_camera_frame(尽可能快,因为我相信读取应该以与视频流的FPS对应的速率阻止并返回帧) 我正在播放的视频的FPS大约是30。 但我看到帧的读取速度约为每秒130次。 为什么VideoCapture读取返回帧的速度大约是我预期的4倍 我以为VideoCapture read会在FPS上读取视频帧。OpenCV会尽可能快地读取帧。示例:从本地视频文件读取
我以为VideoCapture read会在FPS上读取视频帧。OpenCV会尽可能快地读取帧。示例:从本地视频文件读取视频帧时,读取速率不取决于视频文件的FPS(从1fps视频文件以100fps的速度读取是正常的)。从摄像机抓取视频帧时,读取速率不能超过摄像机的FPS,因为下一帧不可用。HLS流的来源可能是一个远程文件(或缓冲视频),而不是一个实时摄像机源。@rotem是的,我也设置了HLS服务。所以来源完全如你所描述的。我没有意识到阅读不会阻碍。根据你的观点,听起来我必须根据所需的FPS调整帧速率。我以为视频捕获可以做到这一点。谢谢你的反馈
def init_camera(camera_id):
return cv2.VideoCapture(camera_id)
self.camera_cap = init_camera(self.image_info.get_camera_id())
def read_camera_frame(self):
syst = time.time_ns()
time_since_last_pub = (syst - self.last_pub_time)/1000000000
time_since_last_stat = (syst - self.last_stat_time)/1000000000
if time_since_last_stat > self.stat_report_interval:
fps = self.frames_collected_since_last_report/self.stat_report_interval
self.logger.info(f"Total Frames: {self.frame_cnt}"
f"Total Discards: {self.frame_discard_cnt}"
f" Frames Since Last Report: {self.frames_collected_since_last_report} "
f" FPS: {fps} "
)
self.frames_collected_since_last_report = 0
self.last_stat_time = syst
self.logger.info(f"CameraReader: read a frame {self.frame_cnt}")
ret, img = self.camera_cap.read()
if ret:
self.frame_cnt += 1
self.frames_collected_since_last_report += 1
ts = self.min_frame_pub_interval - time_since_last_pub
if ts > 0:
self.frame_discard_cnt += 1
return []
self.last_pub_time = syst
return [(img, [copy.deepcopy(self.image_info)])]
raise CameraReaderException("Failed To Read Frame")
fps = self.camera_cap.get(cv2.CAP_PROP_FPS)
self.logger.info(f"Source FPS {fps}")