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=10
和 drop=true
(这可能会导致硬件解码器的帧损坏)
我正在尝试使用 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=10
和drop=true
(这可能会导致硬件解码器的帧损坏)