视频监控之 ffmpeg + nginx + rtmp/httpflv

2021-07-07 10:15:01 浏览数 (1)

通过上一篇文章,我们实现了了局域网内 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 ··················

0 人点赞