Skip to content
winlin edited this page Aug 17, 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

自定义编译参数

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/research/
librtmp/
srs_bandwidth_check
./objs/research/
librtmp/
srs_bandwidth_check -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-stat 是否开启数据统计功能,SRS可以采集cpu/内存/网络/磁盘IO等数据,共监控系统通过http-api获取。(目前osx不支持)。
  • --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使用这个配置编译。
  • --osx,苹果MAC OSX(Darwin)系统下编译,安装好xcode和brew后,可以使用这个选项。
  • --pi,树莓派预设集,arm的子集。树莓派的release用这个配置编译。
  • --cubie,在cubieboard下直接编译的选项,使用ubuntu差不多的配置集。
  • --arm,ubuntu下交叉编译,等价于--with-arm-ubuntu12。release使用这个配置。
  • --mips,ubuntu下交叉编译,为hiwifi的mips路由器编译。(目前srs在mips上有内存泄漏,2天左右会把路由器跑死)。
  • --dev,开发选项,尽可能开启功能。
  • --fast,关闭所有功能,只支持基本RTMP(不支持h264/aac),最快的编译速度。
  • --pure-rtmp,支持RTMP(支持h264+aac),需要编译ssl。
  • --rtmp-hls,支持RTMP和HLS,典型的应用方式。还可以加上内置的http服务器(--with-http-server)。
  • --disable-all, 禁用所有功能,只支持rtmp(vp6)。
  • --demo,SRS的演示编译选项。
  • --full,开启SRS所有的功能。

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

  • --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