树莓派监控(2)— 搭建流媒体服务器

一 网络直播

对于视频监控来说,以前主要是局域网监控,随着网络技术发展,网络摄像头出现,使得监控从局域网大量的扩展到了互联网上。买一个网络摄像头,进行简单的设置就可以随时随地使用手机来查看家里的情况。 这个和互联网直播其实也是一个道理,以前的直播主要是在PC端,而现在也是扩展到了手机端。所以监控和直播本质上是一样的,都是视频采集、推送到服务端、客户端从服务端获取视频播放的过程。所以在使用树莓派搭建监控的时候,正好可以学习了解一下直播相关的一些知识。

上图显示了一个直播平台大致的样子,主要有几个步骤:
1. 音视频采集、编码、封装
2. 视频流传送到服务器(推流)
3. 服务器对视频流进行相应的处理,比如转码、存储等,也可以进行一些高级的处理。
4. 服务器把视频流进行分片,然后发送到CDN
5. 客户端从CDN拉取视频流进行播放

树莓派增加摄像头之后,就可以进行视频的采集,采集后的数据需要推送到服务器。所以需要搭建服务器来接收树莓派发送来的视频流。 而客户端可以直接使用VLC播放器连接到服务器这样就可以观看直播了。


二 直播协议

树莓派采集的视频需要传送到服务端,前一篇在局域网内试验中有传递原始的裸流,也有传递ts封装后的视频流。我们把采集端将编码封装后的视频流推送到服务端的过程叫做推流。 目前常见的直播协议主要有RTMPRTPHLSHTTP-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,所以下载同样版本的源码

cc-vps:~/source/nginx$ nginx -v
nginx version: nginx/1.14.0

可以直接通过git命令从 https://github.com/nginx/nginx.git下载并且换到最新分支,也可以直接从https://github.com/nginx/nginx/releases 下载源码包。 我是下载的源码包,因为直接包含编译需要的configure文件。 下载好解压到服务器

cc-vps:~/source/nginx-1.14.0$ ll
total 764
drwxr-xr-x 9 chengchao chengchao   4096 May 14 17:27 ./
drwxrwxr-x 5 chengchao chengchao   4096 May 14 05:00 ../
-rw-r--r-- 1 chengchao chengchao 286953 Apr 17  2018 CHANGES
-rw-r--r-- 1 chengchao chengchao 437286 Apr 17  2018 CHANGES.ru
-rw-r--r-- 1 chengchao chengchao   1397 Apr 17  2018 LICENSE
-rw-rw-r-- 1 chengchao chengchao    325 May 14 17:27 Makefile
-rw-r--r-- 1 chengchao chengchao     49 Apr 17  2018 README
drwxr-xr-x 6 chengchao chengchao   4096 May 14 04:58 auto/
drwxr-xr-x 2 chengchao chengchao   4096 May 14 04:58 conf/
-rwxr-xr-x 1 chengchao chengchao   2502 Apr 17  2018 configure*
drwxr-xr-x 4 chengchao chengchao   4096 May 14 04:58 contrib/
drwxr-xr-x 2 chengchao chengchao   4096 May 14 04:58 html/
drwxr-xr-x 2 chengchao chengchao   4096 May 14 04:58 man/
drwxr-xr-x 9 chengchao chengchao   4096 May 14 04:58 src/


2.安装依赖

编译Nginx需要安装一些必要的库

sudo apt-get update
sudo apt-get install openssl libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev

否则在后面进行配置的时候可能会报错, 比如缺少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就可以了

sudo apt-get install libpcre3=1:8.31-2ubuntu2.3
sudo apt-get install libpcre3-dev


3.编译源码

编译前先进行配置,关键就是要让Nginx支持nginx-rtmp,网上教程一般都是使用下面命令

./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_module --with-http_stub_status_module

但这个配置和现有的nginx有区别,导致影响其他功能,所以可以先看一下当前nginx的参数, 使用nginx -V

cc-vps:~/source/nginx-1.14.0$ nginx -V
\nginx version: nginx/1.14.0
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
built with OpenSSL 1.1.0h  27 Mar 2018
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-
path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-
path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-
path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-
path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-
fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-
path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --
user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module 
--with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-
http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-
http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-
http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module 
--with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-
stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-
opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-
D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--
as-needed -pie'

然后我们只需要在现有的参数上加上rtmp模块--add-module=/home/chengchao/source/nginx-rtmp-module nginx-rtmp下载地址:https://github.com/arut/nginx-rtmp-module.git

然后执行 ./configure后面带上前面构建好的参数就可以执行配置了, 配置成功后执行make命令进行编译。编译成功后objs目录下会出现新的nginx可执行文件。

cc-vps:~/source/nginx-1.14.0/objs$ ll
total 8316
drwxrwxr-x 4 chengchao chengchao    4096 May 22 18:01 ./
drwxr-xr-x 9 chengchao chengchao    4096 May 22 17:57 ../
-rw-rw-r-- 1 chengchao chengchao   76409 May 22 17:57 Makefile
drwxrwxr-x 5 chengchao chengchao    4096 May 22 17:57 addon/
-rw-rw-r-- 1 chengchao chengchao   22471 May 22 17:57 autoconf.err
-rwxrwxr-x 1 chengchao chengchao 8303797 May 22 18:01 nginx*
-rw-rw-r-- 1 chengchao chengchao    5304 May 22 18:01 nginx.8
-rw-rw-r-- 1 chengchao chengchao    9741 May 22 17:57 ngx_auto_config.h
-rw-rw-r-- 1 chengchao chengchao     657 May 22 17:57 ngx_auto_headers.h
-rw-rw-r-- 1 chengchao chengchao   12873 May 22 17:57 ngx_modules.c
-rw-rw-r-- 1 chengchao chengchao   46912 May 22 18:01 ngx_modules.o
drwxrwxr-x 9 chengchao chengchao    4096 May 22 17:57 src/

如果机器安装过关nginx,查询一下安装位置

chengchao@cc-vps:~$ which nginx
/usr/sbin/nginx

把编译出来的拷贝过去并重启服务就好了,如果以前没有装个nginx,可以执行make install进行安装。 安装完成后,再次执行nginx -V 查看是否已经支持了nginx-rtmp

4.配置RTMP

首先编辑nginx的都配置文件, 前面编译nginx的时候指定了配置文件路径:--conf-path=/etc/nginx/nginx.conf ,在这个文件中添加RTMP相关的配置

# RTMP协议
rtmp {

   # 创建一个服务,监听1935端口,这个是RTMP默认的端口
    server {
        listen 1935;
        chunk_size 4096;

        # 创建了一个名为vod的应用, 播放指定路径下的文件,实现点播功能
        application vod {
            play /home/chengchao/video/vod;
        }

        # 创建了一个名为live的应用, 支持直播
        application live {
            live on;
         }
    }
}

更多详细的配置,可以参考github上: https://github.com/arut/nginx-rtmp-module/wiki/Directives

5.查看服务器状态

RTMP服务器的状态是可以监控的,它提供了一个WEB页面。需要在nginx中配置一下访问路径。

  #for rmtp
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }

    location /stat.xsl {
        root /home/chengchao/source/nginx-rtmp-module/;
    }

我这里直接配置在了域名下的/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。


如果本文对您有帮助,可以扫描下方二维码打赏!您的支持是我的动力!
微信打赏 支付宝打赏

3 评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注