手把手教你做一个物联网视频监控项目(三)流媒体方案实现

往期文章
手把手教你做一个物联网视频监控项目(一) 介绍
手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现


前言

最近想做一个安防相关的项目,所以需要储备视频监控方案的相关知识,冲韦东山老师的视频中学到了相关知识,很好地满足我的需求。特将学习的整个过程、笔记记录下来,本系列文章将会引用许多韦老师项目的内容,有兴趣的同学可以去看看韦老师的这个课程,原理讲得不深,但是单纯应用绝对够用
韦东山老师手把手带你从0开始自己做一个视频监控项目

本章把流媒体方案分成两个部分来讲解,分别是推流端用FFmpeg,拉流端可以用Nginx。

一、软硬件准备

硬件:a. 100ASK_IMX6ULL开发板 (或其他Linux开发板);b. USB摄像头
软件:a. Ubuntu(可以用虚拟机安装Ubuntu);b. Buildroot(Buildroot会自动下载其他软件: MJPG-streamer, ffmpeg, nginx);

二、流媒体方案的实现之FFmpeg

2.1 FFmpeg

Ffmpeg是什么

  • 一套开源软件
  • 可以记录、转换音视频:可以从摄像头中记录视频,从声卡中记录音频,可以转换为各种格式,保存起来
  • 还可以把各种格式的音视频,转换为流:供在线观看
  • 其他功能:视频截图、加水印、裁剪等等
  • Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音等视频频播放器的内核就是 FFmpeg
  • 格式工厂的内核也是FFmpeg

2.2 FFmpeg简易理解


误区:我们以为mp4就代表了音频、视频的压缩格式,其实不是

  • Mp4只是一种封装格式
  • 里面有音频数据、视频数据
  • 音频数据有自己的压缩格式,还不止一种
  • 视频数据也有自己的压缩格式,还不止一种

参考文章

视音频编解码技术零基础学习方法

在这里插入图片描述
在这里插入图片描述

2.3 FFmpeg的重要概念

1.重要概念
在这里插入图片描述

2.FFmpeg处理音视频的过程在这里插入图片描述
用Filter(过滤器)来处理

  1. 旋转、拉伸
  2. 添加LOGO、消除LOGO等等

3.FFmpeg的常用参数
在这里插入图片描述

2.4 移植、运行FFmpeg

1.移植
有两种方法:
方法一:下载源码,手工编译
方法二:使用Buildroot,配置选择ffmpeg,直接编译生成映象文件
我们使用Buildroot:

  1. 设置交叉编译工具链
  2. 在Buildroot根目录
  3. make menuconfig
  4. 如图选择ffmpeg (在buildroot 按‘/’可以搜索ffmpeg的路径)
  5. 执行make
  6. 这会在Buildroot的dl/ffmpeg目录下自动下载源码,并编译
  7. 结果保存在output/images目录下,有emmc.img, sdcard.img,可以直接烧写到板能的EMMC或SD卡上

在这里插入图片描述

2.运行FFmpeg
在开发板上安装好ffmpeg后:
执行命令:

ffmpeg -f v4l2 -framerate 10 -i /dev/video1 -q 10  my.mp4
  • 它会把摄像头的数据录制为my.mp4
  • 把my.mp4复制到PC机,播放

上述命令的解释:-f(format)摄像头的格式是v4l2 framerate 10 1秒读10帧 -I 输入设备是哪一个: /dev/video1 -q:质量 为10 生成名为my.mp4的文件

更多用法:

  • ffmpeg基础使用:https://www.jianshu.com/p/ddafe46827b7
  • 给新手的 20 多个 FFmpeg 命令示例:https://zhuanlan.zhihu.com/p/67878761

建议在Windows下练习:

  • 下载static版本:https://ffmpeg.zeranoe.com/builds/
  • 在命令行中练习ffmpeg

三、流媒体方案的实现之Nginx

3.1 Nginx是什么

  • 一套开源软件,纯C语言编写,效率高
  • HTTP和反向代理web服务器,同时也是一个 IMAP、POP3、SMTP 代理服务器
  • 稳定、高效,支持高并发
  • 即使强如阿里巴巴,也是使用Nginx:
    http://tengine.taobao.org/,它就是在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
  • 我们只关注Nginx可以作为流体服务器,支持RTMP、HTTPFLV、HLS等协议

3.2 Nginx在流媒体方案中的位置

在这里插入图片描述
推流端

  • FFmpeg使用RTMP协议向Nginx推流

拉流端

  • VLC播放器使用RTMP或HTTPFLV协议从Nginx拉流
  • 浏览器使用HTTPFLV协议从Nginx拉流(安装flv.js)

让Ngnix支持RTMP、HTTPFLV协议
Nginux需要第3方模块
nginx-rtmp-module:实现了RTMP协议
nginx-http-flv-module:在nginx-rtmp-module的基础上,实现了HTTPFLV,并覆盖nginx-rtmp-module的所有功能
所以,我们将会在Nginx上使用nginx-http-flv-module
第3方模块源码:
https://github.com/winshining/nginx-http-flv-module/
添加第三方模块这部分下面配置buildroot会涉及到。

3.3 移植Nginx

有两种方法:
方法1:下载源码,手工编译
方法2:使用Buildroot,配置选择Nginx,直接编译生成映象文件
我们使用Buildroot:

  1. 设置交叉编译工具链
  2. 下载第3方模块: 在Buildroot目录下,创建目录:mkdir dl/nginx 使用git下载:cd dl/nginx && git clone https://github.com/winshining/nginx-http-flv-module.git
  3. 在Buildroot根目录 make menuconfig
    把原来的lighttpd去掉。(否则板子也会自动启动它,就会有两个HTTP服务了:lighttpd, nginx)
  4. 如图选择Nginx,建议把所有功能都选上
  5. 并且设置额外的参数,在“additional modules”中添加:
    $(TOPDIR)/dl/nginx/nginx-http-flv-module
  6. 最后执行(先删除之前编译的nginx,我发现有时设置的第3方模块不起作用,删除后再make就可以了):rm -rf
    output/build/nginx-1.15.7 && make
  7. 这会在Buildroot的dl/nginx目录下自动下载源码,并编译
  8. 结果保存在output/images目录下,有emmc.img, sdcard.img,可以直接烧写到板能的EMMC或SD卡上
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

3.4 运行Ngnix

在开发板上烧写好映像文件后,开发板启动时会自动运行Ngnix
为了让它支持RTMP、HTTPFLV,需要修改配置文件/etc/nginx/nginx.conf :

在这里插入图片描述
在这里插入图片描述
修改后:

重启Nginx服务:

/etc/init.d/S50nginx restart

3.5 测试流媒体方案

在开发板上运行了Nginx后,它就已经是一个WEB站点了。
可以在电脑浏览器里输入开发板的IP访问开发板:如图
在这里插入图片描述
推流
在开发板上执行:

ffmpeg -f v4l2 -framerate 10 -i /dev/video1 -q 10  -f flv rtmp://127.0.0.1/live/wei

拉流
在PC上安装VLC播放器:https://www.videolan.org/

  1. 使用RTMP协议拉流:VLC播放器中点击“媒体”->“打开网络串流”,输入:rtmp://192.168.2.123/live/wei
    就可以播放了
  2. 使用HTTPFLV协议拉流:VLC播放器中点击“媒体”->“打开网络串流”,输入: http://192.168.2.123/test?app=live&stream=wei ,就可以播放了

缺点
IMX6ULL性能太弱,在VLC播放器里看到的视频很卡,很滞后
我们可以上传一个mp4文件到开发板,把它推到Nginx: ffmpeg -re -i test.mp4 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/wei
然后再用VLC拉流看看,会发现很顺畅

笔记:推送mp4文件就不会涉及到编解码 就会快 会把mp4里面的视频音频原样推送给nginx -re :保持原来的播放速度(就不用一下子把文件全推) -i test 取test这个文件 -vcodec copy -acodec copy 视频、音频编解码器 保持跟原来的一样 。

framerate 10 代表1秒10帧 –q 10 代表质量是10
-f flv rtmp://127.0.0.1/live/wei 以rtmp协议推送给本地服务器
rtmp://192.168.1.6/live/wei 使用rttp拉流
live是app stream name是wei 从开发板找到live这个app里面wei的这个流

http://192.168.1.6/test?app=live&stream=wei 是用httpflv协议拉流 test是目录 对应前面写的节点 去这个目录里面拉这个app live的stream 就可以播放了

四、浏览器播放

参考:
无插件web直播解决方案,ffmpeg+nginx-http-flv-module+flv.js
https://blog.youkuaiyun.com/string_kai/article/details/100598268
HTTP-FLV直播初探
https://www.cnblogs.com/saysmy/p/7851911.html
具体参考步骤如下:
1.修改/etc/nginx/nginx.conf:
如下:
location /test {
flv_live on;
chunked_transfer_encoding on;
add_header ‘Access-Control-Allow-Origin’ ‘*’;
add_header ‘Access-Control-Allow-Credentials’ ‘true’;
}

在这里插入图片描述
2.编写一个html网页
无插件web直播解决方案,ffmpeg+nginx-http-flv-module+flv.js
https://blog.youkuaiyun.com/string_kai/article/details/100598268
Heml的demo:
HTTP-FLV直播初探
https://www.cnblogs.com/saysmy/p/7851911.html
新建一个html文件,复制里面的源码

  1. 修改里面的url地址 https://xl.live-play.acgvideo.com/live-xl/520658/live_12860646_332_c521e483.flv?wsSecret=778d91efcb22c588be28cb67ebe57082&wsTime=1510929009
    修改为: http://192.168.2.123/test?app=live&stream=wei (我们的html拉流串流)
  2. 他用到一个flv.js文件 我们本地没有 所以要去网上下载 在html中改: <script src=“./flv.js?v=2”>
    改为

3.把开发板中的 /usr/html/index.html里面的内容改为上述保存的html的内容,就大功告成了。
此时在浏览器中输入开发板的ip,便可以访问监控页面,如图。
在这里插入图片描述
注意我的开发板的ip是192.168.2.123,老师使用的是192.168.1.6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值