[流媒体]通读SRS后的总结文档以及搭建直播平台的初次尝试

AquariusYuxin 2019-06-20

“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

相关推荐