Clone
15
v1_CN_Compare
winlin edited this page 2022-01-06 11:57:15 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

HOME > CN > Product Compare

产品对比

对比几个知名的商业流媒体服务器,知名的开源流媒体服务器,以星级评定。难免有主观因素,以及不熟悉该产品的因素,有异议可以在群里面告知。

SRS聚焦在某些方面这些都是由产品定位决定的,有所不为才能有所为。

SRS优势的基础在于基础架构采用ST轻量线程SRS和其他流媒体系统的根本区别类似于GO就是轻量线程参考SRS架构

详细的功能列表,以及研发计划,参考:产品功能列表

术语表

下面对比用到的术语:

  • RTMPS/E/TRTMPS/E是加密协议RTMPT是HTTP穿墙协议
  • DASH各路诸侯对抗Apple的HLS提出的类似协议
  • 转换Vhost上行publish加速往往使用特殊设备和域名需要转换vhost为下行域名在CDN/VDN中常用
  • 配置友好FMS/Helix/Wowza的配置是XML时代产物不是给人看的极其不友好。Nginx配置是当代产物简单明了易读。
  • 启动脚本以linux服务启动的脚本譬如init.d下面的脚本
  • 源站配套系统其他辅助系统譬如VMS、转码、编码、收录、P2P等等。
  • 扩展脚本语言FMS有AScrtmpd/nginx有lua扩展语言难以调试代码量较多时问题频繁发生不觉得是个好东西
  • 单线程单线程能支持10K级别并发往往采用非阻塞异步机制
  • 轻量线程:轻量线程架构能使用“类同步”(本质异步)结构简化逻辑
  • 代码维护性:代码量,有效注释,注释百分比,逻辑复杂性,业务复杂性
  • 可追溯日志:客户端/边缘若知道自己在服务器的id那么就很容易追溯整个流

History

国家没有历史就没有文化,产品没有历史就没有品牌。开源软件也需要历史,只有不断更新和完善的产品才是好产品,尤其是资源紧缺的开源产品。

Media Stream Servers History

Protocol

协议是服务器的基础协议决定了关键应用场景譬如毫秒级别延时只能用udp秒级别延迟用RTMP十秒级别可以用HLS。

可惜技术并不能十全十美RTMP在PC上支持完善是因为adobe的flash支持得好HLS在IOS上完善是因为apple支持得好不代表RTMP协议就简单。

所以什么协议都支持的服务器往往失去了重要的方向和定位互联网上最重要的莫过于HTTP即HLS协议因此目前HLS大行其道。而实际PC平台浏览器中的的重要协议是RTMP。

Media Stream Servers Protocol

Feature

流媒体不仅仅是能播放就可以特别对于流媒体业务运营。配置几个参数就能转码和写复杂的FFMPEG参数完全不一样技术上容易1倍到最终用户使用时会方便千百倍。

Media Stream Servers Feature

Deploy

部署不重要么如果你有老旧的机器运行着老系统就不会那么认为了不是所有系统都能更新到CENTOS6的程序员往往喜欢写不能碰的软件特别是系统特别是早期的程序员。如果加上现在广泛应用的ARM呢能在ARM上运行不仅仅是很酷吧!

Media Stream Servers Deploy

Arch

体系结构其实是时代特征FMS/Helix/Wowza一看就是一个时代的nginx/rtmpd/srs是这个时代的架构。

Media Stream Servers Architecture

CDN/VDN

对于CDN/VDN往往有很多特殊的要求这些只有在CDN里面的运维最清楚。CDN的软件系统应该做到不需要运维半夜三更职守升级这个很容易你没有在CDN混过吧。

Media Stream Servers CDN/VDN

Code

代码行数往往没有什么意义,软件的基础是代码,所以比较下代码行数也没有关系。如果代码行数相差不大,功能也差不多,那没有什么奇怪的;如果功能少一倍,代码行数差不多,我会选择行数少的;如果功能少一倍,代码却多一倍,只有脑袋有问题的才会选择前者吧。

Media Stream Servers Code

SRS history

SRS的里程碑服务器开发不是百米冲刺而是马拉松绝对的马拉松。

Media Stream Servers SRS History

FMS PK SRS

FMS是adobe的流媒体服务器RTMP协议就是adobe提出来的FMS一定是重量级的产品。

FMS比SRS优点

  • 功能全面支持RTMP/RTMPE/RTMPS/RTMPT/RTMFP流协议AMF0/AMF3编码SharedObject协议HLS/HDS协议直播和点播支持服务器脚本支持多码率支持Windows和Linux平台。能想到的好像都能支持。SRS呢可怜兮兮的只有RTMP/AMF0/HLS/直播/linux。
  • 研发资源充分adobe做FMS的多少人看那个样子真是不少还得不断改进和推出新版本。这个也算一个优势不过也难讲windows也不少人对比起linux服务器还是比不过后者。

SRS比FMS优点

  • 简单SRS聚焦在更小的问题域上而问题域是所有软件复杂性的根本原因之一参考OOAD。因为缺乏研发资源SRS只提供互联网流媒体所使用最广泛的功能。因为而且只因为简化了问题域SRS才如此简单。
  • 更高性能FMS的性能不算瓶颈不过FMS一个进程开启246个线程的架构设计来看FMS就是一个旧时代的产物。
  • 不跨平台FMS支持跨平台在我看来不过是多此一举服务器为何要跑在windows上面大约只是为了自宫练宝典。正是SRS不跨平台才得以略去很多麻烦事。
  • 配置简单FMS的配置巨麻烦无比xml也是上一代技术的产物真心xml作为配置是个不好用的东西。何况FMS的配置巨繁琐创建vhost还得创建一个目录拷贝配置创建app也要建立目录且小心了别改错了。SRS呢根本不用创建app为什么要创建app创建vhost只要在配置文件加一行就搞定。
  • 支持ReloadFMS没有Reload所以某CDN公司的运维就很苦了白天不能动FMS不能加新客户那会导致FMS重启。只能半夜三更起来操作完了还要阿弥陀佛因为研发一般这时候睡觉了除了问题就只能自求多福。SRS呢直接Reload就能生效不影响在线用户想怎么改都行。
  • 快速重启c/c++程序嘛总会出问题解决这种问题简单的方式就是看门狗重启。FMS惨了重启要1分钟我去1分钟没有流啊客户都要找上门赔钱了不行的。SRS重启多长时间以毫秒计算。
  • 可追溯日志FMS的日志就是没有什么用的东西想知道某个IP的客户端为何死活播放不了想知道有哪些客户端延迟较大想知道目前服务器吞吐带宽做梦吧adobe根本没打算给出来或许他们自己也不知道哈哈。SRS呢首先记录完整日志都有错误码而且有client id可以查询到某个客户端的整个信息要在那么多客户端中找出一个不简单。其次使用pithy print做到智能化打印SRS的日志输出还是比较能给人看的不多不少。最后SRS提供cli能吐出json数据想查带宽想查流信息cli都可以搞定而且是json现代系统标准接口。
  • 支持热备FMS竟然没有热备是的不是adobe不行几乎都不会考虑热备。SRS边缘可以回多个源站一个挂了切另外一个。FMS如何做得改配置重启等等重启不是要一分钟吗是的简单来讲FMS不支持热备。
  • 适应性强FMS适应性如何不强FMS4只能运行在Centos5 64位FMS5要好点也好不到哪里去。SRS呢估计linux-arm上都能跑更别提什么linux发行版什么机器什么内存都行如果你有大量旧机器要跑流媒体可以上SRS吧。
  • url格式简单这个也算我觉得很算。看过FMS的RTMP对应的HDS/HLS流吧多么长的地址多么恐怖的adbevent谁要是能立马配置FMS的HLS然后输入地址播放那真的是神。SRS呢把rtmp换成http后面加上.m3u8就是HLS多么简单
  • 支持转码FMS无法对直播流在服务器端转码。SRS使用ffmpeg做了支持。adobe是大公司应该是没有办法使用ffmpeg转码。
  • 支持录制FMS的录制是在FMLE上有个DVR的按钮然后配置服务器端脚本实现不靠谱。SRS的录制和时移只会做一部分但是也会比那种脚本方案要靠谱很多脚本不可能不出问题亲身经历
  • 开源代码FMS最重要一点不提供代码有bug找adobe。想要定制找adobe。那基本上就不要有那个念想了。SRS代码都是开源的SRS作者水平一般所以写出来代码就需要很小心尽量写得清楚不然自己看不懂哈哈。

Wowza PK SRS

Wowza也是个很了不起的产品据说公司快上市了Wowza和SRS在功能上很像不过wowza也是在功能方面比SRS多很多。

Wowza比SRS优点

  • 功能全面和FMS类似Wowza支持的功能很多估计比FMS不会少。

SRS比Wowza优点

  • c++高性能wowza是java的想不通为何用java做服务器性能肯定不高。不过实测发现没有想象的那么低当然比起NGINX还是很低。低性能的问题就是延迟会大。不过不是所有流媒体客户都关心延迟所以Wowza这点不算硬伤。
  • 部署简单wowza依赖于jdk还得设置环境变量我去。wowza的安装包也很大jdk的也很大都在100MB+真的不方便。SRS多大3MB左右不依赖与任何外部库。一个srs一个conf就能跑起来了。wowza需要多少东西。。。
  • 内存少其实java都是这样内存居高不下没有办法gc肯定没有那么智能。wowza吃内存是以GB算的SRS是以KB算的在某些没有10GB内存的服务器上还是不要跑wowza得好。虽说内存便宜如果内存没法那么大呢譬如arm
  • 不跨平台wowza使用java跨平台技术就是这样有好处就会有代价。SRS打死也不会考虑做非linux平台目的就是简单。
  • 配置简单java的配置xml蛋疼不喜欢所有java的配置譬如tomcat之类。nginx的配置文件绝对是极品是的SRS就是抄袭的nginx的配置部分的代码。
  • 支持Reloadwowza也没有听说过reload这回事吧这个功能上用起来真是很重要不知道为何大家都不支持。同样的nginx的reload多么强大。reload也不是多么难的事情srs也支持reload这个不是从nginx抄袭的自己写额。
  • 可追溯日志商业软件都是一副德行生怕别人看懂日志提供的接口也很封闭。SRS当然不会了原因是SRS没有那么多精力做方案只好提供接口给大家控制和使用。
  • 支持热备wowza的热备似乎是个插件也有可能没有这点不太确定。不过SRS原生支持热备发生故障时切换时间以毫秒计算也就是上层服务器没有流了马上切换到其他服务器用户不会断也不会有感觉。
  • 开源代码wowza也是没有代码的比FMS好的是它提供了plugin方案。等等plugin方案和nginx的模块哪个好当然是后者后者直接编译进去接口都可见甚至把nginx自己代码改了都可以。SRS不支持nginx的模块原因是觉得那个太麻烦本身代码就没有多少不如直接改。

NginxRtmp PK SRS

可以说nginx-rtmp是最现代化的流服务器几乎无可挑剔所以现在崛起也很快。主要得益于nginx的基础做得好。

nginx-rtmp是2012.3.17发布的0.0.11.0是在2013.5.27),基本上那个时候开始做的。参考:nginx-rtmp release 0.0.1

nginx-rtmp(1.1.4版本)的代码行数是30957行代码和SRS(0.9.90 33679行另外st有4839行)是差不多的功能和SRS差不多吗

可惜nginx-rtmp不能单独运行得基于nginx运行。nginx1.5的代码是141534行核心的服务器部分core, event)是37678行。也就是说nginx-rtmp实际上是68883行是SRS38610行的1.784倍功能能有SRS的2倍吗这就是ST强大的地方吧。

SRS的注释可使用工具research/code-statistic/csr.py统计是5944行占总代码行数的17.65%。ST的注释是754行占代码总行数比例为15.58%。合在一起是6698行占总数的17.39%。

Nginx的注释是1644行占代码总行数的4.36%。NginxRTMP的注释是946行占代码总行数的3.06%。混合在一起的行数是2598行占总行数的3.77%。

nginx-rtmp比SRS优点

  • 作者牛逼能在nginx上写rtmp扩展的人真心是牛逼。SRS作者以前做过类似的事情不是在nginx上是照着nginx的底层结构用linux/epoll/多进程单线程/非阻塞异步socket实现RTMP协议发现越到后面那个异步状态处理越麻烦。不得不承认nginx-rtmp作者能力比SRS作者能力高出N个数量级。
  • 支持多进程nginx的多进程是个硬指标。SRS有研发计划但目前还没有支持多进程多进程不Simple好消息是在不久将来SRS就可以在这点上不成为弱点了。

SRS比nginx-rtmp优点

  • 简单nginx高性能原因是直接使用异步非阻塞socket。SRS本质上也是所以说和nginx同源架构但是在另外一个牛人的指点下用了st这个库避免了异步socket那些状态处理。所以SRS看起来的逻辑很简单。我一直以为nginx-rtmp最大的挑战就是不稳定太复杂了越发展应该是越明显不过nginx-rtmp作者很强大这个就很难估计了。
  • Vhostnginx-rtmp作者估计没有用过FMS因为FMS的Vhost在客户较多时会很有用是个必选也可能是支持vhost会导致RTMP状态更多吧。总之没有vhost对于CDN这种公司有很多客户用同一套流媒体时是不行的如何计费呢
  • RTMP边缘或许nginx-rtmp的pull和push也算边缘但是实际上不完全是边缘应该只需要知道源站的ip所有信息都从源站取。这样对于大规模部署很方便。另外和上面一点相关配置应该基于vhost而不是appapp是不需要配置的只有vhost才需要配置vhost后随便客户推什么流上来啦。
  • 转码nginx-rtmp其实也可以用ffmpeg转码也是用ffmpeg不过稍微没有往前走一步。nginx-rtmp的转码是通过事件类似SRS的HTTP callback在连接上来时转码。SRS往前走了一步在配置文件里配置转码信息SRS会自动管理进程kill或者重启。使用起来还是方便不少的。
  • 代码少nginx-rtmp是基于nginx的nginx是web服务器专业的牛逼的web服务器。所以nginx-rtmp的代码总数是16万行而srs只有2万行。如果要在arm上编译还是srs稍微瘦一点。如果打算维护还是维护2万行代码的产品会好些。
  • 中文文档SRS中文文档基本覆盖了SRS的功能而且会根据大家的问题更新还是很适合中文水平不错的人。同时SRS也提供英文文档。

我也fork了nginx-rtmp代码RTMP和HLS部分都是参考了nginx-rtmp大牛还是大牛啊。nginx-rtmp 1.1.4的一些提交还是在fix crash直接异步的方式做RTMP还是比较难的

nginx-rtmp crash

对比下代码响应connect-app这个包的发送的代码

nginx-pk-srs.send-conn-response

这个就是同步和异步socket的区别以及问题的分解导致的一致性组包和发包两个层次而不是nginx那样设置数据更改全局配置调用发送函数对象层次的互动和数据操作或者说数据隐藏和层次化和数据结构这两个编程方法的区别。

Red5 PK SRS

Red5就算了100个连接就不行了有wowza的java的弱点也没有特别的优点就不要pk了。同是开源软件相煎何太急。

crtmpd PK SRS

crtmpdrtmpserverc++的RTMP服务器但是SRS也是C++的私下以为crtmpd是以c的思维习惯来写c++代码就像c++作者讲的拿着c++这个电钻当铁锤锤钉子————不仅仅没有效果,还可能会砸到自己的手。

crtmp(svnversion为811版本的代码行数是93450行代码是SRS(0.9.90 38518行其中st有4839行)的2.426倍功能不会比SRS多3倍吧这就是ST强大的地方。

SRS的注释可使用工具research/code-statistic/csr.py统计是5944行占总代码行数的17.65%。ST的注释是754行占代码总行数比例为15.58%。合在一起是6698行占总数的17.39%。

CRTMPD的注释是15891行占代码总行数的17.00%。

# CRTMPD
python ~/srs/research/code-statistic/csr.py ~/git/crtmpserver/sources/ *.h,*.cpp .svn,tests
#total:93450 code:77559 comments:15891(17.00%) block:13123 line:2768
#NGINX1.5(event,core)
python ~/srs/research/code-statistic/csr.py ~/tools/nginx-rtmp/nginx-1.5.7/src/ *.h,*.c http,mail,misc,os
#total:37678 code:36034 comments:1644(4.36%) block:1644 line:0
#NGINX-RTMP1.1.4
python ~/srs/research/code-statistic/csr.py ~/tools/nginx-rtmp/nginx-rtmp-module-1.1.4/ *.h,*.c
#total:30957 code:30011 comments:946(3.06%) block:946 line:0
# NGINX(event,core)+NGINX-RTMP
python ~/srs/research/code-statistic/csr.py ~/tools/nginx-rtmp/mixed/ *.h,*.c
#total:68883 code:66285 comments:2598(3.77%) block:2598 line:0
# ST
python ~/srs/research/code-statistic/csr.py ~/srs/objs/st-1.9/ *.h,*.c examples,extensions,LINUX
#total:4839 code:4085 comments:754(15.58%) block:754 line:0
# SRS
python ~/srs/research/code-statistic/csr.py ~/srs/src *.*pp utest,upp
#total:33679 code:27735 comments:5944(17.65%) block:4126 line:1818

而且crtmpd还支持lua这个是开源软件的通病喜欢什么都往里面加窃以为不可取。所以有人抱怨说crtmpd太大是的大得不得了。

我测试过crtmpd性能还是不错的应该和SRS差不多。可惜crtmpd走的是单进程方向各种扩展和协议没有支持多进程和边缘集群方向所以大家道不同不相为谋也没有什么好比较的了。

其他

以上就是我所知道的流媒体服务器特别是是直播流媒体服务器目前来看SRS还是相当让我满意的。

如果你希望知道其他服务器和SRS的PK结果在微信群里告知我我看看然后加上。如果还不错可以PK一下的话。

Winlin 2014.5