前言

初入公司,调研SRS搭建流媒体服务器,实现直播、点播功能,并搭建基于SRS的流媒体服务器集群。

我们知道,SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。SRS提供了丰富的接入方案将RTMP流接入SRS,包括推送RTMP到SRS、推送RTSP/UDP/FLV到SRS、拉取流到SRS。SRS还支持将接入的RTMP流进行各种变换,譬如将RTMP流转码、转发给其他服务器、转封装成HTTP-FLV流、转封装成HLS、转封装成HDS、录制成FLV。SRS包含支持大规模集群如CDN业务的关键特性,譬如RTMP多级集群、VHOST虚拟服务器、无中断服务Reload、HTTP-FLV集群。此外,SRS还提供丰富的应用接口,包括HTTP回调、安全策略Security、HTTP API接口、RTMP测速。

互联网上直播现在主要有两种分发方式:HLS与RTMP,其中还有点播中运用较为频繁的HTTP协议。对比以下互联网上用的流媒体分发方式:

HLS:apple的HLS,支持点播和直播。

HTTP:即HTTP stream,各家自己定义的http流,应用于国内点播视频网站。

RTMP:直播应用,对实时性有一定要求,以PC为主。

RTMP本质是流协议,主要优点有1.实时性高,RTMP的实时性在3秒之内,2.支持加密,RTMPE与RTMPS为其加密协议,3.稳定性高,做CDN或者大中型集群分发,选择稳定性高的协议一定是必要的。RTMP的缺点是1.协议复杂,协议复杂带来的后果是在研发,扩展,维护等方面成本相对会高。2.Cache麻烦,流协议做缓存不方便,所以,直接用RTMP协议做点播实现起来很麻烦。HTTP本质是文件分发,主要优势有1.性能很高。分发的量特别大,没有实时性的要求,譬如点播,那么HTTP是最好的选择。劣势是实时性差,原生支持不好,尤其移动端对于HTTP的支持不是很完善。HLS的优势是性能高,原生支持很好,尤其对于移动端的支持。劣势是实时性差。

应用方式具体来说:

编码器输出RTMP协议。

流媒体系统接入使用RTMP协议。

流媒体系统内部直播分发使用RTMP。

PC+直播+实时性要求高:使用flash播放RTMP。

PC+直播+没有实时性要求:使用RTMP或者HLS均可。

PC+点播:使用HTTP或者HLS。

Apple IOS/OSX:都使用HLS(实时性要求高得自己解析RTMP,或者使用外部库,譬如https://www.vitamio.org)

Andorid:和IOS一样,不过可以确定的是可以自己开发支持RTMP。

协议的比较见下表:

分发

平台

协议

公司

说明

RTMP

Windows Flash

RTMP

Adobe

主流的低延时分发方式,
Adobe对RTMP是Flash原生支持方式,
FMS(Adobe Media Server前身),
就是Flash Media Server的简写,可见Flash播放RTMP是多么“原生”,
就像浏览器打开http网页一样“原生”,
经测试,Flash播放RTMP流可以10天以上不间断播放。

HLS

Apple/
Android

HTTP

Apple/
Google

延时一个切片以上(一般10秒以上),
Apple平台上HLS的效果比PC的RTMP还要好,
而且Apple所有设备都支持,
Android最初不支持HLS,后来也支持了,
但测试发现支持得还不如Apple,
不过观看是没有问题,稳定性稍差,
所以有些公司专门做Android上的流媒体播放器。

对于利用SRS做流媒体服务器集群,可以借用EasyDSS的方案,一台SRS接受直播端的推流并转发给其他服务器。

SRS流媒体服务器搭建

1.源码下载: https://github.com/ossrs/srs.git

2.分支切换,有些功能只有SRS2.0有,SRS1.0没有,请注意看wiki是v1还是v2的。

如果是1.0的功能,更新代码后要改变到1.0分支:

git pull && git checkout 1.0release

如果是2.0的功能,更新代码后要改变到2.0分支:

git pull && git checkout 2.0release

如果是3.0的功能,更新代码后要改变到3.0分支(没有单独的3.0release分支就是develop):

git pull && git checkout develop

3.编译。下载文件名为srs.oschaina,如图所示:

点播 服务器 架构设计 srs做点播服务器_点播 服务器 架构设计

进入该目录下,找见trunk目录,进入trunk目录。

点播 服务器 架构设计 srs做点播服务器_SRS_02

 

输入命令./configure,配置完成后,输入make && make install命令,等到编译完成。

4.配置文件,配置文件是:conf/rtmp.conf,默认非常精简只有下面这些:

点播 服务器 架构设计 srs做点播服务器_git_03

只需上面这几行配置就可以完整的实现rtmp流媒体服务器,其中listen默认为1935,是rtmp流推送的默认端口;max_connections值最大连接;daemon是否为守护进行在后台执行,然后vhost为虚拟主机可以隔离客户,这个默认不用配置即可.

然后可以执行命令启动rtmp服务: ./objs/srs -c conf/rtmp.conf ,启动之后就可以向服务推流了,另外srs也提供了完整的http服务用作srs服务器使用,具体配置文件在conf/srs.conf,其中多了http部分的配置,其中用于播放测试的配置如下,也可以添加到rtmp.conf配置中:

http_server {

    enabled         on;

    listen          8080;

    dir             ./objs/nginx/html;

}

注意:我在配置的时候,端口号1935与8080都被占用了,我修改了端口号,1935改为1930,8080改为8081。启动srs服务器,页面如下图所示:

 

点播 服务器 架构设计 srs做点播服务器_SRS_04

5.安装FFmpeg:

1.git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

2.cd ffmpeg

3../configure && make

        在第三步配置的时候,我遇到了问题:

yasm/nasm not found or too old. Use –disable-yasm for a crippled build.

If you think configure made a mistake, make sure you are using the latest

version from Git. If the latest version fails, report the problem to the

ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.

Include the log file “config.log” produced by configure as this will help

solve the problem.

解决办法是:https://java-er.com/blog/linux-installffmpeg/,这是在Linux上安装FFmpeg的教程。vi

6.进行FFmpeg进行推流,进入FFmpeg目录,输入命令./ffmpeg -re -i /home/k8s/srs.oschina/trunk/doc/source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv rtmp://10.0.4.181:1930/live/livestream,其中,rtmp://10.0.4.181:1930/live/livestream为rtmp地址,其具体解释见链接https://github.com/ossrs/srs/wiki/v1_CN_RtmpUrlVhost。推流成功显示如下图:

 

7.播放推流视频。不知道什么原因,在编写本文档时候,SRS网页中自带的播放器不能播放视频,可能是配置时候出了问题,我下载了VLC播放器,VLC播放器下载安装教程可自行百度。下载安装完成后,打开,播放器如图所示:

点播 服务器 架构设计 srs做点播服务器_git_05

点击媒体按钮,然后点击打开网络串流,输入rtmp协议,点击播放,即可播放推流视频。

点播 服务器 架构设计 srs做点播服务器_直播服务器_06

 

点播 服务器 架构设计 srs做点播服务器_git_07

点播 服务器 架构设计 srs做点播服务器_HTTP_08

8.使用obs推流,下载obs推流客户端,下载安装完成,打开界面如下图:

点播 服务器 架构设计 srs做点播服务器_点播 服务器 架构设计_09

 

具体如何推流教程网上可以百度,这里不做赘述,推流完成后,效果如下图:

点播 服务器 架构设计 srs做点播服务器_点播 服务器 架构设计_10