-
Notifications
You must be signed in to change notification settings - Fork 2
Build
本文说明了如何编译和打包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开着。
可以用下面的方法关掉防火墙:
# disable the firewall
sudo /etc/init.d/iptables stop
sudo /sbin/chkconfig iptables off
selinux也需要disable,运行命令getenforce
,若不是Disabled,执行下面的步骤:
- 编辑配置文件:
sudo vi /etc/sysconfig/selinux
- 把SELINUX的值改为disabled:
SELINUX=disabled
- 重启系统:
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
查看。
由于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
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依赖于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/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