[流媒体]通读SRS后的总结文档以及搭建直播平台的初次尝试
“SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。”—winlin
通读了simple rtmp server的2.0release 版本的wiki。从整体上,对simple rtmp server有了比较全面的认识,也根据wiki中的介绍,将simple rtmp server的一些demo跑通,体验了一下SRS部署的简单快速,但是由于手头机器有限,并不能体会SRS的集群部署性能,比较遗憾。
Simple rtmp server,根据名称就能够知道,整个流媒体服务器的基础就是Real Time Messageing Protocol(RTMP),这是一种设计用来进行实时数据通讯的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间,进行音视频数据通信。为了能够支持IOS跟一些没有Flash播放器的机器,SRS有增加了HLS跟HTTP-FLV支持。其中HLS,指的是http live streaming ,是Apple公司的动态码率自适应技术,主要用于IOS,Mac OS X系统中。特色是拥有m3u8索引文件,然后将视频源切成特定大小的ts切片。基本上,SRS支持的流媒体协议就包括RTMP,HLS,HTTP-FLV。包括RTSP,RTMP变种协议等这些协议,在开源的SRS2.0Release版本中,还没有支持。
SRS在支持三种协议的同时,也有着丰富的流媒体服务器所具备的功能,比如转码/转封装/采集,内部提供实验版本的http服务器,设置有内存、CPU等分析日志功能,低延迟属性设置功能,还能够实现与CDN对接,具备部署成RTMP分发集群或者HTTP-FLV分发集群的能力,还设立有vhost,可以在一个集群中支持多用户操作,并且,SRS还支持在不中断服务的情况下应用新的配置。
说了那么多,都是纸上谈兵,没有什么卵用,所以,我利用元旦这两天假期,搭建了一个直播平台。平台具有以下功能:
1、 支持RTMP/HLS/HTTP-FLV
2、 支持转码,提供1080P,720P,D1和原始视频源这四种模式流
3、 支持RTMP分发集群
4、 支持将不同种类的流拉到srs中作为rtmp流分发
主流详细的配置文件
1、 布置最基本的RTMP服务器
listen 1935; #设置主流监听端口 max_connections 1000; #设置最大链接数
2、 布置主流
pid ./objs/build.home.work.master.pid; # 设置主流PID文件 srs_log_file ./objs/build.home.work.master.log; # 设置主流log文件
3、 布置http server
http_server { enabled on; # 启用http server,这里我并没有使用srs中内置的http server,而是采用nginx listen 8080; # 设定http监听端口 dir ./objs/nginx/html; # 设置nginx启动的app目录 }
4、 布置vhost
vhost __defaultVhost__
5、 布置hls服务器
hls{ enabled on; # 启动hls服务器 hls_fragment 10; # 设置hls切片的最大数量 hls_window 60; # 设置hls切片的播放窗口时间限制 hls_path ./objs/nginx/html; # 设置使用hls的App的path,这里我使用了srs提供的app }
6、 布置HTTP-FLV服务器
http_remux { enabled on; # 启动HTTP-FLV服务器 mount [vhost]/[app]/[stream].flv; # 设定挂靠的flv文件 hstrs on; #启动hstrs }
7、 布置拉流
ingest ingest_livestream { #启动拉流,这里只是一个尝试 enabled on; #启动额外的拉流 input{#设定拉流 type file;#设定拉流的类型 url ./doc/source.200kbps.768x320.flv; # 设定拉流的url } ffmpeg ./objs/ffmpeg/bin/ffmpeg; #启动ffmpeg作为拉流的工具 engine { #将拉流绑定到主流监听 enabled on; output rtmp://127.0.0.01:[port]/live?vhost=[vhost]/ingest_livestream;#设置拉流的访问地址 } }
8、 布置转码引擎
transcode { enabled on; # 开启转码引擎 ffmpeg ./objs/ffmpeg/bin/ffmpeg; #设定转码工具为ffmpeg a. 1080P engine super_profile{ enabled on; # 开启转码引擎 vfilter { } vcodec libx264; #设定video 的编码工具 vbitrate 1024; # 设定码率 vfps 20;# 设定帧率 vwidth 1920; # 设定图像宽 vheight 1080; # 设定图像高 vthreads 4; # 设定转码threads vprofile main; # 设置转码profile vpreset medium;# 设置转码质量 vparams{ } acodec libfdk_aac; # 设定audio的编码工具 abitrate 70; # 设定码率 asample_rate 44100; # 设定采样率 achannels 2; # 设定声道 aparams { } output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];#绑定输出 } b. 720P engine high_profile{ enabled on; # 开启转码引擎 vfilter { } vcodec libx264; #设定video 的编码工具 vbitrate 700; # 设定码率 vfps 20;# 设定帧率 vwidth 1280; # 设定图像宽 vheight 720; # 设定图像高 vthreads 4; # 设定转码threads vprofile main; # 设置转码profile vpreset medium;# 设置转码质量 vparams{ } acodec libfdk_aac; # 设定audio的编码工具 abitrate 70; # 设定码率 asample_rate 44100; # 设定采样率 achannels 2; # 设定声道 aparams { } output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];#绑定输出 } c. D1 engine normal_profile{ enabled on; # 开启转码引擎 vfilter { } vcodec libx264; #设定video 的编码工具 vbitrate 500; # 设定码率 vfps 20;# 设定帧率 vwidth 704; # 设定图像宽 vheight 576; # 设定图像高 vthreads 4; # 设定转码threads vprofile main; # 设置转码profile vpreset medium;# 设置转码质量 vparams{ } acodec libfdk_aac; # 设定audio的编码工具 abitrate 70; # 设定码率 asample_rate 44100; # 设定采样率 achannels 2; # 设定声道 aparams { } output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];#绑定输出 } 边缘流配置,这里使用一个edge流作为例子
1、 基本RTMP服务器
listen 19350;#设定监听端口 max_connections 1000;# 设定最大链接数
2、 Edge配置
pid ./objs/build.home.work.slave.pid;# 设定PID文件 srs_log_file ./objs/build.home.work.slave.log;# 设定log文件
3、 Vhost
vhost __defaultVhost__
4、 设定主流
mode remote;# 设定为remote origin 127.0.0.1:1935; # 绑定主流的IP端口
5、 布置转码引擎,与主流的转码引擎一直,不再赘述,唯一不同的就是在访问时,我们要访问19350这个端口。
推流命令:ffmpeg -re -i 1.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.1.100/live/livestream
搭建完成后,对应不同流的访问地址(服务器地址为192.168.1.100):
主流:
1、 原始RTMP流:rtmp://192.168.1.100:1935/live/livestream
2、 1080P RTMP 流:rtmp://192.168.1.100:1935/live/livestream_super_profile
3、 720P RTMP流:rtmp://192.168.1.100:1935/live/livestream_high_profile
4、 D1 RTMP流:rtmp://192.168.1.100:1935/live/livestream_normal_profile
试验用CDN的edge流:
1、 原始RTMP流:rtmp://192.168.1.100:19350/live/livestream
2、 1080P RTMP 流:rtmp://192.168.1.100:19350/live/livestream_super_profile
3、 720P RTMP流:rtmp://192.168.1.100:19350/live/livestream_high_profile
4、 D1 RTMP流:rtmp://192.168.1.100:19350/live/livestream_normal_profile
HLS流:
http://192.168.1.100:8080/live/livestream.m3u8
HTTP-FLV 流:
http://192.168.1.100:8080/live/livestream.flv
试验用拉流到srs的访问流:
rtmp://192.168.1.100:1935/live/ingest_livestream