网络直播中常见的三种协议:RTMP、HTTP-FLV、HLS
HTML5和FLASH
在讲着三种协议之前,需要提一下FLASH和HTML5
- HTML5和FLASH都是播放器
- RTMP、HTTP-FLV、HLS这三种直播协议需要具体的播放器的支持
- 当今是HTML5的世界,支持FLASH播放器的协议逐渐被淘汰
- 协议的出现顺序RTMP(FLASH)-------FLV(FLASH,支持http传输)-------HLS(H5)
- RTMP是由FLASH支持的,视频封装格式为flv的传输协议
- http-flv出现在RTMP之后,其发送的还是flv封装格式的音视频,但其可以在http上进行传输
- 后来出现HLS支持h5
- 这就是音视频协议由FLASH到H5播放器的过程
- 音视频封装格式:flv和m3u8、ts
两端一服:流媒体服务中的双端关系
- 推流
- 得到原始的视频或者音频数据
- 对音频和视频数据进行编码得到H264码流和ACC音频(编码压缩处理,硬编码:API,软编码:FFmpeg)
- 对数据进行封装得到flv、ts、ps流
-
使用HLS协议的时候加上这一步(HLS分段生成策略及m3u8索引文件)
- 通过流上传到服务器
- 服务器根据协议进行流分发
- 推流协议:RTMP
- 拉流(播放):
- 根据协议类型,和服务器建立连接并接收数据
- 首先解封装(flv、ts)得到H264视频和ACC音频
- 解码,使用硬解码(API)或者软解码(FFmpeg)得到原始的视频和音频数据
- 同步音视频数据
- 播放音视频
- 拉流协议:RTMP和HLS
- HLS协议只能用在拉流端、RTMP可以用在推流端和拉流端
- 流媒体服务器:中间服务器,协调通信双方
RTMP
- 基于flash播放器
- 对应的封装格式:flv
- RTMP是一种数据传输协议,基于TCP,RTMP本身在应用层
- 消息
- RTMP中的基本数据单元:消息
- 结构:
- message type
- 消息类型,共有十种,表示后面消息体里面携带了什么信息
- 1-7协议控制,表示RTMP自身管理所需要的信息,不需要用户进行操作
- 8音频,9视频
- 15-20,用户控制指令,AMF编码的命令,用户和服务器之间的交互,播放、暂停等
- payload length
- 负载长度
- time stamp
- 时间戳
- stream id
- 消息所属流ID
- message body
- 上面这些信息构成了消息头,消息头和消息体构成了一条消息
- message type
- 消息块
- 在网络上传输时,消息需要被拆分成较小的数据块(chunk)才能在相应的网络上传输
- 构成
- chunk header
- chunk basic header:标识本块
- chunk message header:标识本块负载所属消息
- extended timestamp:时间戳溢出时出现
- chunk data
- chunk header
- 消息分块
- 在分块的过程中,消息负载部分(message body)被划分成固定大小(128位)的数据块(除了最后一个数据块),然后在数据块的头部加上消息头(chunk header)就得到了一个chunk
- 数据传输过程:
- 发送端将数据封装为消息,然后对消息分块,得到chunk
- 在网络上发送chunk(TCP)
- 对接收到的chunk进行整合,得到消息,解封装得到原始数据
HLS
- 基于HTTP传输
- 苹果提出的
- 切片:服务端按照不同的码率将文件或者媒体流分成小片段进行传输,播放端根据自身的带宽情况和性能限制,在同一视频的不同码率的备用源中下载合适码率的文件进行播放
- m3u8索引文件:找到不同码率的码流(在播放器寻找合适码率的码流时用到)
- HLS和RTP:RTP基于UDP,HLS基于HTTP,因此HLS可以经过任何允许HTTP传输的防火墙或者代理服务器,穿透力很强
- 劣势:慢,响应时间比较快,但是把时间都浪费在等待数据上了。延时10s,而RMTP延时为3s,因此对互动性有要求的直播采用RMTP
- 格式解析
-
网络协议 HTTP 封装格式 TS、MEPG-2 编码格式 视频H264、音频ACC、MP3 索引文件 m3u8
-
-
流程
-
原始的视频和音频数据首先经过编码和封装得到打包好的码流
-
在服务器上将码流变成HLS支持的编码格式和封装格式,根据不同码率生成不同文件,分别进行切片处理,得到m3u8索引文件
-
发送到客户端之后,访问以及m3u8得到合适码率的音视频流
-
m3u8
-
m3u8存在二级索引
-
一级索引
-
里面记录了二级索引地址
-
存放了不同码率的m3u8文件的下载地址
-
-
二级索引
-
记录了ts切片序列的下载地址
-
-
客户端获取一级索引m3u8之后,根据自己的带宽,下载相应码率的二级索引文件,按照二级索引文件的切片顺序下载并播放ts文件序列。
HTTP-FLV
- http-flv就是http+flv,将音视频封装成flv格式然后通过http协议进行传输
- 是对RTMP的改进
比较
- 推流端:RTMP,拉流端:RTMP和HLS
- RTMP为什么比HLS快
- 比较他们的速度一定是在拉流端
- RTMP拉流抓包
- 从握手结束到传送第一个视频数据需要700ms
- HLS拉流抓包
- 从获得m3u8索引到得到ts切片需要200ms
- 可以看到HLS的响应速度要快于RTMP,但实际上HLS比RTMP的延时更长,这是为什么?
- HLS的延时主要来源于等数据的时间,媒体服务器需要等待一定数量的数据上传,才能对这些数据统一做切片处理。