本文将介绍如何使用爱芯派Pro开发板、USB摄像头和个人电脑搭建一个简单的视频直播系统。本文搭建的简单视频直播系统主要由三个软件构成,分别是运行在爱芯派Pro 开发板上的ffmpeg和nginix,以及运行在PC上的VLC。他们三者的作用分别是,nginx(借助http-flv模块)实现视频流转发功能,ffmpeg实现视频流推送功能,PC上的VLC播放器实现视频流拉取和播放功能。
一、准备工作
1.1 硬件准备
开始本文的实验之前,需要准备的硬件有:
- 爱芯派Pro开发板(包括电源适配器)
- USB摄像头
- 路由器(包括电源适配器)
- PC
- 网线
- USB A-to-C线
1.2 软件准备
PC上,需要准备VLC播放器,用于播放视频流,可以从VLC官网下载:官方下载:VLC media player,最棒的开源播放器 - VideoLAN
爱芯派Pro上,准备一些软件:
- 编译工具链,安装命令: sudo apt install build-essential g++ git make
- ffmpeg命令行工具,安装命令: sudo apt install ffmpeg
- nginx依赖的openssl库,安装命令: sudo apt install libssl-dev
开放板上的其他软件,可以用命令行安装。
二、安装nginx和http-flv模块
2.1 nginx和nginx-http-flv-module简介
来自官方的介绍:
nginx [engine x] 是一个 HTTP 和反向代理服务器、一个邮件代理服务器和一个通用的 TCP/UDP 代理服务器,最初由 Igor Sysoev 编写。长期以来,它一直在许多重载的俄罗斯网站上运行,包括Yandex,Mail.Ru,VK和Rambler。根据 Netcraft 的数据,在 2023 年5月份世界上21.18%活跃的网站正在使用nginx。
NGINX本身也是开源软件,它的源码以2段式的BSD协议发布。
NGINX源码是高度模块化设计的,开源社区中有非常多的nginx模块,本文介绍的 http-flv 模块也是一种nginx模块。
nginx最基础的功能为http(https)服务器以及反向代理功能,http-flv 模块则提供了流媒体转发的功能。
nginx-http-flv-module是基于https://github.com/arut/nginx-rtmp-module 的,nginx-http-flv-module相比于nginx-rtmp-module,,除了基础的rtmp流转发功能外,还扩展了很多功能,二者功能对比如下:
2.2 编译并安装nginx和http-flv模块
由于nginx-http-flv-module是三方模块,nginx源码本身是不具有该模块的,因此需要通过源码编译的方式安装。接下来介绍,如何通过源码编译的方式安装nginx和nginx-http-flv-module。
首先,下载nginx和nginx-http-flv-module源码,以及nginx依赖的pcre、zlib源码。
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar xvf nginx-1.24.0.tar.gz
wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
tar xvf pcre-8.45.tar.gz
wget https://www.zlib.net/zlib-1.3.tar.gz
tar xvf zlib-1.3.tar.gz
git clone https://github.com/winshining/nginx-http-flv-module.git
接下来,编译nginx和nginx-http-flv-module源码:
cd nginx-1.24.0/
./configure --with-pcre=../pcre-8.45/ --with-zlib=../zlib-1.3/ --add-module=../nginx-http-flv-module/
make -j 8
编译完成:
安装命令:
sudo make install
安装完成:
其中,nginx可执行文件安装位置为:/usr/local/nginx/sbin/nginx ,所在目录 /usr/local/nginx/sbin 不在 PATH环境变量下,所以无法直接通过 nginx 命令执行。解决方法有两种,一种是在PATH环境变量现有的某个目录中创建符号链接,指向这个文件;另一种是,将所在目录添加到PATH环境变量中。
当前用户和root用户PATH环境变量的值:
创建符号链接:
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
安装完成后,查看版本信息:
三、运行nginx和http-flv模块
3.1 启动nginx服务
成功安装nginx后,使用如下命令即可启动 nginx:
sudo nginx
查看nginx进程,可用用pgrep:
pgrep -a nginx
输出如下:
或者,使用命令:
ps -A | grep nginx
输出如下:
3.2 修改nginx配置
默认的nginx配置,仅包含http服务功能,需要添加相关配置才能启用http-flv功能。
首先使用vim打开 /usr/local/nginx/conf/nginx.conf 文件,
sudo vim /usr/local/nginx/conf/nginx.conf
然后,在文件末尾添加:
rtmp
{
server
{
listen 1935;
chunk_size 4096;
application live
{
live on;
max_connections 1024;
}
}
}
最后,保存并退出。
3.3 验证配置无误
修改完配置后,验证一下配置正确,再重启服务比较稳妥,验证命令为:
sudo nginx -t
运行输出如下:
syntax is ok,表示配置没有问题。
3.4 重新加载nginx配置
配置没有问题之后,就可以重启nginx了,可以使用如下命令:
sudo nginx -s realod
再次执行 pgrep -a nginx 命令:
可以看到 worker process 进程号已经变了。
四、推送视频流
4.1 准备摄像头
爱芯派Pro有4个USB口,两个蓝色的是3.0接口,两个黑色是2.0接口。我使用的是海康USB摄像头,型号 DS-E11,分辨率 640x480@25fps 或 1280x720@25fps,插在USB 2.0接口上。
4.2 查看摄像头信息
插上摄像头后(MIPI摄像头需要断电操作),可以使用 v4l2-ctl 命令查看摄像头信息。
如果没有v4l2-ctl命令,则需要先安装v4l-utils软件包:
sudo apt install v4l-utils
列出所有V4L设备:
设备详细信息:
4.3 使用ffmpeg推流
前面我们已经成功启动了nginx,并且修改了nginx的配置文件,添加了RTMP协议转发的配置。
现在,我们可以使用 ffmpeg 命令推流了,推流命令为:
sudo ffmpeg -i /dev/video1 -f flv rtmp://192.168.0.102:1935/live/test
其中 -i 选项用于指定输入设备,-f 选项用于指定视频格式,最后是推送的视频流链接。其中,/live 路径和前面的nginx配置对应。
命令报错,换了一个USB摄像头,任然报错,两个USB摄像头在Windows系统上都可以正常使用。
安装了 guvcview 同样无法打开摄像头查看画面,感觉像是V4L2内核驱动有问题,暂时不折腾了。
不重要,本文的重点是介绍如何在AX650N上运行ffmpeg、nginx、VLC这三个软件。
接下来,使用视频替代摄像头,进行推流(板子上自带的视频):
sudo ffmpeg -i /root/boxvideos/01.mp4 -f flv rtmp://127.0.0.1:1935/live/test
五、查看视频流
有了前面的准备工作,现在就可以在PC上使用VLC播放器查看视频流画面了。
5.1 使用LVC查看视频流
接下来,在PC上打开VLC播放器,通过 媒体→打开网络串流 菜单,在URL栏输入刚刚的链接:
为了降低延迟,这里可以勾选显示更多选项,并将缓存修改为100ms:
然后,点击播放,稍等片刻就可以看到画面了:
六、参考链接
- nginx官网: https://nginx.org/
- nginx-http-flv-moudle: https://github.com/winshining/nginx-http-flv-module/
- VLC官网: 官方下载:VLC media player,最棒的开源播放器 - VideoLAN
- FFMPEG官网: https://ffmpeg.org/
- [2022.8.15]v4l2-ctl基本使用方法_v4l2-ctl命令_vimer-hz的博客-CSDN博客