我有一个运行Raspbian 9的Raspberry Pi。我安装了OpenCV 4.0.1。我连接了USB网络摄像头。 Raspberry无头,我连接了ssh <user>@<IP> -X
。目的是在客户端计算机上获得实时视频流。
问题是大约有2秒左右的延迟。另外,流的播放不稳定,这意味着先慢然后再快。
我的猜测是SSH不能跟上相机的默认30fps。因此,我尝试降低帧速率,因为只要没有明显的滞后,我就可以降低帧速率。我自己降低帧速率的尝试没有效果。
我的代码评论了我自己尝试降低帧率但无法正常工作的部分。
import cv2
#import time
cap = cv2.VideoCapture(0)
#cap.set(cv2.CAP_PROP_FPS, 5)
while(True):
ret, frame = cap.read()
#time.sleep(1)
#cv2.waitKey(100)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
我尝试降低帧频的方法:
我尝试设置cap.set(cv2.CAP_PROP_FPS, 5)
(也尝试了10或1)。如果然后print(cap.get(cv2.CAP_PROP_FPS))
可以给我刚设置的帧速率,但对播放没有影响。
我尝试在while循环中使用time.sleep(1)
,但它对视频没有影响。
我尝试按照Quora上的建议在https://qr.ae/TUSPyN中使用while循环中的第二个cv2.waitKey(100)
,但这也没有效果。
正如评论中指出的那样,time.sleep(1)
和cv2.waitKey(1000)
应该都可以工作,并且实际上它们确实可以工作。有必要将它们放在cv2.imshow()
之后的while循环的末尾。
如第一条评论中所述,为流媒体选择其他设置可能更好,这是我现在正在寻找的摆脱滞后的方法。
我们发现,即使在所有尝试降低帧速率的尝试之后,ssh -X
仍然滞后。我们发现xpra的速度要快得多,即不需要降低帧频或分辨率,也不需要明显的延迟。