前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频监控之 ffmpeg + nginx + rtmp/httpflv

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

作者头像
Jasonangel
发布2021-07-07 10:15:01
3.1K0
发布2021-07-07 10:15:01
举报

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式Linux系统开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现
  • 我们只说几个知识点
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档