You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动