目标和问题
我想设置一个opencv系统来处理HLS流或RMTP流,但是,我遇到了一个奇怪的问题,关于降低的帧速率和累积的滞后。这就好像视频变得越来越落后,从它应该在流中。
我正在寻找一种方法,以跟上最新的生活来源,即使这意味着下降帧。
当前方法
import cv2
cap = cv2.VideoCapture()
cap.open('https://videos3.earthcam.com/fecnetwork/9974.flv/chunklist_w1421640637.m3u8')
while (True):
_, frame = cap.read()
cv2.imshow("camCapture", frame)
cv2.waitKey(1)
我已经在VLC上验证了流的质量,它似乎在那里工作得很好。
cv2速度
。
实际/预期速度
问题:
- 我到底做错了什么?
- 怎么这么慢?
- 如何将其同步到实时速度?
3条答案
按热度按时间l7wslrjt1#
我的假设是,抖动最有可能是由于网络限制,并且在帧数据包丢失时发生。当帧丢失时,这会导致程序显示最后一个“好”帧,从而导致显示冻结。这可能是硬件或带宽问题,但我们可以通过软件减轻一些问题。以下是一些可能的更改:
1.设置最大缓冲区大小
我们使用
cv2.CAP_PROP_BUFFERSIZE
参数设置cv2.videoCapture()
对象的缓冲区大小,其思想是通过限制缓冲区大小,我们将始终拥有最新的帧,这也有助于缓解帧随机向前跳跃的问题。2.设置帧检索延迟
目前,我认为
read()
阅读太快,即使它是在自己的专用线程中。这可能是所有帧似乎汇集在一起并在下一帧中突然爆发的原因之一。例如,在一秒的时间间隔内,它可能产生15个新帧,但在下一秒的时间间隔内,仅返回3个帧,这可能是由于网络分组帧丢失而导致的,因此为了确保我们获得恒定的帧速率,我们只是在帧检索线程中添加了一个延迟。获得大约~30
FPS的延迟很好地“规范化”了帧速率并且在存在分组丢失的情况下平滑帧之间的过渡。**注意:**我们应该尝试匹配流的帧速率,但我不确定摄像头的FPS是多少,所以我只是猜测
30
FPS。此外,通常有一个“直接”流链接,而不是通过中间的Web服务器,这可以大大提高性能。如果您尝试使用保存的
.mp4
视频文件,您会注意到没有抖动。这证实了我的怀疑,问题很可能是由于网络延迟。相关的摄像头/IP/RTSP/流媒体、FPS、视频、线程和多处理帖子
ct3nt3jp2#
尝试穿线
我已经尝试过nathancy的this解决方案,并取得了一些成功。
它涉及:
代码:
抖动,但结果实时
。
流媒体是有效的。它保持了实时性。然而,它就像所有的帧汇集在一起,突然爆发成视频。我希望有人能解释这一点。
改进空间
实时流可以在这里找到。
https://www.earthcam.com/usa/newyork/timessquare/?cam=tsstreet
这个站点是使用python的
streamlink
流scraper为m3u8
抓取的。其产生:
流被错误读取的可能性。
sg2wtvxw3#
我建议仔细检查兼容的视频流编解码器与硬件。我遇到了同样的问题,帧率下降到5 fps只在流,因为它是默认的格式,没有被流,所以它会转换它,然后显示非常滞后(~ 1 s)与较低的fps以及。
使用
Self.capture.set(cv2.CAP_PROP_FOURCC ,cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') )
和适当的编解码器代替MJPG,并使用cv 2. VideoCapture,看看是否有帮助。