README.md 47.2 KB

#Simple-RTMP-Server

SRS/1.0, HuKaiqun

SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。
SRS is industrial-strength live streaming cluster, for the best conceptual integrity and the simplest implementation.

Download from github.io: Centos6-x86_64, more...
Download from ossrs.net: Centos6-x86_64, more...
Website for SRS/1.0, read SRS 1.0 Chinese or English.

Donation Paypal

About

SRS(SIMPLE RTMP Server) over state-threads created in 2013.10.

SRS delivers rtmp/hls live on x86/x64/arm/mips linux, supports origin/edge/vhost and transcode/ingest and dvr/forward and http-api/http-callback/reload, introduces tracable session-oriented log, exports client srs-librtmp, provides EN/CN wiki and the most simple architecture.

AUTHORS

There are three types of people that have contributed to the SRS project:

  • AUTHORS: Contribute important features. Names of all PRIMARY response in NetConnection.connect and metadata.
  • CONTRIBUTORS: Submit patches, report bugs, add translations, help answer newbie questions, and generally make SRS that much better.

About all PRIMARY, AUTHORS and CONTRIBUTORS, read AUTHORS.txt.

A big THANK YOU goes to:

Mirrors

Github: https://github.com/simple-rtmp-server/srs, the GIT usage( CN, EN )

git clone https://github.com/simple-rtmp-server/srs.git

CSDN: https://code.csdn.net/winlinvip/srs-csdn , the GIT usage( CN, EN )

git clone https://code.csdn.net/winlinvip/srs-csdn.git

OSChina: http://git.oschina.net/winlinvip/srs.oschina , the GIT usage( CN, EN )

git clone https://git.oschina.net/winlinvip/srs.oschina.git

Gitlab: https://gitlab.com/winlinvip/srs-gitlab , the GIT usage( CN, EN )

git clone https://gitlab.com/winlinvip/srs-gitlab.git

Usage

Step 1: get SRS

git clone https://github.com/simple-rtmp-server/srs &&
cd srs/trunk

Step 2: build SRS, Requires Centos6.x/Ubuntu12 32/64bits, others see Build( CN, EN ).

./configure && make

Step 3: start SRS

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

See also:

  • Usage: How to delivery RTMP?( CN, EN )
  • Usage: How to delivery HLS?( CN, EN )
  • Usage: How to delivery HLS for other codec?( CN, EN )
  • Usage: How to transode RTMP stream by SRS?( CN, EN )
  • Usage: How to forward stream to other server?( CN, EN )
  • Usage: How to deploy low lantency application?( CN, EN )
  • Usage: How to deploy SRS on ARM?( CN, EN )
  • Usage: How to ingest file/stream/device to SRS?( CN, EN )
  • Usage: How to use SRS-HTTP-server to delivery HTTP/HLS stream?( CN, EN )
  • Usage: How to show the demo of SRS?( CN, EN )
  • Usage: Solution using SRS?( CN, EN )
  • Usage: Why SRS?( CN, EN )

Wiki

SRS 1.0 wiki

Please select your language:

Donation

Donation:
http://www.ossrs.net/srs.release/donation/index.html

Donations:
https://github.com/simple-rtmp-server/srs/blob/develop/DONATIONS.txt

System Requirements

Supported operating systems and hardware:

  • All Linux , both 32 and 64 bits
  • All hardware with x86/x86_64/arm/mips cpu.

Summary

  1. 简洁稳定:Simple, also stable enough.
  2. 高性能:High-performance: single-thread, async socket, event/st-thread driven.
  3. 高并发:High-concurrency, 1800 connections(500kbps), 900Mbps, CPU 90.2%, 41MB
  4. RTMP源站:Support RTMP Origin Server.
  5. CDN边缘(上下行加速):Support RTMP Edge Server for CDN, push/pull stream from any RTMP server
  6. 单进程(无多进程):Support single process; no multiple processes.
  7. 支持Vhost:Support Vhost, support __defaultVhost__.
  8. 直播(无点播):Support RTMP live streaming; no vod streaming.
  9. 苹果HLS:Support Apple HLS(m3u8) live streaming.
  10. 支持纯音频HLS:Support HLS audio-only live streaming.
  11. 支持Reload:Support Reload config to enable changes.
  12. 支持GopCache:Support cache last gop for flash player to fast startup.
  13. 侦听多端口:Support listen at multiple ports.
  14. 长时间推流:Support long time(>4.6hours) publish/play.
  15. 转发流:Support Forward in master-slave mode.
  16. 流转码:Support live stream Transcoding by ffmpeg.
  17. 支持FFMPEG滤镜:Support ffmpeg filters(logo/overlay/crop), x264 params, copy/vn/an.
  18. 只转码音频:Support audio transcode only, speex/mp3 to aac
  19. 支持HTTP回调:Support http callback api hooks(for authentication and injection).
  20. 带宽测速:Support bandwidth test api and flash client.
  21. 演示页面:Player, publisher(encoder), and demo pages(jquery+bootstrap).
  22. 视频会议演示:Demo video meeting or chat(SRS+cherrypy+jquery+bootstrap).
  23. 中文Wiki:Full documents in wiki, in Chineses.
  24. 客户端库:Support RTMP(play-publish) library: srs-librtmp
  25. 支持ARM平台:Support ARM(debian armhf, v7cpu) with rtmp/ssl/hls/librtmp.
  26. 支持Init.d脚本:Support init.d and packge script, log to file.
  27. 支持ATC:Support RTMP ATC for HLS/HDS to support backup(failover)
  28. 支持HTTP-RESTful-API:Support HTTP RESTful management api.
  29. 采集流:Support Ingest FILE/HTTP/RTMP/RTSP(RTP, SDP) to RTMP using external tools(e.g ffmepg).
  30. 支持录制:Support DVR, record live to flv file for vod.
  31. 可追溯日志:Support tracable log, session based log.
  32. 支持FMS-Token穿越:Support DRM token traverse for fms origin authenticate.
  33. 全面的Utest:Support system full utest on gtest.
  34. Stable 1.0release branch and 2.0dev branch.

Releases

History

  • v1.0, 2015-07-14, use time jitter off for hls and forward. 1.0.33
  • v1.0, 2015-05-23, 1.0r4 release(1.0.32) released. 59509 lines.
  • v1.0, 2015-05-22, fix #397 the USER_HZ maybe not 100. 1.0.32
  • v1.0, 2015-03-26, fix hls aac adts bug, in aac mux. 1.0.31.
  • v1.0, 2015-03-19, 1.0r3 release(1.0.30) released. 59511 lines.
  • v1.0, 2015-03-17, remove the osx for 1.0.30.
  • v1.0, 2015-02-17, the join maybe failed, should use a variable to ensure thread terminated. 1.0.28.
  • v1.0, 2015-02-12, 1.0r2 release(1.0.27) released. 59507 lines.
  • v1.0, 2015-02-11, dev code HuKaiqun for 1.0.27.
  • v1.0, 2015-02-10, for #310, the aac profile must be object plus one. 1.0.26
  • v1.0, 2015-01-25, hotfix #268, refine the pcr start at 0, dts/pts plus delay. 1.0.25
  • v1.0, 2015-01-25, hotfix #151, refine pcr=dts-800ms and use dts/pts directly. 1.0.24
  • v1.0, 2015-01-23, hotfix #151, use absolutely overflow to make jwplayer happy. 1.0.23
  • v1.0, 2015-01-17, hotfix #290, use iformat only for rtmp input. 1.0.22
  • v1.0, 2015-01-15, 1.0r1 release(1.0.21) released. 59472 lines.
  • v1.0, 2015-01-08, hotfix #281, fix hls bug ignore type-9 send aud. 1.0.20
  • v1.0, 2015-01-03, hotfix to remove the pageUrl for http callback. 1.0.19
  • v1.0, 2015-01-02, hotfix #207, trim the last 0 of log. 1.0.18
  • v1.0, 2015-01-02, hotfix #216, http-callback post in application/json content-type. 1.0.17
  • v1.0, 2015-01-01, hotfix #270, memory leak for http client post. 1.0.16
  • v1.0, 2014-12-29, hotfix #267, the forward dest ep should use server. 1.0.15
  • v1.0, 2014-12-29, hotfix #268, the hls pcr is negative when startup. 1.0.14
  • v1.0, 2014-12-22, hotfix #264, ignore NALU when sequence header to make HLS happy. 1.0.12
  • v1.0, 2014-12-20, hotfix #264, support disconnect publish connect when hls error. 1.0.11
  • v1.0, 2014-12-05, 1.0 release(1.0.10) released. 59391 lines.
  • v1.0, 2014-12-02, hotfix #239, traverse the token before response connect. 1.0.10.
  • v1.0, 2014-11-25, update PRIMARY, AUTHORS, CONTRIBUTORS of SRS. 1.0.8.
  • v1.0, 2014-11-18, all wiki translated to English. 1.0.7.
  • v1.0, 2014-11-13, hotfix #200, deadloop when read/write 0 and ETIME. 1.0.6.
  • v1.0, 2014-11-06, use number for macro VERSION_MAJOR, VERSION_MINOR and VERSION_REVISION. 1.0.5.
  • v1.0, 2014-10-24, hotfix #186, drop connect args when not object. 1.0.3.
  • v1.0, 2014-10-24, rename wiki/xxx to wiki/v1_CN_xxx. 1.0.2.
  • v1.0, 2014-10-19, hotfix #183, donot support AnnexB when decoding RTMP body for HLS. 1.0.1.
  • v1.0, 2014-10-09, 1.0 beta(1.0.0) released. 59316 lines.
  • v1.0, 2014-10-08, fix #151, always reap ts whatever audio or video packet. 0.9.223.
  • v1.0, 2014-10-08, fix #162, failed if no epoll. 0.9.222.
  • v1.0, 2014-09-30, fix #180, crash for multiple edge publishing the same stream. 0.9.220.
  • v1.0, 2014-09-26, fix hls bug, refine config and log, according to clion of jetbrains. 0.9.216.
  • v1.0, 2014-09-25, fix #177, dvr segment add config dvr_wait_keyframe. 0.9.213.
  • v1.0, 2014-08-28, fix #167, add openssl includes to utest. 0.9.209.
  • v1.0, 2014-08-27, max connections is 32756, for st use mmap default. 0.9.209
  • v1.0, 2014-08-24, fix #150, forward should forward the sequence header when retry. 0.9.208.
  • v1.0, 2014-08-22, for #165, refine dh wrapper, ensure public key is 128bytes. 0.9.206.
  • v1.0, 2014-08-19, for #160, support forward/edge to flussonic, disable debug_srs_upnode to make flussonic happy. 0.9.201.
  • v1.0, 2014-08-17, for #155, refine for osx, with ssl/http, disable statistics. 0.9.198.
  • v1.0, 2014-08-06, fix #148, simplify the RTMP handshake key generation. 0.9.191.
  • v1.0, 2014-08-06, fix #147, support identify the srs edge. 0.9.190.
  • v1.0, 2014-08-03, 1.0 mainline7(0.9.189) released. 57432 lines.
  • v1.0, 2014-08-03, fix #79, fix the reload remove edge assert bug. 0.9.189.
  • v1.0, 2014-08-03, fix #57, use lock(acquire/release publish) to avoid duplicated publishing. 0.9.188.
  • v1.0, 2014-08-03, fix #85, fix the segment-dvr sequence header missing. 0.9.187.
  • v1.0, 2014-08-03, fix #145, refine ffmpeg log, check abitrate for libaacplus. 0.9.186.
  • v1.0, 2014-08-03, fix #143, fix retrieve sys stat bug for all linux. 0.9.185.
  • v1.0, 2014-08-02, fix #138, fix http hooks bug, regression bug. 0.9.184.
  • v1.0, 2014-08-02, fix #142, fix tcp stat slow bug, use /proc/net/sockstat instead, refer to 'ss -s'. 0.9.183.
  • v1.0, 2014-07-31, fix #141, support tun0(vpn network device) ip retrieve. 0.9.179.
  • v1.0, 2014-07-27, support partially build on OSX(Darwin). 0.9.177
  • v1.0, 2014-07-27, api connections add udp, add disk iops. 0.9.176
  • v1.0, 2014-07-26, complete config utest. 0.9.173
  • v1.0, 2014-07-26, fix #124, gop cache support disable video in publishing. 0.9.171.
  • v1.0, 2014-07-23, fix #121, srs_info detail log compile failed. 0.9.168.
  • v1.0, 2014-07-19, fix #119, use iformat and oformat for ffmpeg transcode. 0.9.163.
  • v1.0, 2014-07-13, 1.0 mainline6(0.9.160) released. 50029 lines.
  • v1.0, 2014-07-13, refine the bandwidth check/test, add as/js library, use srs-librtmp for linux tool. 0.9.159
  • v1.0, 2014-07-12, complete rtmp stack utest. 0.9.156
  • v1.0, 2014-07-06, fix #81, fix HLS codec info, IOS ok. 0.9.153.
  • v1.0, 2014-07-06, fix #103, support all aac sample rate. 0.9.150.
  • v1.0, 2014-07-05, complete kernel utest. 0.9.149
  • v1.0, 2014-06-30, fix #111, always use 31bits timestamp. 0.9.143.
  • v1.0, 2014-06-28, response the call message with null. 0.9.137
  • v1.0, 2014-06-28, fix #110, thread start segment fault, thread cycle stop destroy thread. 0.9.136
  • v1.0, 2014-06-27, fix #109, fix the system jump time, adjust system startup time. 0.9.135
  • v1.0, 2014-06-27, 1.0 mainline5(0.9.134) released. 41573 lines.
  • v1.0, 2014-06-27, SRS online 30days with RTMP/HLS.
  • v1.0, 2014-06-25, fix #108, support config time jitter for encoder non-monotonical stream. 0.9.133
  • v1.0, 2014-06-23, support report summaries in heartbeat. 0.9.132
  • v1.0, 2014-06-22, performance refine, support 3k+ connections(270kbps). 0.9.130
  • v1.0, 2014-06-21, support edge token traverse, fix #104. 0.9.129
  • v1.0, 2014-06-19, add connections count to api summaries. 0.9.127
  • v1.0, 2014-06-19, add srs bytes and kbps to api summaries. 0.9.126
  • v1.0, 2014-06-18, add network bytes to api summaries. 0.9.125
  • v1.0, 2014-06-14, fix #98, workaround for librtmp ping(fmt=1,cid=2 fresh stream). 0.9.124
  • v1.0, 2014-05-29, support flv inject and flv http streaming with start=bytes. 0.9.122
  • v1.0, 2014-05-28, 1.0 mainline4(0.9.120) released. 39200 lines.
  • v1.0, 2014-05-27, fix #87, add source id for full trackable log. 0.9.120
  • v1.0, 2014-05-27, fix #84, unpublish when edge disconnect. 0.9.119
  • v1.0, 2014-05-27, fix #89, config to /dev/null to disable ffmpeg log. 0.9.117
  • v1.0, 2014-05-25, fix #76, allow edge vhost to add or remove. 0.9.114
  • v1.0, 2014-05-24, Johnny contribute ossrs.net. karthikeyan start to translate wiki to English.
  • v1.0, 2014-05-22, fix #78, st joinable thread must be stop by other threads, 0.9.113
  • v1.0, 2014-05-22, support amf0 StrictArray(0x0a). 0.9.111.
  • v1.0, 2014-05-22, support flv parser, add amf0 to librtmp. 0.9.110
  • v1.0, 2014-05-22, fix #74, add tcUrl for http callback on_connect, 0.9.109
  • v1.0, 2014-05-19, support http heartbeat, 0.9.107
  • v1.0, 2014-05-18, 1.0 mainline3(0.9.105) released. 37594 lines.
  • v1.0, 2014-05-18, support http api json, to PUT/POST. 0.9.105
  • v1.0, 2014-05-17, fix #72, also need stream_id for send_and_free_message. 0.9.101
  • v1.0, 2014-05-17, rename struct to class. 0.9.100
  • v1.0, 2014-05-14, fix #67 pithy print, stage must has a age. 0.9.98
  • v1.0, 2014-05-13, fix mem leak for delete[] SharedPtrMessage array. 0.9.95
  • v1.0, 2014-05-12, refine the kbps calc module. 0.9.93
  • v1.0, 2014-05-12, fix bug #64: install_dir=DESTDIR+PREFIX
  • v1.0, 2014-05-08, fix #36: never directly use *(int32_t*) for arm.
  • v1.0, 2014-05-08, fix #60: support aggregate message
  • v1.0, 2014-05-08, fix #59, edge support FMS origin server. 0.9.92
  • v1.0, 2014-05-06, fix #50, ubuntu14 build error.
  • v1.0, 2014-05-04, support mips linux.
  • v1.0, 2014-04-30, fix bug #34: convert signal to io thread. 0.9.85
  • v1.0, 2014-04-29, refine RTMP protocol completed, to 0.9.81
  • v1.0, 2014-04-28, 1.0 mainline2(0.9.79) released. 35255 lines.
  • v1.0, 2014-04-28, support full edge RTMP server. 0.9.79
  • v1.0, 2014-04-27, support basic edge(play/publish) RTMP server. 0.9.78
  • v1.0, 2014-04-25, add donation page. 0.9.76
  • v1.0, 2014-04-21, support android app to start srs for internal edge. 0.9.72
  • v1.0, 2014-04-19, support tool over srs-librtmp to ingest flv/rtmp. 0.9.71
  • v1.0, 2014-04-17, support dvr(record live to flv file for vod). 0.9.69
  • v1.0, 2014-04-11, add speex1.2 to transcode flash encoder stream. 0.9.58
  • v1.0, 2014-04-10, support reload ingesters(add/remov/update). 0.9.57
  • v1.0, 2014-04-07, 1.0 mainline(0.9.55) released. 30000 lines.
  • v1.0, 2014-04-07, support ingest file/stream/device.
  • v1.0, 2014-04-05, support http api and http server.
  • v1.0, 2014-04-03, implements http framework and api/v1/version.
  • v1.0, 2014-03-30, fix bug for st detecting epoll failed, force st to use epoll.
  • v1.0, 2014-03-29, add wiki Performance for RaspberryPi.
  • v1.0, 2014-03-29, add release binary package for raspberry-pi.
  • v1.0, 2014-03-26, support RTMP ATC for HLS/HDS to support backup(failover).
  • v1.0, 2014-03-23, support daemon, default start in daemon.
  • v1.0, 2014-03-22, support make install/install-api and uninstall.
  • v1.0, 2014-03-22, add ./etc/init.d/srs, refine to support make clean then make.
  • v1.0, 2014-03-21, write pid to ./objs/srs.pid.
  • v1.0, 2014-03-20, refine hls code, support pure audio HLS.
  • v1.0, 2014-03-19, add vn/an for FFMPEG to drop video/audio for radio stream.
  • v1.0, 2014-03-19, refine handshake, client support complex handshake, add utest.
  • v1.0, 2014-03-16, fix bug on arm of st, the sp change from 20 to 8, for respberry-pi, @see commit
  • v1.0, 2014-03-16, support ARM(debian armhf, v7cpu) with rtmp/ssl/hls/librtmp.
  • v1.0, 2014-03-12, finish utest for amf0 codec.
  • v1.0, 2014-03-06, add gperftools for mem leak detect, mem/cpu profile.
  • v1.0, 2014-03-04, add gest framework for utest, build success.
  • v1.0, 2014-03-02, add wiki srs-librtmp, SRS for arm, product
  • v1.0, 2014-03-02, srs-librtmp, client publish/play library like librtmp.
  • v1.0, 2014-03-01, modularity, extract core/kernel/rtmp/app/main module.
  • v1.0, 2014-02-28, support arm build(SRS/ST), add ssl to 3rdparty package.
  • v1.0, 2014-02-28, add wiki BuildArm, FFMPEG, Reload
  • v1.0, 2014-02-27, add wiki LowLatency, HTTPCallback, ServerSideScript, IDE
  • v1.0, 2014-01-19, add wiki DeliveryHLS
  • v1.0, 2014-01-12, add wiki HowToAskQuestion, RtmpUrlVhost
  • v1.0, 2014-01-11, fix jw/flower player pause bug, which send closeStream actually.
  • v1.0, 2014-01-05, add wiki Build, Performance, Forward
  • v1.0, 2014-01-01, change listen(512), chunk-size(60000), to improve performance.
  • v1.0, 2013-12-27, merge from wenjie, the bandwidth test feature.
  • v0.9, 2013-12-25, v0.9 released. 20926 lines.
  • v0.9, 2013-12-25, fix the bitrate bug(in Bps), use enhanced microphone.
  • v0.9, 2013-12-22, demo video meeting or chat(SRS+cherrypy+jquery+bootstrap).
  • v0.9, 2013-12-22, merge from wenjie, support banwidth test.
  • v0.9, 2013-12-22, merge from wenjie: support set chunk size at vhost level
  • v0.9, 2013-12-21, add players for play and publish.
  • v0.9, 2013-12-15, ensure the HLS(ts) is continous when republish stream.
  • v0.9, 2013-12-15, fix the hls reload bug, feed it the sequence header.
  • v0.9, 2013-12-15, refine protocol, use int64_t timestamp for ts and jitter.
  • v0.9, 2013-12-15, support set the live queue length(in seconds), drop when full.
  • v0.9, 2013-12-15, fix the forwarder reconnect bug, feed it the sequence header.
  • v0.9, 2013-12-15, support reload the hls/forwarder/transcoder.
  • v0.9, 2013-12-14, refine the thread model for the retry threads.
  • v0.9, 2013-12-10, auto install depends tools/libs on centos/ubuntu.
  • v0.8, 2013-12-08, v0.8 released. 19186 lines.
  • v0.8, 2013-12-08, support http hooks: on_connect/close/publish/unpublish/play/stop.
  • v0.8, 2013-12-08, support multiple http hooks for a event.
  • v0.8, 2013-12-07, support http callback hooks, on_connect.
  • v0.8, 2013-12-07, support network based cli and json result, add CherryPy 3.2.4.
  • v0.8, 2013-12-07, update http/hls/rtmp load test tool st_load, use SRS rtmp sdk.
  • v0.8, 2013-12-06, support max_connections, drop if exceed.
  • v0.8, 2013-12-05, support log_dir, write ffmpeg log to file.
  • v0.8, 2013-12-05, fix the forward/hls/encoder bug.
  • v0.7, 2013-12-03, v0.7 released. 17605 lines.
  • v0.7, 2013-12-01, support dead-loop detect for forwarder and transcoder.
  • v0.7, 2013-12-01, support all ffmpeg filters and params.
  • v0.7, 2013-11-30, support live stream transcoder by ffmpeg.
  • v0.7, 2013-11-30, support --with/without -ffmpeg, build ffmpeg-2.1.
  • v0.7, 2013-11-30, add ffmpeg-2.1, x264-core138, lame-3.99.5, libaacplus-2.0.2.
  • v0.6, 2013-11-29, v0.6 released. 16094 lines.
  • v0.6, 2013-11-29, add performance summary, 1800 clients, 900Mbps, CPU 90.2%, 41MB.
  • v0.6, 2013-11-29, support forward stream to other edge server.
  • v0.6, 2013-11-29, support forward stream to other origin server.
  • v0.6, 2013-11-28, fix memory leak bug, aac decode bug.
  • v0.6, 2013-11-27, support --with or --without -hls and -ssl options.
  • v0.6, 2013-11-27, support AAC 44100HZ sample rate for iphone, adjust the timestamp.
  • v0.5, 2013-11-26, v0.5 released. 14449 lines.
  • v0.5, 2013-11-24, support HLS(m3u8), fragment and window.
  • v0.5, 2013-11-24, support record to ts file for HLS.
  • v0.5, 2013-11-21, add ts_info tool to demux ts file.
  • v0.5, 2013-11-16, add rtmp players(OSMF/jwplayer5/jwplayer6).
  • v0.4, 2013-11-10, v0.4 released. 12500 lines.
  • v0.4, 2013-11-10, support config and reload the pithy print.
  • v0.4, 2013-11-09, support reload config(vhost and its detail).
  • v0.4, 2013-11-09, support reload config(listen and chunk_size) by SIGHUP(1).
  • v0.4, 2013-11-09, support longtime(>4.6hours) publish/play.
  • v0.4, 2013-11-09, support config the chunk_size.
  • v0.4, 2013-11-09, support pause for live stream.
  • v0.3, 2013-11-04, v0.3 released. 11773 lines.
  • v0.3, 2013-11-04, support refer/play-refer/publish-refer.
  • v0.3, 2013-11-04, support vhosts specified config.
  • v0.3, 2013-11-02, support listen multiple ports.
  • v0.3, 2013-11-02, support config file in nginx-conf style.
  • v0.3, 2013-10-29, support pithy print log message specified by stage.
  • v0.3, 2013-10-28, support librtmp without extended-timestamp in 0xCX chunk packet.
  • v0.3, 2013-10-27, support cache last gop for client fast startup.
  • v0.2, 2013-10-25, v0.2 released. 10125 lines.
  • v0.2, 2013-10-25, support flash publish.
  • v0.2, 2013-10-25, support h264/avc codec by rtmp complex handshake.
  • v0.2, 2013-10-24, support time jitter detect and correct algorithm
  • v0.2, 2013-10-24, support decode codec type to cache the h264/avc sequence header.
  • v0.1, 2013-10-23, v0.1 released. 8287 lines.
  • v0.1, 2013-10-23, support basic amf0 codec, simplify the api using c-style api.
  • v0.1, 2013-10-23, support shared ptr msg for zero memory copy.
  • v0.1, 2013-10-22, support vp6 codec with rtmp protocol specified simple handshake.
  • v0.1, 2013-10-20, support multiple flash client play live streaming.
  • v0.1, 2013-10-20, support FMLE/FFMPEG publish live streaming.
  • v0.1, 2013-10-18, support rtmp message2chunk protocol(send_message).
  • v0.1, 2013-10-17, support rtmp chunk2message protocol(recv_message).

Performance

Performance benchmark history, on virtual box:

  • 2013-11-28, SRS 0.5.0, 1800clients, 90%CPU, 41MB. benchmark
  • 2014-07-12, SRS 0.9.156, 1800clients, 68%CPU, 38MB. benchmark
  • 2014-07-12, SRS 0.9.156, 2700clients, 89%CPU, 61MB. benchmark
  • 2014-11-11, SRS 1.0.5, 2700clients, 85%CPU, 66MB. (1.0 equals 2.0.12)

Latest benchmark(2014-07-12):

  1. 300 connections, 150Mbps, 500kbps, CPU 5.7%, MEM 9208KB.
  2. 600 connections, 300Mbps, 500kbps, CPU 18.3%, MEM 13MB.
  3. 900 connections, 450Mbps, 500kbps, CPU 27.9%, MEM 20MB.
  4. 1200 connections, 600Mbps, 500kbps, CPU 43.9%, MEM 26MB.
  5. 1500 connections, 750Mbps, 500kbps, CPU 55.2%, MEM 32MB.
  6. 1800 connections, 900Mbps, 500kbps, CPU 68.8%, MEM 38MB.
  7. 2100 connections, 1050Mbps, 500kbps, CPU 75.7%, MEM 46MB.
  8. 2400 connections, 1200Mbps, 500kbps, CPU 83.7%, MEM 54MB.
  9. 2700 connections, 1350Mbps, 500kbps, CPU 89.9%, MEM 61MB.
[winlin@dev6 srs]$ dstat
----total-cpu-usage---- -dsk/total- ---net/lo-- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
 29  17  39   0   0  15|   0  5325B| 163M  163M|   0     0 |4331  3386 
 30  16  38   0   0  16|   0  5325B| 160M  160M|   0     0 |4252  3332 
 30  15  37   0   0  17|   0  7646B| 169M  169M|   0     0 |4015  2886 
 30  17  36   0   0  17|   0  1638B| 197M  197M|   0     0 |4021  3037 
 31  17  35   0   0  17|   0   410B| 204M  204M|   0     0 |4181  3243 
 33  17  32   0   0  18|   0  2185B| 191M  191M|   0     0 |4305  3592 
 31  15  36   0   0  18|   0  1229B| 127M  127M|   0     0 |4446  3822 
 34  18  30   0   0  18|   0     0 | 231M  231M|   0     0 |4461  3691 
 32  17  33   0   0  18|   0   410B| 169M  169M|   0     0 |4518  3788 

Architecture

SRS always use the most simple architecture to support complex transaction.

  • System arch: the system structure and arch.
  • Modularity arch: the main modularity of SRS.
  • Stream arch: the stream dispatch arch of SRS.
  • RTMP cluster arch: the RTMP origin and edge cluster arch.
  • Multiple processes arch (by wenjie): the multiple process of SRS.
  • CLI arch: the cli arch for SRS, api to manage SRS.
  • Bandwidth specification: the bandwidth test specification of SRS.

System Architecture

+------------------------------------------------------+
|             SRS(Simple RTMP Server)                  |
+---------------+---------------+-----------+----------+
|   API/hook    |   Transcoder  |    HLS    |   RTMP   |
|  http-parser  |  FFMPEG/x264  |  NGINX/ts | protocol |
+---------------+---------------+-----------+----------+
|              Network(state-threads)                  |
+------------------------------------------------------+
|      All Linux(RHEL,CentOS,Ubuntu,Fedora...)         |
+------------------------------------------------------+

Modularity Architecture

+------------------------------------------------------+
|             Main(srs/bandwidth/librtmp)              |
+------------------------------------------------------+
|           App(Server/Client application)             |
+------------------------------------------------------+
|               RTMP(Protocol stack)                   |
+------------------------------------------------------+
|      Kernel(depends on Core, provides error/log)     |
+------------------------------------------------------+
|         Core(depends only on system apis)            |
+------------------------------------------------------+

Stream Architecture

                   +---------+              +----------+
                   + Publish +              +  Deliver |
                   +---|-----+              +----|-----+
+----------------------+-------------------------+----------------+
|     Input            | SRS(Simple RTMP Server) |     Output     |
+----------------------+-------------------------+----------------+
|    Encoder(1)        |   +-> RTMP protocol ----+-> Flash Player |
|  (FMLE,FFMPEG, -rtmp-+->-+-> HLS/NGINX --------+-> m3u8 player  |
|  Flash,XSPLIT,       |   +-> Fowarder ---------+-> RTMP Server  |
|  ......)             |   +-> Transcoder -------+-> RTMP Server  |
|                      |   +-> DVR --------------+-> FILE         |
|                      |   +-> BandwidthTest ----+-> Flash/StLoad |
+----------------------+                         |                |
|  MediaSource(2)      |                         |                |
|  (RTSP,FILE,         |                         |                |
|   HTTP,HLS,    ------+->-- Ingester ----(rtmp)-+-> SRS          |
|   Device,            |                         |                |
|   ......)            |                         |                |
+----------------------+-------------------------+----------------+

Remark:
(1) Encoder: encoder must push RTMP stream to SRS server.
(2) MediaSource: any media source, which can be ingest by ffmpeg.
(3) Ingester: SRS will fork a process to run ffmpeg(or your application) 
to ingest any input to rtmp, push to SRS.

HDS/HLS origin backup

                        +----------+        +----------+
               +--ATC->-+  server  +--ATC->-+ packager +-+   +---------+
+----------+   | RTMP   +----------+ RTMP   +----------+ |   | Reverse |    +-------+
| encoder  +->-+                                         +->-+  Proxy  +-->-+  CDN  +
+----------+   |        +----------+        +----------+ |   | (nginx) |    +-------+
               +--ATC->-+  server  +--ATC->-+ packager +-+   +---------+
                 RTMP   +----------+ RTMP   +----------+

RTMP cluster(origin/edge) Architecture

Remark: cluster over edge, see Edge Remark: cluster over forward, see Forward

+---------+       +-----------------+     +-----------------------+ 
+ Encoder +--+-->-+  SRS(RTMP Edge) +--->-+     (RTMP Origin)     | 
+---------+  |    +-----------------+     |   SRS/FMS/NGINX-RTMP  |
             |                            |    Red5/HELIX/CRTMP   |
             +-------------------------->-+         ......        |
                                          +-----------------------+ 
Schema#1: Any RTMP encoder push RTMP stream to RTMP (origin/edge)server,
    where SRS RTMP Edge server will forward stream to origin.


+-------------+    +-----------------+      +--------------------+
| RTMP Origin +-->-+  SRS(RTMP Edge) +--+->-+  Client(RTMP/HLS)  |
+-------------+    +-----------------+  |   |  Flash/IOS/Android |
                                        |   +--------------------+
                                        |
                                        |   +-----------------+
                                        +->-+  SRS(RTMP Edge) +
                                            +-----------------+
Schema#2: SRS RTMP Edge server pull stream from origin (or upstream SRS 
    RTMP Edge server), then delivery to Client.

Bandwidth Test Workflow

   +------------+                    +----------+
   |  Client    |                    |  Server  |
   +-----+------+                    +-----+----+
         |                                 |
         |   connect vhost------------->   |
         |   <-----------result(success)   |
         |                                 |
         |   <----------call(start play)   |
         |   result(playing)---------->    |
         |   <-------------data(playing)   |
         |   <-----------call(stop play)   |
         |   result(stopped)---------->    |
         |                                 |
         |   <-------call(start publish)   |
         |   result(publishing)------->    |
         |   data(publishing)--------->    |
         |   <--------call(stop publish)   |
         |   result(stopped)(1)------->    |
         |                                 |
         |   <--------------------report   |
         |   final(2)----------------->    |
         |           <END>                 |
         
@See: class SrsBandwidth comments.

Beijing, 2013.10
Winlin