Gstreamer 要么变高 CPU 要么返回旧帧

Gstreamer either getting high CPU or returning older frames

我正在尝试使用 GStreamer 和 Python 解码多个视频流。这是我的代码:

self.video_capture = cv2.VideoCapture(self.pipeline, cv2.CAP_GSTREAMER)
if self.video_capture.isOpened() is False:
    raise Error
while True:
    status, image = self.video_capture.read()
    # do slow stuff

我遇到了以下问题:

选项 1

如果我使用管道:

self.pipeline = f"rtspsrc location={self.url} latency=10 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! appsink max-buffers=1 drop=true"

我的 CPU 消费非常高。此外,我解码的帧数可能超过我的应用程序实际可以消耗的数量。

选项 2

如果我使用这个管道

self.pipeline = f"rtspsrc location={self.url} latency=10 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! appsink max-buffers=1 drop=false"

几个小时后,应用程序将旧帧返回给我。例如。上午 9 点,我的应用程序在夜间接收帧(从前一天晚上开始)。

这是预期的行为吗?我该如何解决这个问题?

非常感谢

  • drop=true 中,我们解码所有帧,并且仅在解码后才丢弃它们
  • 最好的解决方案可能是在使用软件解码器时同时使用 latency=10drop=true(这可能会导致硬件解码器的帧损坏)