使用OpenCV GStreamer读取HLS流时CPU使用率很高

问题描述 投票:1回答:2

我有以下代码创建一个gstreamer管道来处理HLS流。

cap = cv2.VideoCapture(
    f"souphttpsrc is_live=true location={hls_stream_link} ! hlsdemux ! 
    queue ! decodebin ! videorate ! video/x-raw,framerate=1/1 ! 
    videoconvert ! appsink max-buffers=1 drop=true sync=false",
cv2.CAP_GSTREAMER)

我现在读这样的流:

while True:
    success, frame = cap.read()
    time.sleep(1.0)

注意,我以1 FPS读取流,并具有max-buffers=1 drop=true sync=false属性。通过这样做,我总是从缓冲区提供的流中获取最新的帧。

这个问题是CPU使用率非常高,在我的i7机器上有时达到120%。消除睡眠会使情况变得更糟。

关于为什么处理HLS流如此CPU密集的任何解决方案或想法都会非常棒。此外,关于如何减少使用的想法也会很棒。

python opencv gstreamer
2个回答
1
投票

您正在解码整个流。在软件中完成时,这可能非常昂贵。我在这里看到的一个潜在的优化步骤是在解码器之前添加一个GstPadProbe,并在比特流中解析一些比特并丢弃所有不是IDR的样本。然后,您只会将IDR帧发送到解码器。什么会减少解码器的负载,但是你会在每个IDR帧间隔之后结束一个新的帧,通常每2秒(但可能在每个IDR之间变化)。

© www.soinside.com 2019 - 2024. All rights reserved.