Skip to content
winlin edited this page Apr 18, 2014 · 89 revisions

编译SRS

本文说明了如何编译和打包SRS,另外,可以直接下载release的binary,提供了几个常见系统的安装包,安装程序会安装系统服务,直接以系统服务启动即可。参考:[Github: release](Download Released SRS(下载发布版))或者国内镜像: release

操作系统

  • README中的Usage,在Centos6.x/Ubuntu12下面测试成功。按照Step操作后,浏览器中打开服务器地址就能观看所有的DEMO。
  • DEMO演示了所有SRS的功能,特别是ffmpeg依赖的库巨多,因此为了简化,推荐使用Centos6.x/Ubuntu12.
  • 若的确需要在其他系统下编译SRS,下面说明SRS依赖的各种库,可以关掉某些功能减少编译的依赖。

关闭防火墙和selinux

有时候启动没有问题,但是就是看不了,原因是防火墙和selinux开着。

可以用下面的方法关掉防火墙:

# disable the firewall
sudo /etc/init.d/iptables stop
sudo /sbin/chkconfig iptables off

selinux也需要disable,运行命令getenforce,若不是Disabled,执行下面的步骤:

  1. 编辑配置文件:sudo vi /etc/sysconfig/selinux
  2. 把SELINUX的值改为disabled:SELINUX=disabled
  3. 重启系统:sudo init 6

编译和启动

确定用什么编译选项后(参考下面的说明),编译SRS其实很简单。只需要RTMP和HLS:

./configure && make

指定配置文件,即可启动SRS:

./objs/srs -c conf/srs.conf

推RTMP流和观看,参考Usage: RTMP

更多使用方法,参考Usage

编译选项和预设集

SRS提供了详细的编译选项来控制功能的开关,以及提供了一些有用的预设,针对不同的应用场景默认选项。

SRS会先应用预设集,然后应用用户的选项,譬如:./configure --rtmp-hls --with-http-api,应用顺序为:

  • 首先应用预设集:--rtmp-hls,开启ssl/hls,其他功能都处于关闭状态。
  • 应用用户选项:--with-http-api,开启http api接口。

所以这个编译命令最后支持的功能是:RTMP+HLS+HTTP接口

支持的预设集参考末尾的参数列表,或者执行:./configure -h查看。

jobs:加速编译

由于SRS在configure时需要编译ffmpeg/nginx,这个过程会很漫长,如果你有多核机器,那么可以使用jobs来并行编译。

  • configure: 在编译srs依赖的工具时可以并行编译。
  • make: 在编译srs时可以使用并行编译。

srs并行编译和串行编译的项目包括(srs会自动判断,不需要用户指定):

  • srs: 支持并行编译。
  • st-1.9: 串行编译,库比较小,编译时间很短。
  • http-parser: 串行编译,库比较小,编译时间很短。
  • openssl: 串行编译,并行编译有问题。
  • nginx: 支持并行编译。
  • ffmpeg: 支持并行编译。
  • lame: 支持并行编译。ffmpeg用到的mp3库。
  • libaacplus: 串行编译,并行编译有问题。ffmpeg用到的aac库。
  • x264: 支持并行编译。ffmpeg用到的x264库。

configure使用并行编译的方法如下:

./configure --jobs=16

注意:configure不支持make那样的"-jN",只支持"--jobs[=N]"。

make使用并行编译的方法如下:

// or make --jobs=16
make -j16

Package

SRS提供了打包脚本,可以将srs打包(不包含nginx/ffmpeg等外部程序)。安装包也提供下载,参考本文开头部分。

打包脚本会编译srs,然后将srs的文件打包为zip(zip比tar通用)。详细参考package的帮助:

[winlin@dev6 srs]$ ./scripts/package.sh --help

  --help                   print this message

  --arm                    configure with arm and make srs. use arm tools to get info.
  --no-build               donot build srs, user has builded. only make install.

SRS依赖关系

SRS依赖于g++/gcc/make,st-1.9,http-parser2.1,ffmpeg,cherrypy,nginx,openssl-devel,python2。

某些依赖可以通过configure配置脚本关闭,详见下表:

功能 选项 编译 依赖库 说明
编译器 必选 linux,g++,gcc,make 基础编译环境
RTMP(Basic) 必选 st-1.9 RTMP服务器,st为处理并发的基础库
forward,vhost,refer,reload为基础功能。

st-1.9没有再依赖其他库,在各种linux下都可以编译,
测试过的有CentOS4/5/6,Ubuntu12,Debian-Armhf,
其他问题也不大
参考: DeliveryRTMP
RTMP
(H.264/AAC)
可选 --with-ssl ssl RTMP分发H.264/AAC,需要支持复杂握手

简单握手的内容为1537字节随机数,
而复杂握手为按一定规则加密的数据

srs使用自己编译的ssl库
参考: RTMPHandshake
HLS 可选 --with-hls \
--with-nginx
nginx --with-hls
将RTMP流切片成ts,并生成m3u8,
即AppleHLS流分发。参考:HLS

--with-nginx
打开此功能后会编译nginx
通过nginx分发m3u8和ts静态文件
参考: DeliveryHLS
FFMPEG 可选 --with-ffmpeg ffmpeg
(libaacplus,
lame,yasm,
x264,ffmpeg)
转码,转封装,采集工具,
FFMPEG依赖的项目实在太多,
而且在老版本的linux上这些库很难编译成功,

因此若不需要转码功能,建议关闭此功能,
若需要转码,推荐使用CentOS6.*/Ubuntu12系统
参考: FFMPEG
Transcode 可选 --with-transcode 转码工具
譬如FFMPEG
将RTMP流转码后输出RTMP流,
一般转码需要FFMPEG工具,
或者禁用FFMPEG后指定自己的工具
参考: FFMPEG
Ingest 可选 --with-ingest 采集工具
譬如FFMPEG
将文件/流/设备数据抓取后推送到SRS,
一般采集需要FFMPEG工具,
或者禁用FFMPEG后指定自己的工具
参考: Ingest
HttpCallback 可选 --with-http-callback cherrypy
http-parser2.1
python2
当某些事件发生,SRS可以调用http地址

譬如客户端连接到服务器时,SRS会调用
on_connect接口,SRS自带了一个
research/api-server(使用Cherrypy),
提供了这些http api的默认实现。

另外,若开启了HttpCallback,
players的演示默认会跳转到api-server

http-parser2.1在各种linux下编译问题也不大

python2.6/2.7在CentOS6/Ubuntu12下才有,
所以CentOS5启动HttpCallback会报json模块找不到
参考: HTTPCallback
HttpServer 可选 --with-http-server http-parser2.1 SRS内嵌了一个web服务器,实现基本的http协议,
主要用于文件分发。
参考: HTTPServer
HttpApi 可选 --with-http-api http-parser2.1 SRS提供http-api(内嵌了web服务器),
支持http方式管理服务器。
参考: HTTPApi
ARM 可选 --with-arm-ubuntu12 无额外依赖 SRS可运行于ARM,
若需要支持复杂握手则需要依赖ssl,
目前在Ubuntu12下编译,
debian-armhf(v7cpu)下测试通过
参考: SrsLinuxArm
librtmp 可选 --with-librtmp 无额外依赖 SRS提供客户端库srs-librtmp
若需要支持复杂握手则需要依赖ssl,
支持客户端推RTMP流到SRS,或者播放RTMP流

srs-librtmp使用同步socket,协议栈和SRS
服务端一致,和librtmp一样,只适合用作客户端,
不可用作服务端。
参考: SrsLibrtmp
DEMO 可选 --with-ssl \
--with-hls \
--with-nginx \
--with-ffmpeg \
--with-transcode
nginx/cherrypy SRS的演示播放器/转码输出的流/编码器/视频会议,
因为需要http服务器,所以依赖于nginx,

另外,视频会议因为需要知道大家发布的流名称,
所以需要HttpCallback支持
参考: SampleDemo
GPERF 可选 --with-gperf gperftools 使用Google的tcmalloc内存分配库,
gmc/gmp/gcp依赖这个选项,参考:GPERF
GPERF(GMC) 可选 --with-gmc gperftools 内存检查gperf-memory-check,
gmc依赖gperf,参考:GPERF
GPERF(GMP) 可选 --with-gmp gperftools 内存性能分析gperf-memory-profile,
gmp依赖gperf,参考:GPERF
GPERF(GCP) 可选 --with-gcp gperftools CPU性能分析gperf-cpu-profile,
gcp依赖gperf,参考:GPERF
GPROF 可选 --with-gprof gprof GNU CPU profile性能分析工具,
参考:GPROF

应用场景

下面是常见的几种应用场景,以及对应的编译选项。

应用场景 功能组合 编译选项 说明
RTMP功能 RTMP(Basic)
RTMP(H.264/AAC)
./configure \
--with-ssl \
--without-hls \
--without-http-callback \
--without-ffmpeg
只有基本的RTMP功能,作为RTMP源站提供服务。
包含Forward/Reload/Refer/Vhost等核心功能。
没有HLS,也没有转码,没有HttpCallback。
典型场景:
1.RTMP网络电视台
2.美女主播
3.视频会议
4.低延时的交互类应用
5.其他RTMP应用
快速预览
最小依赖
RTMP(Basic) ./configure \
--without-ssl \
--without-hls \
--without-http-callback \
--without-ffmpeg \
--without-transcode \
--without-http-server \
--without-http-api
只保留系统核心功能,连RTMP分发h.264/aac都去掉。
可以编译速度最快,几乎在所有的linux都能编译成功
包含RTMP(Basic)基本流分发功能,
包含Forward/Reload/Refer/Vhost核心功能
典型场景:
1.想快速编译SRS
2.想在很老的系统下编译SRS
3.VP6推RTMP流就可以
多屏分发 RTMP(Basic)
RTMP(H.264/AAC)
HLS
./configure \
--with-ssl \
--with-hls \
--with-nginx \
--without-http-callback \
--without-ffmpeg \
--without-transcode
希望支持PC(RTMP),Apple(HLS)和Android(HLS)观看,
PC上自然是adobe的flash观看效果最佳,
1. flash自然是播放RTMP最稳定,
测试显示10天连续播放都没有问题,
2. Apple平台自然是HLS,
就是看到HLS在Apple上完美表现,
SRS才决定支持HLS,
3. Android上的流媒体没有稳定的分发方式,
相对而言,HLS是较好的选择,
Andorid上播放器用HTML5播放m3u8
典型场景:
1.多屏分发的广播流
2.对延时不那么关心(HLS延时至少一个ts切片)
3.需要支持移动端
注意:HLS需要h264和AAC编码,若编码器不支持,则需要转码
转码 RTMP(Basic)
RTMP(H.264/AAC)
Transcode
./configure \
--with-ssl \
--without-hls \
--without-http-callback \
--with-ffmpeg \
--with-transcode
希望对RTMP进行转码后输出,
譬如,flash推流到SRS,编码是vp6和speex,
希望转码为h264和aac后输出HLS,
譬如,编码器推送较高码率到SRS,转码输出较低码率,
譬如,加水印后输出,
譬如,只对音频进行转码,将speex/mp3转码为aac给手机端播放,
转码是wowza里面很贵的一个插件,应用场景可见一斑
典型场景:
1.需要输出HLS,但是输入流不是h264/aac
2.高码率输入,多路输出,手机端播放低码率的流
3.各种FFMPEG滤镜的应用
注意:所有转码的流可以再经过SRS进行HLS切片和forward
逻辑控制 RTMP(Basic)
HttpCallback
./configure \
--without-ssl \
--without-hls \
--with-http-callback \
--without-ffmpeg \
--without-transcode
希望对服务器上的各种事件进行控制,
譬如,连接到SRS后,到api-server进行验证,
通过后再进行服务,
譬如,希望统计当前连接数,各个流的数据等,
典型场景:
1.视频会议,api-server可以知道SRS上的流
2.统计,统计在线人数,带宽等(cli也可以查询)
3.认证,通过认证后才进行服务,
注意:当事件发生时,SRS调用http地址告知api-server,
若api-server需要主动控制SRS,可以通过cli
客户端 HLS ./configure \
--without-ssl \
--with-hls \
--with-nginx \
--without-http-callback \
--without-ffmpeg \
--without-transcode
SRS提供了以下客户端:
1.播放器,research/players/srs_player
research/players/srs_player.html
2.编码器,research/players/srs_publisher
research/players/srs_publisher.html
3.测速:research/players/srs_bwt
research/players/srs_bwt.html
4.jwplayer:research/players/jwplayer6.html
5.osmf播放器:research/players/osmf.html
srs提供的客户端(srs-player/publisher)都是全js接口,
flash元素只有video播放,
典型场景:
1.希望播放RTMP/HLS流
2.希望使用flash推流
3.希望测试客户端到服务器带宽
注意:HLS提供的nginx,只是用做分发静态文件,
可以把对应的目录拷贝到其他web服务器下也可以观看
测速 HLS ./configure \
--without-ssl \
--with-hls \
--with-nginx \
--without-http-callback \
--without-ffmpeg \
--without-transcode
SRS提供的测速工具,分为flash客户端和linux命令行工具,
1.flash测速:research/players/srs_bwt
research/players/srs_bwt.html
flash测速提供全js接口,方便嵌入页面
2.linux测速:./objs/bandwidth
典型场景:
1.推流前测速,看用户带宽是否达到要求
2.排查卡顿问题,查看节点之间带宽
注意:HLS提供的nginx,只是用做分发静态文件,
可以把对应的目录拷贝到其他web服务器下也可以观看
小型集群 RTMP(Basic) ./configure \
--without-ssl \
--without-hls \
--without-http-callback \
--without-ffmpeg \
--without-transcode
SRS的Forward可组建小型集群,参考Cluster
ARM ARM ./configure \
--with-arm-ubuntu12
SRS在ARM上运行,参考arm-srs
srs-librtmp librtmp ./configure \
--with-librtmp
SRS提供客户端推流/播放库,参考srs-librtmp

自定义编译参数

SRS可以自定义编译器,譬如arm编译时使用arm-linux-g++而非g++。参考ARM:手动编译

注意:SRS和ST都可以通过编译前设置变量编译,但是ssl需要手动修改Makefile。还好ssl不用每次都编译。

编译的生成项目

configure和make将会生成一些项目,都在objs目录。有些文件在research目录,configure会自动软链到objs目录。

HttpCallback(及其服务端api-server)的目录为research/api-server,没有做软链,可以直接启动。详细参考下面的方法。

生成项目 使用方法 说明
./objs/srs ./objs/srs -c conf/srs.conf 启动SRS服务器
./objs/bandwidth ./objs/bandwidth -h linux测速工具
./objs/nginx sudo ./objs/nginx/sbin/nginx HLS/DEMO用到的nginx服务器
api-server python research/api-server/server.py 8085 启动HTTP hooks和DEMO视频会议用到的api-server
FFMPEG ./objs/ffmpeg/bin/ffmpeg SRS转码用的FFMPEG,DEMO推流也是用它
librtmp ./objs/include/srs_librtmp.h
./objs/lib/srs_librtmp.a
SRS提供的客户端库,参考srs-librtmp
DEMO
(关闭HttpCallback)
./objs/nginx/html/players SRS的DEMO的静态页面,当没有开启HttpCallback时
DEMO
(开启HttpCallback)
research/api-server/static-dir/players SRS的DEMO的静态页面,
和nginx里面的静态目录是一个目录,软链到research/players,
1.当HttpCallback开启(--with-http-callback),
nginx的index.html会默认跳转到HttpCallback的首页,
原因是视频会议的DEMO需要HttpCallback,
2.若HttpCallback没有开启,
则默认浏览的是Nginx里面的DEMO,
当然视频会议会无法演示

配置参数说明

SRS的配置(configure)参数说明如下:

  • --help 配置的帮助信息
  • --with-ssl 添加ssl支持,ssl用来支持复杂握手。参考:RTMP Handshake
  • --with-hls 支持HLS输出,将RTMP流切片成ts,可用于支持移动端HLS(IOS/Android),不过PC端jwplayer也支持HLS。参考:HLS
  • --with-dvr 支持将RTMP流录制成FLV。参考:DVR
  • --with-nginx 编译nginx,使用nginx作为web服务器分发HLS文件,以及demo的静态页等。
  • --with-http-callback 支持http回调接口,用于认证,统计,事件处理等。参考:HTTP callback
  • --with-http-api 打开HTTP管理接口。参考:HTTP API
  • --with-http-server 打开内置HTTP服务器,支持分发HTTP流。参考:HTTP Server
  • --with-ffmpeg 编译转码/转封装/采集用的工具FFMPEG。参考:FFMPEG
  • --with-transcode 直播流转码功能。需要在配置中指定转码工具。参考:FFMPEG
  • --with-ingest 采集文件/流/设备数据,封装为RTMP流后,推送到SRS。参考:Ingest
  • --with-research 是否编译research目录的文件,research目录是一些调研,譬如ts info是做HLS时调研的ts标准。和SRS的功能没有关系,仅供参考。
  • --with-utest 是否编译SRS的单元测试,默认开启,也可以关闭。
  • --with-gperf 是否使用google的tcmalloc库,默认关闭。
  • --with-gmc 是否使用gperf的内存检测,编译后启动srs会检测内存错误。这个选项会导致低性能,只应该在找内存泄漏时才开启。默认关闭。参考:gperf
  • --with-gmp 是否使用gperf的内存性能分析,编译后srs退出时会生成内存分析报告。这个选项会导致地性能,只应该在调优时开启。默认关闭。参考:gperf
  • --with-gcp 是否启用gperf的CPU性能分析,编译后srs退出时会生成CPU分析报告。这个选项会导致地性能,只应该在调优时开启。默认关闭。参考:gperf
  • --with-gprof 是否启用gprof性能分析,编译后srs会生成CPU分析报告。这个选项会导致地性能,只应该在调优时开启。默认关闭。参考:gprof
  • --with-librtmp 客户端推流/播放库,参考srs-librtmp
  • --with-arm-ubuntu12 交叉编译ARM上运行的SRS,要求系统是Ubuntu12。参考srs-arm
  • --jobs[=N] 开启的编译进程数,和make的-j(--jobs)一样,在configure时可能会编译nginx/ffmpeg等工具,可以开启多个jobs编译,可以显著加速。参考:Build: jobs
  • --static 使用静态链接。指定arm编译时,会自动打开这个选项。手动编译需要用户自身打开。参考:ARM

预设集:

  • --x86-x64,默认预设集,一般的x86或x64服务器使用。release使用这个配置编译。
  • --pi,树莓派预设集,arm的子集。树莓派的release用这个配置编译。
  • --arm,ubuntu下交叉编译,等价于--with-arm-ubuntu12。release使用这个配置。
  • --dev,开发选项,尽可能开启功能。
  • --fast,关闭所有功能,只支持基本RTMP(不支持h264/aac),最快的编译速度。
  • --pure-rtmp,支持RTMP(支持h264+aac),需要编译ssl。
  • --rtmp-hls,支持RTMP和HLS,典型的应用方式。还可以加上内置的http服务器(--with-http-server)。
  • --disable-all, 禁用所有功能,只支持rtmp(vp6)。

专家选项:有可能编译失败,不是专家就不要用这个。

  • --use-sys-ssl 使用系统的ssl,不单独编译ssl(在--with-ssl时有效)。

Winlin 2014.2

Welcome to SRS wiki!

SRS 1.0 wiki

Please select your language:

SRS 2.0 wiki

Please select your language:

SRS 3.0 wiki

Please select your language:

Clone this wiki locally