基于Python OpenCV降低帧率解决树莓派SSH视频流延迟问题
解决树莓派SSH -X传输USB摄像头实时流延迟、不稳定问题
我用无显示器的Raspbian 9树莓派,装了OpenCV 4.0.1,外接了USB摄像头,平时通过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)(也试过1、10),打印cap.get(cv2.CAP_PROP_FPS)显示设置成功,但实际视频流帧率没变化 - 在循环里插入
time.sleep(1),完全没起到降帧作用 - 按照Quora上的建议加了第二个
cv2.waitKey(100),还是无效
修正降帧方法(仅缓解)
后来经提示才发现,我把延迟代码放错位置了!把time.sleep(1)或者cv2.waitKey(1000)放在cv2.imshow()之后、循环的末尾,降帧方法其实是有效的。不过这只是缓解了播放不稳定的问题,延迟还是存在,看来得换更合适的流媒体传输方案才行。
终极解决方案:改用xpra替代SSH -X
即使调整帧率后,SSH -X的延迟问题还是没法彻底解决。后来我换成了xpra,传输速度直接大幅提升——不需要降低帧率,也不用调分辨率,实时视频流完全没有明显延迟,播放非常流畅。
内容的提问来源于stack exchange,提问作者Martin




