直播从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

RTMP HLS HTTP 直播协议一次看个够的更多相关文章

  1. EasyDSS流媒体解决方案实现的RTMP/HLS视频直播、直播鉴权(如何完美将EasyDSS过渡到新版)

    上一篇博文介绍了EasyDSS点播功能,然后作为RTMP流媒体服务器,接受RTMP推流.进行实时的直播流分发又是自身一大核心功能. 需求背景: 写本篇博文的一个目的是向大家介绍一下EasyDSS新版的 ...

  2. 内网网络摄像机(RTSP/IPC/NVR)如何能在公网进行RTMP/HLS/HTTP-FLV直播

    一.背景需求 传统监控行业里不管是设备端.服务器端亦或是客户端都在一个内网里面.而且现在的大部分监控方案都是这样的格局,小到一个公司范围内的监控,再到一个园区.一个仓库监控.一个农业园林监控.一个养殖 ...

  3. RTMP、HTTP-FLV、HLS,你了解常见的三大直播协议吗

    随着直播行业大火,游戏.乐秀.教育.发布会等直播类产品层出不穷,能够满足各方人员的需求.在直播中,总能在其中找到适合自己的产品内容.喜欢玩游戏的可以看游戏直播,想学点工作技能的,也可以观看大牛现场授课 ...

  4. Centos7 搭建Nginx+rtmp+hls直播推流服务器

    1 准备工具 使用yum安装git [root~]# yum -y install git 下载nginx-rtmp-module,官方github地址 // 通过git clone 的方式下载到服务 ...

  5. Java 监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器

    Java 监控直播流rtsp协议转rtmp.hls.httpflv协议返回浏览器 目录 需求背景: 一:了解音视频流协议: 二:方案一 rtsp 转rtmp 1.下载nginx + nginx-rtm ...

  6. 直播协议的选择:RTMP vs. HLS

    文章转自:直播协议的选择:RTMP vs. HLS 前言 随着直播业务的兴起,越来越多的直播平台开始涌现,这火热的程度好像一个应用不带上直播业务出来都不好意思跟人打招呼.想要做一个直播业务,主要包括三 ...

  7. 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务

    在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...

  8. 从Html5直播到互动直播,看直播协议的选择

    目前,国内主流的直播协议有HLS.RTMP.HTTP FLV,适用于不同的直播场景. 一.HLS.RTMP与HTTP FLV 1.HLS HLS 全称是 HTTP Live Streaming, 是一 ...

  9. 利用nginx搭建RTMP视频点播、直播、HLS服务器(转)

    开发环境 Ubuntu 14.04 server nginx-1.8.1 nginx-rtmp-module nginx的服务器的搭建 安装nginx的依赖库 sudo apt-get update ...

随机推荐

  1. vue中自定义软键盘

    https://segmentfault.com/a/1190000012568480

  2. (转)springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)

    1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...

  3. Java 基础 常用API (System类,Math类,Arrays, BigInteger,)

    基本类型包装类 基本类型包装类概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类 ...

  4. iText实现导出pdf文件java代码实现例子

    ///////////////////////////////////主类////////////////////////////////////////// package com.iText; i ...

  5. 【LeetCode每天一题】Next Permutation(下一个排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  6. 第1章 CLR的执行模型

    1.1将源代码编译成托管代码模块

  7. Java Selenium - 元素操作 (二)

    一篇概括了常用的元素定位方法,但是找到元素还是不够的,模拟鼠标的操作,完成各个功能点的自动操作才是关键. 下面是常见的页面元素操作会涉及到的方法,不是很全,比较复杂的后面单独拿出来做案例. 一, 输入 ...

  8. Groovy动态解析

    A:前面需要说些什么吗? B:不需要吗? A:需要吗? 解析方式一:通过指定的paths来初始化GroovyScriptEngine //通过指定的paths来初始化GroovyScriptEngin ...

  9. Serveral effective linux commands

    1. 统计当前文件夹下文件个数(不包括子目录下文件): $ ls -l | grep "^-" | wc -l 2. 统计当前文件夹下文件个数(包括子目录下文件): $ ls -l ...

  10. Asp.net Core认证和授权:Cookie认证

    关于asp.net core 的文章,博客园已经有很多大牛写过了. 这里我只是记录下自己在学习中的点滴和一些不懂的地方 Cookie一般是用户网站授权,当用户访问需要授权(authorization) ...