目前,国内主流的直播协议有HLS、RTMP、HTTP FLV,适用于不同的直播场景。
一、HLS、RTMP与HTTP FLV
1.HLS
HLS 全称是 HTTP Live Streaming, 是一个由 Apple 公司实现的基于 HTTP 的媒体流传输协议. 它跟 DASH 协议的原理非常类似. 通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件, 然后提供一个配套的媒体列 表文件, 提供给客户端, 让客户端顺序地拉取这些媒体文件播放, 来实现看上去是在播放一条流的效果。
△HLS 原理架构图
HLS 协议基于 HTTP,主要内容是关于 M3U8 这个文本协议的。其实生成和解析都非常简单, HLS 的请求流程是:
http 请求 m3u8 的 url。
服务端返回一个 m3u8 的播放列表,这个播放列表是实时更新的,一般一次给出5段数据的 url。
客户端解析 m3u8 的播放列表,再按序请求每一段的 url,获取 ts 数据流。
HLS 的优势
客户端支持简单, 只需要支持 HTTP 请求即可, HTTP 协议无状态, 只需要按顺序下载媒体片段即可.
使用 HTTP 协议网络兼容性好, HTTP 数据包也可以方便地通过防火墙或者代理服务器, CDN 支持良好.
Apple 的全系列产品支持, 由于 HLS 是苹果提出的, 所以在 Apple 的全系列产品包括 iphone, ipad, safari 都不需要安装任何插件就可以原生支持播放 HLS, 现在, Android 也加入了对 HLS 的支持.
自带多码率自适应, Apple 在提出 HLS 时, 就已经考虑了码流自适应的问题.
HLS 的劣势
相比 RTMP 这类长连接协议, 延时较高, 难以用到互动直播场景.
对于点播服务来说, 由于 TS 切片通常较小, 海量碎片在文件分发, 一致性缓存, 存储等方面都有较大挑战.
2. RTMP
RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议。RTMP协议中基本的数据单元称为消息。当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块。RTMP传输媒体数据的过程中,发送端首先把媒体数据封装成消息,然后把消息分割成消息块,最后将分割后的消息块通过TCP协议发送出去。接收端在通过TCP协议收到数据后,首先把消息块重新组合成消息,然后通过对消息进行解封装处理就可以恢复出媒体数据。
RTMP的优势
速度快,误码率低,延迟低
RTMP 是专为流媒体服务而生,协议在制定的时候就考虑到很多底层的优化
消息块的传输能够提供更加稳定的直播环境,在硬件上要求会更高,但是却能够缓解http的繁琐的传输介质。
RTMP的劣势
不支持Html5传播、浏览器推送
基于TCP协议,虽然开发难度大,推广度还不够,对于开发人员来说门槛比较高。
对硬件要求相较于HLS较高
3.HTTP FLV
HTTP FLV是一种将直播流模拟成FLV文件,通过HTTP协议进行下载的模式来实现流媒体传输的协议。
HTTP FLV 结合了 RTMP 的低延时,以及可以复用现有HTTP分发资源的流式协议。它的实时性和RTMP相等,与RTMP相比又省去了部分协议交互时间,首屏时间更短,可拓展的功能也更多。
HTTP FLV的优势
可以在一定程度上避免防火墙的干扰
可以很好的兼容HTTP 302跳转,做到灵活调度
可以使用HTTPS做加密通道
很好的支持移动端(Android,IOS)
二、直播协议HLS、RTMP与HTTP FLV的简单对比
协议 |
传输方式 |
视频封装格式 |
延时 |
数据分段 |
HTML5直播 |
应用场景 |
HLS |
HTTP流 |
Ts文件 |
10-30s |
切片 |
支持 |
H5直播,游戏直播 |
RTMP |
tcp流 |
flv tag |
2s |
连续流 |
不支持 |
互动直播 |
http flv |
HTTP流 |
flv |
2s |
连续流 |
支持 |
互动直播 |
三、总结
RTMP格式目前在国内是用比较多,国内CDN厂商也多支持RTMP协议。HLS作为苹果提出的直播协议,在iOS端占据了不可撼动的地位,同时又便于传播。HTTP FLV使用类似RTMP流式协议的HTTP长连接,需由特定流媒体服务器分发的,兼顾两者的优点。
又拍云一站式直播解决方案基于又拍云CDN,支持 RTMP、HTTP-FLV 和 HLS协议,并且通过智能调度、链路保障、追帧处理、丢帧处理以及业界首创的 HLS+ 技术,将RTMP、HTTP FLV直播延迟控制在1秒内,将HLS协议控制在4秒左右。
推荐阅读:
从Html5直播到互动直播,看直播协议的选择的更多相关文章
-
看直播 csust oj
看直播 Description 小明喜欢看直播,他订阅了很多主播,主播们有固定的直播时间 [Li, Ri] . 可是他网速只有2M,不能同时播放两个直播,所以同一时间只能看一个直播. 并且他只会去看能 ...
-
直播协议的选择:RTMP vs. HLS
文章转自:直播协议的选择:RTMP vs. HLS 前言 随着直播业务的兴起,越来越多的直播平台开始涌现,这火热的程度好像一个应用不带上直播业务出来都不好意思跟人打招呼.想要做一个直播业务,主要包括三 ...
-
国内游戏直播火热 为何YY游戏直播却巨亏
为何YY游戏直播却巨亏" title="国内游戏直播火热 为何YY游戏直播却巨亏"> 伴随"千万年薪主播"."美女主播陪玩那些事儿&q ...
-
阿里云低延时直播 RTS 能力升级 让直播推流效果更佳
行业背景 直播技术飞速发展让各个行业的用户体验呈现多样化和个性化,不同业务场景下创新实践满足大众对于音视频互动体验和参与的高标准要求.历经2020年初的巨变之后,以视频.游戏.电商.教育为主的互联网经 ...
-
网络直播流媒体协议的选择讨论,RTSP,RTMP,HTTP,私有协议?
最近有不少人在EasyDarwin的交流群里面问关于花椒.映客手机直播技术的问题,还有RTSP.RTMP协议选择的问题,这里个人谈一下自己的愚见. 1.不管是RTSP/RTP.RTMP.HTTP,亦或 ...
-
day122:MoFang:OSSRS流媒体直播服务器&;基于APICloud的acLive直播推流模块实现RTMP直播推流
目录 1.docker安装OSSRS流媒体直播服务器 2.基于APICloud的acLive直播推流模块实现RTMP直播推流 3.直播流管理 1.docker安装OSSRS流媒体直播服务器 1.OSS ...
-
推荐下:开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
视频播放, 原本是想h5 自带视频播放,使用很简单,结果现实很骨感. <video controls="controls" preload="auto" ...
-
html5播放m3u8视频,web端看直播
https://github.com/jiqing9006/hLive <!DOCTYPE html> <html> <head> <meta charset ...
-
【翻译】Facebook全面推出Watch Party,可多人线上同看直播视频
今天, Facebook全面推出Watch Party——多人共同观看直播功能,用户可以同时查看和评论同一视频. Watch Party先前已在群组中推出,并且正在测试其他类型的帐户.但现在任何个人资 ...
随机推荐
-
重撸js_2_基础dom操作
1.node 方法 返回 含义 nodeName String 获取节点名称 nodeType Number 获取节点类型 nodeValue String 节点的值(注意:文本也是节点) 2.inn ...
-
Oracle —— 函数 length() 和 lengthb() 的区别
先看看几个例子: select length('Oracle') from dual 结果:6 select lengthb('Oracle') from dual 结果:6 select lengt ...
-
修改ubuntu按下关机键触发的事件
gsettings set org.gnome.settings-daemon.plugins.power button-power shutdown will change your the beh ...
-
C语言socket编程——linux环境
先写一个服务器端的监听程序,功能室从客户端读取字符,接收到后告知客户端“I got your message: ”+收到的消息:server.c #include <stdio.h> #i ...
-
WPF学习总结1:INotifyPropertyChanged接口的作用
在代码中经常见到这个接口,它里面有什么?它的作用是什么?它和依赖属性有什么关系? 下面就来总结回答这三个问题. 1.这个INotifyPropertyChanged接口里就一个PropertyChan ...
-
使用javascript实现浏览器全屏
HTML 5中的full screen,目前可以在除IE和opera外的浏览器中使用 ,有的时候用来做 全屏API,游戏呀,等都很有用.先看常见的API 1 element.requestFullSc ...
-
python 元组列表转为字典
#create a list l = [(), (), (), (), (), ()] d = {} for a, b in l: d.setdefault(a, []).append(b) prin ...
-
unity 查找脚本被场景中哪些对象引用
在需要查找的脚本上右键: 在场景中已经显示出所有引用该脚本的对象
-
C/C++函数指针,指针函数的用法,用处
先看函数指针 int func2(int x); /* 声明一个函数 */ int (*q2) (int x); /* 声明一个函数指针 */ q2=func2; /* 将func函数的首地址 ...
-
python2.7入门---函数
不是说现在的高级程序员都是秉承着用最少的代码实现功能么,那么,怎么才能使代码少呢?好吧,不装哔~~~了,这一波操作我说不来,咱们直接来看内容.首先,函数是组织好的,可重复使用的,用来实现单一, ...