【发布时间】:2020-02-06 03:27:42
【问题描述】:
目标和问题
我想设置一个 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 速度
。
现实/预期速度
问题:
- 我在这里做错了什么?
- 为什么这么慢?
- 如何将其同步到实时速度?
【问题讨论】:
-
一个原因可能是由于 I/O 延迟问题。一个解决方案可能是使用线程。看看this
-
在我的机器上,我用你的代码加速了视频大约 2 秒。然后停止约 2 秒。重复。我试图用 cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1) 强制视频流显示最新帧。它似乎有效,但我每
秒得到一帧。 print(cap.get(cv2.CAP_PROP_FPS)) 的 FPS 是 180,000.0,太高了。但是如果你能得到一个准确的 FPS,也许你可以用多个 cap.grab() 来做一些诡计多端的操作来推进到你应该在流中的位置,然后一个 cap.retrieve 来获取帧。 -
我看到您在 python 中获取视频的最少代码。所以,提高运行时间是不可能的。可能问题出在视频分辨率上,如果 W 和 H 尺寸较长,则缓冲区读取和显示视频帧会延迟更多。一个简单的解决方案是在阅读之前降低视频的分辨率。另一种解决方案是创建第二个线程来仅获取视频。另一种解决方案是使用 C++ 读取视频。我比较了性能,它快了大约 3 倍。
-
另请注意,您的问题可能出在硬件上:内存和数据总线带宽,以及处理器速度。
-
使用更快的设备(更多的处理能力)或使用硬件加速或优化代码来接收、解码和显示流。 OpenCV 可能不是接收、解码和渲染最快的库(但它非常好用)
标签: python opencv video video-streaming video-capture