Licheerv Nano部署rvnano_webrtc_streamer
Licheerv Nano部署rvnano_webrtc_streamer

前期准备
为了跑通这个项目,需要准备三个文件夹:
📁root
├─ 📁ballrobot20240702
├─ 📁cvi_media_src-main
└─ 📁rvnano_webrtc_streamer-master
其中ballrobot20240702
是配置项和前端文件;cvi_media_src-main
是编码器;rvnano_webrtc_streamer-master
是主目录。
另外需要一台ubuntu服务器,以及一台能够提供端口代理的主机。
过程
编译sdk
板子的sdk要手动编译,而不是直接下载release。一是因为后续要在宿主机利用它的tool-chain编译cvi,二是需要修改一些配置项。
项目地址:
克隆项目
git clone https://github.com/sipeed/LicheeRV-Nano-Build --depth=1
cd LicheeRV-Nano-Build
git clone https://github.com/sophgo/host-tools --depth=1
由于使用的是远程服务器,配置trojan代理会非常麻烦。对于克隆项目,有一个无需配置代理的方式,就是把github的项目迁移至gitcode再clone,我已经完成了迁移,所以可以直接使用:
git clone https://gitcode.com/weixin_47363410/LicheeRV-Nano-Build.git --depth=1
cd LicheeRV-Nano-Build
git clone https://gitcode.com/weixin_47363410/host-tools.git --depth=1
但是后面在编译过程中,自动化脚本会从github下载东西,如果try了3次还443就会编译失败。所以为了一劳永逸地解决墙的问题,我选择使用ssh反向代理:
ssh -R <server ip>:1080:127.0.0.1:7890 <server username>@<server ip>
它把服务器的sock5代理端口连接到本地clash的trojan代理端口,也就是可以让服务器使用本地的网络。但是尚不清楚这样做是否有实际作用。
进入编译容器
项目提供了带有编译工具链的docker容器,免于配置。
cd host/ubuntu
docker build -t licheervnano-build-ubuntu .
docker run --name licheervnano-build-ubuntu licheervnano-build-ubuntu
docker export licheervnano-build-ubuntu | tar2sqfs licheervnano-build-ubuntu.sqfs
singularity shell -e licheervnano-build-ubuntu.sqfs
有两点要注意:
- 原项目的readme写的
sqfstar
命令已经在新版的squashfs-tools
包中被移除,所以使用tar2sqfs
命令替代。 - 安装
singularity
包时不要直接apt-get install,因为这样安装的是最老的1.0b版本,无法执行下面的命令。需要手动下载singularity的4.x版本并编译。
其余按原文档进行即可。
修改配置文件
注意上一步进入容器后,由于设置了目录挂载,所处的路径还是在host/ubuntu
,要先cd出来。之后按链接1和链接2找到两个相应的配置文件,按链接中的方式修改或直接替换(要连校园网)。
编译
进入项目根目录,
source build/cvisetup.sh
defconfig sg2002_licheervnano_sd
build_all
build的过程几乎不可能一次成功,多执行几次即可。成功的标志是在/root/LicheeRV-Nano-Build/install/soc_sg2002_licheervnano_sd/images
中能找到.img
镜像文件。
烧录镜像
用rufus把编译出来的镜像烧到sd卡并启动板子。用户名和初始密码都是root。
编译视频编码器
按cvi_media_src
中的readme指示来做即可,编译完成后得到一个可执行文件。
编译主目录
刚才的所有准备都是为了凑齐它的配置项。在编译时,我推荐使用cross工具,它依赖docker,能自动地解决交叉编译的依赖问题。
配置文件
可以从ballrobot20240702/zhengshu/robot01/options.toml
找到,内容:
[mqtt]
ca = "/root/iroball/ca.pem"
cert = "/root/iroball/robot_01.pem"
key = "/root/iroball/robot_01-key.pem"
mqtt_host = "ecs.mcurobot.com"
mqtt_port = 10200
[webrtc]
src_executable = "/root/iroball/cvi_media_src"
video_bitrate = 1500 # doesn't work when using h264 camera with gstreamer
audio_listen = "127.0.0.1:20010"
audio_sink = "127.0.0.1:20011"
[robot]
serial_port = "/dev/ttyS1"
把刚才编译出来的可执行文件cvi_media_src
和robot01
文件夹的其余内容都放在/root/iroball
目录下。
编译
编译命令(已安装cross):
cross build --target riscv64gc-unknown-linux-gnu
可以使用qemu来调试:
cd /root/rvnano_webrtc_streamer/target/riscv64gc-unknown-linux-gnu/release
qemu-riscv64 -L /opt/riscv/sysroot/ ./rvnano_webrtc_streamer
注意,调试时要把options.toml
放在和可执行文件同一目录下,即/root/rvnano_webrtc_streamer/target/riscv64gc-unknown-linux-gnu/release
。
在宿主机调试时,如果报串口错误,就说明编译没问题,剩下的过程上板进行。
上板运行
板子上的目录结构是:
📁root
├─ 📁iroball
├─ options.toml
└─ rvnano_webrtc_streamer-master
从服务器上scp过去。注意,要给所有可执行文件授权,并且尽量不要让板子连校园网(这样后面会连不上信令服务器,原因尚未可知)。之后直接执行./rvnano_webrtc_streamer-master
。
在随便一台电脑上运行ballrobot20240702/htmlfiles/rtc1.html
,点击Start Session,允许使用麦克风,即可看到视频画面。
其它注意事项
可能遇到的错误
在上板运行时,前几次可能一直循环输出
Socket sending error: Os { code: 107, kind: NotConnected, message: "Transport endpoint is not connected" }
具体原因没有查清,但是多试几次它就好了,我怀疑还是信令服务器的连接问题。
另外,如果在板上运行时提示
sh: ./rvnano_webrtc_streamer-master not found
大概率是因为使用了动态链接而没有链接库导致的,可以使用命令
file rvnano_webrtc_streamer-master
会输出:
rvnano_webrtc_streamer: ELF 64-bit LSB pie executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, BuildID[sha1]=4c08dfb10918f8ec9537ed4ccac3d29b898e0be8, stripped
那么就是缺少/lib/ld-linux-riscv64-lp64d.so.1
。我建议直接把整个动态链接库全都复制过来,即把服务器上交叉编译工具链(需要单独安装一个riscv-gnu-toolchain
,不过我感觉我可能绕了远路,应该可以直接用sdk中的工具链来编译)的lib路径/opt/riscv/sysroot/lib
中的所有文件都复制到板子的/lib
路径下。再次运行会发现至少是有输出了。