为什么OpenCV VideoCapture读取帧的速度比我的HLS流的FPS快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会尽可能快地读取帧。示例:从本地视频文件读取

我使用下面的代码从HLS流中读取每个帧(我在下面使用HLS URL调用init_camera)

我只是在while循环中调用read_camera_frame(尽可能快,因为我相信读取应该以与视频流的FPS对应的速率阻止并返回帧)

我正在播放的视频的FPS大约是30。

但我看到帧的读取速度约为每秒130次。

为什么VideoCapture读取返回帧的速度大约是我预期的4倍


我以为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}")