问题描述
最近想要使用树莓派连接到 USB 摄像头录制视频推送到服务器,然后发现它占用大量的 CPU ,而且使用 ffmpeg 推流到 RTMP 服务器时其他设备无法播放视频流。所以又想了个把 USB 摄像头转发到云服务器的方案。
解决方案
这里使用 usbip 来进行 usb 设备转发。
云服务器
这里使用的是 ubuntu server 操作系统的服务器,需要有公网 IP。
首先安装 openvpn 服务器,可以使用 Nyr/openvpn-install: OpenVPN road warrior installer for Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS and Fedora (github.com) 的安装脚本。
编辑脚本自动生成的服务器配置,注释掉 push "redirect-gateway def1 bypass-dhcp" 和 push "dhcp-option DNS xxxx"。这一步是关闭 openvpn 的网络代理。修改完成后重启 openvpn server。

安装服务端完成后再次运行安装脚本,生成客户端配置文件。

安装usbip。
sudo apt install -y linux-tools-common
执行 usbip 查看并安装所需要的依赖程序。

sudo apt install -y linux-tools-5.4.0-84-generic linux-cloud-tools-5.4.0-84-generic
加载内核模块。
sudo modprobe usbip-core
sudo modprobe usbip-host
树莓派
这里使用树莓派4b,ubuntu 操作系统。首先安装 openvpn。
sudo apt install -y openvpn
传输服务端生成的客户端配置文件到树莓派的 /etc/openvpn/client 文件夹,扩展名修改为 .conf。然后可以使用 systemdctl 启动 openvpn 客户端。
sudo systemctl start [email protected]文件名

使用 ifconfig 命令获取客户端 ip 地址。

安装 usbip。
sudo apt install -y linux-tools-common
和云服务器一样,执行 usbip 查看并安装需要的程序。
sudo usbip
sudo apt install -y linux-tools-5.13.0-1009-raspi linux-cloud-tools-5.13.0-1009-raspi
加载内核模块。
sudo modprobe usbip-core
sudo modprobe usbip-host
启动 usbipd 进程。
sudo usbipd -D
使用 lsusb 和 sudo usbip list --local 命令确定转发的 usb 设备的 busid。
执行 sudo usbip bind --busid=你的busid 开始转发。停止转发为 sudo usbip unbind --busid=你的busid。
这里转发的是一个 usb 摄像头。

云服务器连接到树莓派
执行 sudo usbip list --remote=树莓派openvpn客户端ip 查看客户端转发设备列表。

执行 sudo usbip attach --remote= 树莓派openvpn客户端ip --busid=转发设备的busid。
服务端使用 lsusb 可以看到连接成功。

使用 v4l2 可以看到转发的摄像头正常。

文章评论