本文将介绍——如何在VisonFive2开发板上使用nginx和http-flv模块实现视频流转发、如何使用ffmpeg推流,以及如何在PC上使用VLC播放器查看视频流的画面。本文首先介绍如何通过源码编译并安装nginx和http-flv模块,然后介绍如何使用ffmpeg推流,最后介绍如何在PC上使用VLC播放器查看视频流中的画面。在本文介绍的实验中,nginx及http-flv模块作为视频流服务器,ffmpeg作为视频流推送端,VLC作为视频流播放端,三者形成了一个简单的视频直播系统。
一、准备工作
1.1 硬件准备
开始本文的实验之前,需要准备的硬件有:
- VisionFive2开发板
- USB摄像头
- 路由器
- PC
- 网线
1.2 软件准备
PC上准备好VLC播放器,用于播放视频流,可以从VLC官网下载:官方下载:VLC media player,最棒的开源播放器 - VideoLAN
另外,需要在VisionFive2开发板上准备一些软件:
- 编译工具链,安装命令: 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源码。
# 下载 ningx 最新稳定版源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 解压 nginx
tar xvf nginx-1.24.0.tar.gz
# 下载 pcre 最新稳定版源码
wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
# 解压 pcre
tar xvf pcre-8.45.tar.gz
# 下载 zlib 最新稳定版源码
wget https://www.zlib.net/zlib-1.3.tar.gz
# 解压 zlib
tar xvf zlib-1.3.tar.gz
# 下载 nginx-http-flv-module 源码
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/
# 构建,4个并发任务,VisionFive2 有4个核,4个任务已经可以跑满CPU
make -j 4
# 安装
make install
# 安装完成后,创建符号链接,方便使用
sudo ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
编译完成:
安装完成:
安装完成后,查看版本信息:
三、运行nginx和http-flv模块
3.1 启动nginx服务
成功安装nginx后,使用如下命令即可启动 nginx:
sudo nginx
查看nginx进程,可用用pgrep:
pgrep -a nginx
输出如下:
或者,使用 ps -ef | 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
四、推送视频流
4.1 准备摄像头
VisionFive2有4个USB口,另外也有MIPI-CSI接口,因此,可以用USB摄像头也可以用MIPI摄像头。我这里使用的时海康的USB摄像头。
4.2 查看摄像头信息
插上摄像头后(MIPI摄像头需要断电操作),可以使用 v4l2-ctl 命令查看摄像头信息。
如果没有v4l2-ctl命令,则需要先安装v4l2-utils软件包:
sudo apt install v4l2-utils
列出所有V4L设备:
查看设备详细信息:
可以看到,摄像头的最大分辨率是1920x1080
4.3 使用ffmpeg推流
前面我们已经成功启动了nginx,并且修改了nginx的配置文件,添加了RTMP协议转发的配置。
现在,我们可以使用 ffmpeg 命令推流了,推流命令为:
sudo ffmpeg -i /dev/video4 -f flv rtmp://192.168.0.110:1935/live/test
其中 -i 选项用于指定输入设备,-f 选项用于指定视频格式,最后是推送的视频流链接。
可以看到默认的分辨率是640x360.
五、查看视频流
有了前面的准备工作,现在就可以在PC上使用VLC播放器查看视频流画面了。
5.1 使用LVC查看视频流
接下来,在PC上打开VLC播放器,通过 媒体→打开网络串流 菜单,在URL栏输入刚刚的链接:
为了降低延迟,这里可以勾选显示更多选项,并将缓存修改为100ms:
然后,点击播放,稍等片刻就可以看到画面了:
5.1 设置摄像头分辨率
前面我们知道这个摄像头的最大分辨率是1920x1080了,接下来我们将设置为最大分辨率。
首先,Ctrl+C停止ffmpeg推流。
接着,使用v4l2-ctl设置摄像头分采的分辨率:
sudo v4l2-ctl --device /dev/video4 --set-fmt-video=width=1920,height=1080
然后,重新启动ffmpeg推流:
sudo ffmpeg -i /dev/video4 -f flv rtmp://192.168.0.110:1935/live/test
此时,可以看到命令行输出:
重新打开VLC,播放网络串流 rtmp://192.168.0.110:1935/live/test,可以看到画面变大了,也变清晰了:
本篇内容就到这里了,感谢阅读,下次再会。
六、参考链接
- 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博客