前言
初入公司,调研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 | 主流的低延时分发方式, |
HLS | Apple/ | HTTP | Apple/ | 延时一个切片以上(一般10秒以上), |
对于利用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,如图所示:
进入该目录下,找见trunk目录,进入trunk目录。
输入命令./configure,配置完成后,输入make && make install命令,等到编译完成。
4.配置文件,配置文件是:conf/rtmp.conf,默认非常精简只有下面这些:
只需上面这几行配置就可以完整的实现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服务器,页面如下图所示:
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播放器下载安装教程可自行百度。下载安装完成后,打开,播放器如图所示:
点击媒体按钮,然后点击打开网络串流,输入rtmp协议,点击播放,即可播放推流视频。
8.使用obs推流,下载obs推流客户端,下载安装完成,打开界面如下图:
具体如何推流教程网上可以百度,这里不做赘述,推流完成后,效果如下图: