流媒体服务器解决方案
需求说明:
这里主要采用开源项目SRS流媒体服务来搭建一个流媒体服务器,通过推流服务器将摄像头的实时视频流推送到SRS流媒体服务器,然后客户端可以拉取SRS流媒体服务器的rtmp或者http流数据,实现摄像头的视频流转换成rtmp流,实时显示视频监控画面。
项目开源地址:https://github.com/ossrs/srs
软硬件环境准备 | ||
CPU | 双核及以上 |
|
内存 | 4G及以上 |
|
硬盘 | 100G及以上 |
|
网络 | 千兆网络(192.168.8.26) |
|
操作系统 | Centos7 minal或ubuntu 16.04 server lts |
|
操作系统的选择,这里需要说明的是,centos是企业中使用比较多的操作系统,其稳定性较好,不容易出现问题,但是某些软件需要编译使用,依赖关系比较复杂的软件相对比较麻烦,而Ubuntu是更新最快的操作系统之一,很多软件包更新速度很快,大多数都可以使用包管理工具进行安装,这点对于依赖关系复杂的软件具有一定的优势,但是由于更新很快,系统稳定性较差。这里主要是搭建srs流媒体服务器,推流服务器分离,若服务器既要提供流媒体服务,又要推流,建议选择ubuntu系统,因此我这里选择使用centos 7 最小化系统来实现srs流媒体服务器,其中大部分内容也可做为ubuntu系统搭建部署的参考。
SRS支持rtmp\hls\webrtc\srt\GB28181多种协议,稳定性较好、使用简单方便,这也是为什么选择这款开源软件的主要原因。
基础系统环境准备:
#安装所需的工具
yum install vim lrzsz wget curl gcc gcc-c++ make unzip patch git
#拉取代码
git clone https://gitee.com/winlinvip/srs.oschina.git srs &&
cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && git pull
#构建并编译
./configure && make
#运行服务
./objs/srs -c conf/srs.conf
#注册到系统,使用systemctl管理服务
make install
sudo ln -sf /usr/local/srs/etc/init.d/srs /etc/init.d/srs &&
sudo cp -f /usr/local/srs/usr/lib/systemd/system/srs.service /usr/lib/systemd/system/srs.service && sudo systemctl daemon-reload && sudo systemctl enable srs &&
sudo systemctl start srs
#检查服务状态
systemctl status srs
#常用操作命令
systemctl stop srs
systemctl restart srs
此时的推流地址:rtmp://192.168.8.26:1935/app/stream
此时的拉流地址:rtmp://192.168.8.26:1935/app/stream
各种配置实例:
#最小配置
listen 1935; #监听端口
max_connections 1000; #最大连接数
vhost __defaultVhosts__ { #默认虚拟主机
}
此时的推流地址:rtmp://192.168.8.26/live/livestream
此时的拉流地址:rtmp://192.168.8.26/live/livestream
#URL规则说明
https://github.com/ossrs/srs/wiki/v1_CN_RtmpUrlVhost
应用场景:
标准rtmp URL:
标准rtmp URL指的是最大兼容的rtmp url,基本上所有的服务器和播放器都能识别,例如:
HTTP | Schema | Host | Port | App | Stream |
http://192.168.8.26:80/players/srs_player.htm | http | 192.168.8.26 | 80 | players | Srs_player.html |
rtmp://192.168.8.26:1935/live/livestream | rtmp | 192.168.8.26 | 1935 | live | livestream |
其中:
无vhost:
rtmp://192.168.8.26/app/stream
举例:
rtmp://192.168.8.26/reader/red_mansion
vhost应用:
RTMP的Vhost和HTTP的Vhost概念是一样的:虚拟主机。详见下表(假设域名demo.srs.com被解析到IP为192.168.8.26的服务器):
http | host | port | vhost |
http://demo.srs.com:80/players/srs_player.html | 192.168.8.26 | 80 | demo.srs.com |
rtmp://demo.srs.com:1935/live/livestream | 192.168.8.26 | 1935 | demo.srs.com |
Vhost主要的作用是:
vhost多用户:
假设cctv和wasu都运行在一台边缘节点(192.168.8.26)上,用户访问这两个媒体的流时,Vhost的作用见下表:
Rtmp | host | port | vhost | app | stream |
rtmp://show.cctv.cn/live/livestream | 192.168.8.26 | 1935 | Show.cctv.cn | live | livestream |
rtmp://show.cctv.cn/live/livestream | 192.168.8.26 | 1935 | Show.wasu.cn | live | livestream |
配置如下:
listen 1935;
vhost show.cctv.cn {
}
vhost show.wasu.cn {
}
vhost支持多配置
现在有个需求:
cctv延迟最低(启动时只有声音,画面是黑屏)
wasu需要快速启动(打开就能看到视频,服务器cache了最后一个gop,延迟会比较大)
配置如下:
listen 1935;
vhost show.cctv.cn {
chunk_size 128;
}
vhost show.wasu.cn {
chunk_size 4096;
}
互不影响。相互独立。
默认vhost:
FMS的__defaultVhost__是默认的vhost,当用户请求的vhost没有匹配成功时,若配置了defaultVhost,则使用它来提供服务。若匹配失败,也没有defaultVhost,则返回错误。
譬如,服务器192.168.8.26上的SRS配置如下:
listen 1935;
vhost demo.srs.com {
enabled on;
}
那么,当用户访问以下vhost时:
defaultVhost和其他vhost的规则一样,只是用来匹配那些没有匹配成功的vhost的请求的
访问指定的vhost:
如何访问某台服务器上的Vhost?有两个方法:
普通用户不用这么麻烦,直接访问RTMP地址就好了,有时候运维需要看某台机器上的Vhost的流是否有问题,就需要这种特殊的访问方式。考虑下面的例子:
RTMP URL: rtmp://demo.srs.com/live/livestream
边缘节点数目:50台
边缘节点IP:192.168.1.100 至 192.168.1.150
边缘节点SRS配置:
listen 1935;
vhost demo.srs.com {
mode remote;
origin: xxxxxxx;
}
各种访问方式见下表:
用户 | RTMP URL | hosts设置 | 目标 |
普通用户 | rtmp://demo.srs.com/live/livestream | 无 | 由DNS |
运维 | rtmp://demo.srs.com/live/livestream | 192.168.8.26 demo.srs.com | 查看192.168.1.100上的流 |
运维 | rtmp://192.168.8.26/live? | 无 | 查看192.168.1.100上的流 |
运维 | rtmp://192.168.8.26/live | 无 | 查看192.168.1.100上的流 |
延时配置rtmp:
https://github.com/ossrs/srs/wiki/v1_CN_LowLatency
gop_cache配置项,on就会马上播放,off就低延迟
queue_length 10; 累积延迟,队列长度
低延时配置案例:
listen 1935;
vhost __defaultVhost__ {
gop_cache off;
queue_length 10;
}
案例:
推流服务器在北京内网,观看直播在浙江杭州,流媒体服务器为阿里云
listen 1935;
vhost __defaultVhost__ {
enabled on;
gop_cache off;
hls {
enabled on;
hls_path ./objs/nginx/html;
hls_fragment 5;
hls_window 20;
}
}
conf/hls.conf
listen 1935;
max_connections 1000;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
hls {
enabled on;
hls_path ./objs/nginx/html;
hls_fragment 10;
hls_window 60;
}
}
https://github.com/ossrs/srs/wiki/v3_CN_DeliveryHLS
HLS指Apple的HLS(Http Live Streaming),本身就是Live(直播)的,不过Vod(点播)也能支持。HLS是Apple平台的标准流媒体协议,和RTMP在PC上一样支持得天衣无缝。
HLS主要的应用场景包括:
总之,SRS支持HLS主要是作为输出的分发协议,直播以RTMP+HLS分发,满足各种应用场景。点播以HLS为主。
Delivering Streams
详见下表:
分发 | 平台 | 协议 | 公司 | 说明 |
RTMP | Windows Flash | RTMP | Adobe | 主流的低延时分发方式, |
HLS | Apple/ | HTTP | Apple/ | 延时一个切片以上(一般10秒以上), |
HDS | - | HTTP | Adobe | Adobe自己的HLS, |
DASH | - | HTTP | - | Dynamic Adaptive Streaming over HTTP (DASH), |
hls地址:http://demo.srs.com/live/livestream.m3u8
H5页面引入:
<!-- livestream.html -->
<video width="640" height="360"
autoplay controls autobuffer
src="http://demo.srs.com/live/livestream.m3u8"
type="application/vnd.apple.mpegurl">
</video>
HLS的主要流程是:
注意:SRS只需要在Vhost上配置HLS,会自动根据流的app创建目录,但是配置的hls_path必须自己创
推流地址:rtmp://192.168.8.26:1935/live/livestream
播放地址:http://192.168.8.26:8080/live/livestream.m3u8