直播从2016年一路火到了2017年,现在要在本身的App里加入直播功能,只要找一个现成的SDK就好了,什么拍摄、美颜、推流,一条龙服务。不过做为直播身后最重要的部分:推流协议,不少人并非很清楚。若是你也对直播感兴趣,想要了解他背后的各类机制,能够先从这篇文章中了解一下推流协议开始。html
单纯从技术角度来看,可以实现直播功能协议中,比较经常使用的是RTMP HLS HTTP这种技术。但具体到应用场景,他们又会有一些不一样的选择。nginx
Real Time Messaging Protocol实时消息传送协议是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议,未彻底公开。关键词:块!目前绝大部分秀场直播使用的协议。apache
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支持得很是好。tomcat
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中都常常出问题。
流协议作缓存不方便。譬如点播,若作RTMP流协议,边缘缓存RTMP会很麻烦。若是是HTTP,缓存其实也很麻烦,可是HTTP服务器的缓存已经作了好久,因此只须要使用就好。这是为什么点播都走HTTP的缘由。
技术必定要知道弱点,RTMP有个弱点就是累积偏差,缘由是RTMP基于TCP不会丢包。因此当网络状态差时,服务器会将包缓存起来,致使累积的延迟;待网络情况好了,就一块儿发给客户端。这个的对策就是,当客户端的缓冲区很大,就断开重连。
HTTP说的是HTTP流,譬如各大视频网站的点播流。本质上仍是文件分发
HTTP的性能没得说,协议简单,各类HTTP高性能服务器也完善。若是分发的量特别大,譬如点播视频网站,没有直播的实时性要求,HTTP协议是最好选择。
HTTP比HLS没有碎片,HTTP分发大文件会比小文件分发方便不少。特别是存储,小文件的性能超低,是个硬伤。
互联网不可能不开放HTTP协议,不然就不叫互联网。因此任何端口封掉,也不会致使HTTP流看不了。(不过RTMP也能穿墙,用RTMPT协议)。
基本上没有实时性这个说法。
就PC上flash对于HTTP流支持还能够,Android/IOS上彷佛只能mp4,总之移动端对于HTTP的支持不是很完善。
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