一 网络直播
对于视频监控来说,以前主要是局域网监控,随着网络技术发展,网络摄像头出现,使得监控从局域网大量的扩展到了互联网上。买一个网络摄像头,进行简单的设置就可以随时随地使用手机来查看家里的情况。 这个和互联网直播其实也是一个道理,以前的直播主要是在PC端,而现在也是扩展到了手机端。所以监控和直播本质上是一样的,都是视频采集、推送到服务端、客户端从服务端获取视频播放的过程。所以在使用树莓派搭建监控的时候,正好可以学习了解一下直播相关的一些知识。
上图显示了一个直播平台大致的样子,主要有几个步骤:
1. 音视频采集、编码、封装
2. 视频流传送到服务器(推流)
3. 服务器对视频流进行相应的处理,比如转码、存储等,也可以进行一些高级的处理。
4. 服务器把视频流进行分片,然后发送到CDN
5. 客户端从CDN拉取视频流进行播放
树莓派增加摄像头之后,就可以进行视频的采集,采集后的数据需要推送到服务器。所以需要搭建服务器来接收树莓派发送来的视频流。 而客户端可以直接使用VLC播放器连接到服务器这样就可以观看直播了。
二 直播协议
树莓派采集的视频需要传送到服务端,前一篇在局域网内试验中有传递原始的裸流,也有传递ts封装后的视频流。我们把采集端将编码封装后的视频流推送到服务端的过程叫做推流
。 目前常见的直播协议主要有RTMP
、RTP
、HLS
、HTTP-FLV
等。
协议 | 传输层协议 | 封装格式 | 数据分段 | 延时 | H5支持 | 优缺点 |
---|---|---|---|---|---|---|
RTMP | TCP | FLV | 连续流 | 2-5s | 不支持,使用FLASH播放器 | 实时性高、延迟低、需要引入库来播放 |
HLS | HTTP短连接 | TS(m3u8索引) | 切片 | 10-30s | 支持 | H5/IOS/Android支持播放、可以穿透防火墙、延迟高 |
HTTP-FLV | HTTP长连接 | FLV | 连续流 | 2-5s | 不支持,flv.js | 实时性高、延迟低、可以穿透防火墙、需要引入库来播放 |
RTSP | TCP/UDP | TS/MP4 | 连续流 | 1s | 不支持 | 实时性高 |
DASH | HTTP | MP4/3GP/WEBM | 切片 | 低 | 支持 | 支持动态码率适配,支持多码率平滑切换 |
以上的表是从网上总结下来的,协议具体信息力并没有很深的了解。 从网上了解到,目前而言大多直播使用的RTMP/HTTP-FLV,B站、爱奇艺、优酷等大型视频网站视频点播主要用的是DASH。
下面是相关协议介绍的一些网站:
http://www.cnblogs.com/wintersun/p/5860437.html
https://www.jianshu.com/p/a9c2db7b1fb9
https://www.jianshu.com/p/32417d8ee5b6
三 开源流媒体服务器
常见的开源流媒体服务器主要有以下这些:
服务器 | 支持协议 | 开发语言 | 备注 |
---|---|---|---|
Red5 | RTMP | Java | |
Live555 | RTSP | C++ | |
nginx-rtmp | RTMP/HLS/DASH | C | 基于Nginx的插件 |
EasyDarwin | RTSP/RTMP/HLS | 一整套开源的流媒体平台框架 | |
SRS | RTMP/HLS/HTTP-FLV | C++ |
目前使用nginx-rtmp插件的相对比较多,而且我的服务器也都已经从Apache换成了Nginx,所以我也使用这个来搭建了流媒体服务器。
四 nginx-rtmp
默认Nginx是不支持nginx-rtmp插件的,并且也无法安装,所以只能自己用源码重新编译一个nginx,并且加入nginx-rtmp的支持。
1.下载nginx源码
因为我之前已经安装了一个版本的nginx ,查看下是1.14.0,所以下载同样版本的源码
可以直接通过git
命令从 https://github.com/nginx/nginx.git
下载并且换到最新分支,也可以直接从https://github.com/nginx/nginx/releases 下载源码包。 我是下载的源码包,因为直接包含编译需要的configure
文件。 下载好解压到服务器
2.安装依赖
编译Nginx需要安装一些必要的库
否则在后面进行配置的时候可能会报错, 比如缺少pcre库就会报错
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
我的主机是Ubuntu14.04,安装pcre的时候报错
The following packages have unmet dependencies:
libpcre3-dev : Depends: libpcre3 (= 1:8.31-2ubuntu2.3) but 2:8.41-4+ubuntu14.04.1+deb.sury.org+1 is to be installed
E: Unable to correct problems, you have held broken packages.
意思是要安装的libpcre3-dev依赖的libpcre3的版本和已安装的不同。这个时候强制安装对应版本的libpcre就可以了
3.编译源码
编译前先进行配置,关键就是要让Nginx支持nginx-rtmp,网上教程一般都是使用下面命令
但这个配置和现有的nginx有区别,导致影响其他功能,所以可以先看一下当前nginx的参数, 使用nginx -V
然后我们只需要在现有的参数上加上rtmp模块--add-module=/home/chengchao/source/nginx-rtmp-module
nginx-rtmp下载地址:https://github.com/arut/nginx-rtmp-module.git
然后执行 ./configure
后面带上前面构建好的参数就可以执行配置了, 配置成功后执行make
命令进行编译。编译成功后objs目录下会出现新的nginx可执行文件。
如果机器安装过关nginx,查询一下安装位置
把编译出来的拷贝过去并重启服务就好了,如果以前没有装个nginx,可以执行make install
进行安装。 安装完成后,再次执行nginx -V
查看是否已经支持了nginx-rtmp
4.配置RTMP
首先编辑nginx的都配置文件, 前面编译nginx的时候指定了配置文件路径:--conf-path=/etc/nginx/nginx.conf
,在这个文件中添加RTMP相关的配置
更多详细的配置,可以参考github上: https://github.com/arut/nginx-rtmp-module/wiki/Directives
5.查看服务器状态
RTMP服务器的状态是可以监控的,它提供了一个WEB页面。需要在nginx中配置一下访问路径。
我这里直接配置在了域名下的/stat下,修改了default.conf
文件,大家根据自己nginx的设置来就行了。然后访问一下,能看到vod和live2个应用说明配置是好的。
这里可以看到RTMP被请求的次数,工作时间,接收和发送的数据量。 如果当前有点播或在直播在执行,可以实时看到接收和发送的数据量以及速度。
五 验证流媒体服务器
流媒体服务器搭建好之后就试用一下具体功能
点播
先试验一下vod点播,在上面vod
指定的目录下放入一个1.mp4的视频,在电脑或手机上安装一下VLC播放器,然后用VLC打开地址: rtmp://www.xxxxx.cc/vod/1.mp4 下面是播放画面,vod工作正常
拥有点播,我们就可以把监控保存到文件中,这样就可以随时查看整天的情况了。
直播
直播是我们监控主要的功能,树莓派上推流还没准备好,所以我们先用其他推流软件来测试一下服务器。目前用的最多的是OBS
Free and open source software for video recording and live streaming.
很多直播平台也可以使用这个进行推流,他的功能非常强大,支持Linux、Mac、 Windows。下载安装可以直接使用。
添加媒体源
媒体源是要推流的视频,可以把本地视频、桌面、图像、摄像头或其他音视频流推到指定的服务器。这里我们先用本地的一步电影作为视频源,添加后就开始播放了。
设置推流服务器
然后右侧有设置,我们先设置一下推流服务器。 这里选择串流,服务中定义了一些国外的网站,我们这里使用自己的服务器选择自定义
,服务器地址填入rtmp://www.xxxx.cc/live
, 服务器没有做身份验证所以不需要,串流密钥随便填就行了
推流
开始推流之后。底部状态栏有时间、速度、cpu占用率等信息。
OBS支持推流的同时进行录了像,还可以设置推流的视频属性,具体都在设置里。这里就不多介绍了。
查看状态
开始推流之后,我们看一下RTMP服务器的状态
live下多了一个名字为11的直播流,我们可以看到它的音视频的编码格式、比特率、帧率等信息,数据的接收和发送量以及速度都有显示。
客户端观看
直播已经正常工作了,最后使用VLC播放器来看一下直播。地址是 rtmp://www.xxxx.cc/live/11
左边是OBS推流的本地视频,右边是通过VLC从服务器观看的直播视频,延迟在5s以内, 不过不知道为啥在家里有点卡,可能以为服务器在国外吧。
同时看一下RTMP服务器状态,显示有2个客户端连接到服务器,同时输出的数据和速度也有显示了。 至此,RTMP流媒体服务器就搭建完成了。
六.总结
通过搭建流媒体服务器,实现点播和直播功能,对于直播有了一个相对直观的理解。后面就是从树莓派上把监控视频以RTMP协议推送到服务器上就可以了。这里要注意你的服务器流量的消耗,特别是用国内腾讯云或阿里云按流量计费的服务器,免得产生大量的费用。
我用的是国外的服务器,带宽是100M,每个月的流量是3T,估算一下,如果1小时的视频流量是1G,一天是24G, 一个月是720G, 如果我每天24小时观看,一个月总的流量消耗在1.5T左右。 我一个人看的话不太会有问题。
最好是可以控制树莓派,在需要时才推流,这样可以大量的节省流量。 如果使用国内云服务器,按带宽计费的,一般都是1M小水管,应该会卡的不行。
最后说一下OBS和VLC这两个工具,很不错,大家可以多用用。 树莓派上可以使用VLC但是没有OBS。
树莓派怎么安装OBS?我一直没装上
国外的服务器这个用的是哪个?不会被墙吗
正常做网站不会。 用的budgetvm