A-A+

RTMP HLS HTTP 直播协议一次看个够

2019年02月11日 Linux

直播从2016年一路火到了2017年,如今要在自己的App里加入直播功能,只要找一个现成的SDK就行了,什么拍摄、美颜、推流,一条龙服务。不过作为直播身后最重要的部分:推流协议,很多人并不是很清楚。如果你也对直播感兴趣,想要了解他背后的各种机制,可以先从这篇文章中了解一下推流协议开始。

单纯从技术角度来看,能够实现直播功能协议中,比较常用的是RTMP HLS HTTP这种技术。但具体到应用场景,他们又会有一些不同的选择。

RTMP


Real Time Messaging Protocol实时消息传送协议是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议,未完全公开。关键词:块!目前绝大部分秀场直播使用的协议。

优势

实时性高:

RTMP的实时性在3秒之内,经过多层CDN节点分发后,实时性也在3秒左右。在一些实时性有要求的应用中以RTMP为主。比起YY的那种UDP私有协议,RTMP算延迟大的,比起HTTP流的延时(一般在10秒以上)RTMP算低延时。一般的直播应用,只要不是电话类对话的那种要求,RTMP延迟是可以接受的。在一般的视频会议应用中,RTMP延时也能接受,原因是别人在说话的时候我们一般在听,实际上1秒延时没有关系,我们也要思考(话说有些人的CPU处理速度还没有这么快)。

经过测量发现,在网络状况良好时:
. RTMP延时可以做到0.8秒左右。
. 多级边缘节点不会影响延迟(和SRS同源的某CDN的边缘服务器可以做到)
. Nginx-Rtmp延迟有点大,估计是缓存的处理,多进程通信导致?
. GOP是个硬指标,不过SRS可以关闭GOP的cache来避免这个影响.
. 服务器性能太低,也会导致延迟变大,服务器来不及发送数据。
. 客户端的缓冲区长度也影响延迟。譬如flash客户端的NetStream.bufferTime设置为10秒,那么延迟至少10秒以上。

编码兼容性高:

RTMP实际上是现在编码器输出的工业标准协议,基本上所有的编码器(摄像头之类)都支持RTMP输出。原因在于PC市场巨大,PC主要是Windows,Windows的浏览器基本上都支持Flash,Flash又支持RTMP支持得非常好。

支持加密:

RTMPE和RTMPS为加密协议。虽然HLS也有加密,但在PC平台上flash对RTMPE/RTMPS支持应该比较不错。

稳定性高:

在PC平台上flash播放的最稳定方式是RTMP,如果做CDN或者大中型集群分发,选择稳定性高的协议一定是必要的。HTTP也很稳定,但HTTP是在协议上稳定;稳定性不只是服务端的事情,在集群分发,服务器管理,主备切换,客户端的支持上,RTMP在PC分发这种方式上还是很有优势

因为RTMP支持的很完善,所以能做到flash播放RTMP流长时间不断流,当时测试是100万秒,即10天多可以连续播放。对于商用流媒体应用,客户端的稳定性当然也是必须的,否则最终用户看不了还怎么玩?我就知道有个教育客户,最初使用播放器播放http流,需要播放不同的文件,结果就总出问题,如果换成服务器端将不同的文件转换成RTMP流,客户端就可以一直播放;该客户走RTMP方案后,经过CDN分发,没听说客户端出问题了。

编码器接入:

编码器输出到互联网(还可以输出为udp组播之类**应用),主要是RTMP。譬如专业编码器,或者flash网页编码器,或者FMLE,或者ffmpeg,或者安防摄像头,都支持RTMP输出。若需要接入多种设备,譬如提供云服务;或者希望网页直接采集摄像头;或者能在不同编码器之间切换,那么RTMP作为服务器的输入协议会是最好的选择。

系统容错:

容错有很多种级别,RTMP的集群实现时可以指定N上层,在错误时切换不会影响到下层或者客户端,另外RTMP的流没有标识,切到其他的服务器的流也可以继续播放。HLS的流热备切换没有这么容易。若对于直播的容错要求高,譬如降低出问题的概率,选择RTMP会是很好的选择。

可监控:

在监控系统或者运维系统的角度看,流协议应该比较合适监控。HTTP的流监控感觉没有那么完善。这个不算绝对优势,但比较有利。

劣势:

播放兼容性差:

RTMP最大软肋,因为是Adobe的私有协议,很多设备都无法直接播放,比如iOS,需要外挂第三方解码器,由此会带来发热、耗电等问题。HTML5也是无法直接播放RTMP,因此你看到的很多手机网页上的直播,是由下面HLS来推流的。

协议复杂:

RTMP协议比起HTTP复杂很多,导致性能低下。

测试发现两台服务器直连100Gbps网络中,HTTP能跑到60Gbps,但是RTMP只能跑到10Gbps,CPU占用率RTMP要高很多。复杂协议导致在研发,扩展,维护软件系统时都没有HTTP那么方便,所以HTTP服务器现在大行其道,apache/nginx/tomcat,N多HTTP服务器;而RTMP协议虽然早就公开,但是真正在大规模中分发表现良好的没有,adobe自己的FMS在CDN中都经常出问题。

Cache麻烦:

流协议做缓存不方便。譬如点播,若做RTMP流协议,边缘缓存RTMP会很麻烦。如果是HTTP,缓存其实也很麻烦,但是HTTP服务器的缓存已经做了很久,所以只需要使用就好。这是为何点播都走HTTP的原因。

有累积延迟:

技术一定要知道弱点,RTMP有个弱点就是累积误差,原因是RTMP基于TCP不会丢包。所以当网络状态差时,服务器会将包缓存起来,导致累积的延迟;待网络状况好了,就一起发给客户端。这个的对策就是,当客户端的缓冲区很大,就断开重连。

HTTP


HTTP说的是HTTP流,譬如各大视频网站的点播流。本质上还是文件分发

优势:

性能很高:

HTTP的性能没得说,协议简单,各种HTTP高性能服务器也完善。如果分发的量特别大,譬如点播视频网站,没有直播的实时性要求,HTTP协议是最好选择。

没有碎片:

HTTP比HLS没有碎片,HTTP分发大文件会比小文件分发方便很多。特别是存储,小文件的性能超低,是个硬伤。

穿墙:

互联网不可能不开放HTTP协议,否则就不叫互联网。所以任何端口封掉,也不会导致HTTP流看不了。(不过RTMP也能穿墙,用RTMPT协议)。

劣势:

实时性差:

基本上没有实时性这个说法。

原生支持不好:

就PC上flash对于HTTP流支持还可以,Android/IOS上似乎只能mp4,总之移动端对于HTTP的支持不是很完善。

HLS


HTTP Live Streaming,是Apple的开放标准,基于HTTP流,它最初是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的流,现在见到在桌面也有很多应用了,由于是基于HTTP的,因此很多HTTP的优点都得到了继承。

优势:

性能高:

和HTTP一样。

穿墙:

和HTTP一样。

兼容性高:

IOS、Android、HTML5原生支持。

劣势:

实时性差:

基本上HLS的延迟在10秒以上。

文件碎片:

若分发HLS,码流低,切片较小时,小文件分发不是很友好。特别是一些对存储比较敏感的情况,譬如源站的存储,嵌入式的SD卡。

总结


. PC/Phone+直播+实时性要求高:使用flash播放RTMP。
. PC/Phone+直播+没有实时性要求:使用RTMP或者HLS均可。
. PC/Phone+点播:使用HTTP或者HLS。
. Phone+WEB+直播:想啥呢,老老实实用HLS吧。

有人说,我又想在手机网页上播,又想要他延迟低,怎么办呢。世上怎么会有这么矫情的人,要求这么多,碰巧我们公司就有这么一个人,就是我们的主管。我们的产品主打的是轻直播,播放端没有客户端,全部通过网页作为载体来实现。其实呢,现在还是有很多解决方案可以达到这中目的的。大部分视频流服务商都提供了远程编码的功能,流推上去后,自动编码成RTMP和HLS,你想给App用就拿RTMP流,你想给网页用你就拿HLS。至于HLS的延迟问题,已经有厂商开始推出优化版的HLS+,对HLS底层进行一些优化以适应低延迟直播的需求。根据我们内部的测试,已经能将延迟降低到7s左右,虽然赶不上RTMP,但也勉强可用。

转载:
http://www.cnblogs.com/my_life/articles/5593892.html
http://blog.chinaunix.NET/uid-26000296-id-4932817.html
http://blog.chinaunix.net/uid-26000296-id-4932822.html
http://blog.csdn.Net/zhangxinrun/article/details/50739237