我有以下代码创建一个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密集的任何解决方案或想法都会非常棒。此外,关于如何减少使用的想法也会很棒。
您正在解码整个流。在软件中完成时,这可能非常昂贵。我在这里看到的一个潜在的优化步骤是在解码器之前添加一个GstPadProbe
,并在比特流中解析一些比特并丢弃所有不是IDR的样本。然后,您只会将IDR帧发送到解码器。什么会减少解码器的负载,但是你会在每个IDR帧间隔之后结束一个新的帧,通常每2秒(但可能在每个IDR之间变化)。