在 opencv + python 中处理帧时直播流被延迟

问题描述

我在 Ubuntu 上的 OpenCV 4.4.0.46 中捕获并处理 IP 摄像机 RTSP 流。 不幸的是,处理需要相当多的时间,大约每帧 0.2 秒,并且流很快就会延迟。 视频文件必须保存 5 分钟,但通过此延迟视频文件仅保存 3-4 分钟。

我们能否加快处理速度以克服延误?

我有两个 IP 摄像头,它们有两个不同的 fps_rate(摄像头 1 有 18000,摄像头 2 有 20 fps)

我正在不同的 Ubuntu PC 上实现此代码

  • Linux 上的 Python 3.8.5(认,2020 年 7 月 28 日,12:59:40)[GCC 9.3.0]
  • Django==3.1.2
  • Ubuntu = 18.04 和 20.04
  • opencv-contrib-python==4.4.0.46
  • opencv-python==4.4.0.46
name

解决方法

我看到有两种方法可以解决这个问题。

  1. 您可以拥有一个单独的线程,专用于从 RTSP 流读取帧并将其存储在缓冲区中。您的处理发生在主线程中,并将从该缓冲区请求帧,该缓冲区将移交最旧的帧。这将确保您不会丢失任何帧。但是,由于与相机的帧速率相比,您的处理步骤非常缓慢,因此您的缓冲区中可能会出现数千张图片,这可能会导致“内存不足”错误。

  2. 由于您似乎最关心的是使用您的处理步骤创建视频而不是实时显示,您可以先保存 5 分钟的视频(从 read() 直接转到 write(),无需任何处理) 完成后,您可以从该视频文件中读取并在闲暇时处理这些帧,因为此处的延迟不会导致您跳过帧。