通过上一篇文章,我们实现了了局域网内 MJPG-Streamer 的物联网监控方案,今天带领大家完成《ffmpeg nginx rtmp/httpflv》的公网视频监控。
上一篇文章链接如下:
手把手教你视频监控之 MJPG-Streamer 方案
今天这篇文章,我们先看效果:
1、获取板子上摄像头的视频流,使用 ffmpeg 进行 RTMP 推流到板子上的 nginx 服务器,在外网使用 vlc 播放器从 nginx 服务器获取这个视频流(拉流)。
我中间进行了暂停,因为 imx6ull 性能较差,RTMP 推流拉流中对视频流进行编解码需要40秒左右,所以进行了暂停。(由视频中可以看出,我获取视频流中间采用的是 http://23872841lv.zicp.vip/ 这个网址,而不是IP地址,说明拉流是在公网,在局域网内输入IP地址也是可以的)
推流命令:
代码语言:javascript复制ffmpeg -f v4l2 -framerate 10 -i /dev/video1 -q 10 -f flv rtmp://127.0.0.1/live/wei
拉流命令:
代码语言:javascript复制http://23872841lv.zicp.vip/test?app=live&stream=wei
想要在公网进行拉流,需要购买花生壳的内网穿透进行域名映射,将板子的IP地址映射到外网:
2、如果觉得使用 vlc 软件拉流不方便,因为还要下载软件,可以自己弄个 html 网页,对视频流进行解析。但是博主照的韦老师的教程弄了个可以解析视频流的 html 网页,获取摄像头图像太卡,所以这里改成获取板子上的 mp4 文件,然后在自己的网页进行拉流:
可以使用网页进行解析的原因,是因为 RTMP 推流本身不像 RTSP 那样复杂, RTMP 推的流只需要在浏览器安装插件就可以播放视频流,这里使用flv.js,这是b站的开源播放器,GitHub有1W多star。
推流命令:
代码语言:javascript复制ffmpeg -re -i test.mp4 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/wei
拉流命令(直接访问板子 IP 即可,有一个自己写的 index.html,html 会获取视频流):
代码语言:javascript复制http://23872841lv.zicp.vip/
实现
架构:
Nginx在流媒体方案中的位置
推流端
FFmpeg 使用 RTMP 协议向 Nginx 推流。
拉流端(二选一)
1、VLC 播放器使用 RTMP 或 HTTPFLV 协议从 Nginx 拉流。
2、浏览器使用 HTTPFLV 协议从 Nginx 拉流(安装flv.js)。
具体的实现大家可以看韦老师的教程,手把手教学:
https://www.100ask.net/detail/p_5f0fc9e9e4b0ee0b8872c2c3/6
也有PPT
我们只说几个知识点
不光是在 imx6ull 板子可以实现,在其他板子也可以。因为我们知道,在嵌入式 linux 中是分层的,如果在其他板子实现:
1、首先,我们需要一个对应板子的 uboot 。
2、我们需要有对应板子的内核(使能UVC:usb video capture)和设备树文件。我们使用的是USB摄像头,所以 USB 驱动部分不可以有问题,这样摄像头插入板子以后,会在/dev/video*下面产生一个新的设备节点,我们读写这个设备节点可以获取视频流。
3、视频监控项目所需要的 ffmpeg、nginx 等都是在文件系统中,所以我们只需要使用 buildroot 编译新的文件系统,对所需要软件进行移植。编译完成可以下载进板子,也可以通过 nfs 挂在到板子上。
为了方便,博主的 uboot 是下载到板子中,linux 内核和设备树是通过 tftp 挂载到板子上,根文件系统由于太大,是通过 nfs 挂载到板子上,调试很方便。
手把手教你用 buildroot 构建根文件系统
Nginux本身不支持RTMP,需要第3方模块。
nginx-rtmp-module:实现了RTMP协议
nginx-http-flv-module:在nginx-rtmp-module的基础上,实现了HTTPFLV,并覆盖nginx-rtmp-module的所有功能。
所以,我们将会在 Nginx 上使用nginx-http-flv-module。源码位置:https://github.com/winshining/nginx-http-flv-module/,我们可以按照韦老师的教程移植到文件系统中。
目前几种视频流的简单对比:
- RTMP(Real Time Messaging Protocol)是基于TCP的,由Adobe公司为Flash播放器和服务器之间音频、视频传输开发的开放协议。
- HLS(HTTP Live Streaming)是基于HTTP的,是Apple公司开放的音视频传输协议。
- HTTP FLV则是将RTMP封装在HTTP协议之上的,可以更好的穿透防火墙等。
note:使用 vlc 播放器点播 mp4 文件或者直播获取摄像头视频流都可以,使用浏览器的话,flv.js 现阶段支持的较少,手机端浏览器基本不支持,电脑端浏览器看情况支持,未能做到很好的兼容,请注意!!!
·················· END ··················