流媒体协议—— HTTP Live Streaming(HLS)

HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于Http协议的的流媒体网络传输协议。是苹果公司QuickTime XiPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。

HLS协议由三部分组成:

HTTP+M3U8+TS

HTTP:传输协议

M3U8:索引文件

TS:音视频媒体信息,视频的编码格式为H.264,音频格式为AAC。

服务器用于接收媒体输入流,对它们进行编码,封装成适合于分发的格式,然后准备进行分发。

分发组件为标准的 Web 服务器。它们用于接收客户端请求,传递处理过的媒体,把资源和客户端联系起来。

客户端软件决定请求何种合适的媒体,下载这些资源,然后把它们重新组装成用户可以观看的连续流。

HLS的工作原理:

流媒体协议—— HTTP Live Streaming(HLS)

HLS工作原理图

1.填入请求m3u8的url,通过http请求。

2.sever返回一个m3u8的播放列表,该列表包含了5段数据的url。

3.客户端解析m3u8播放列表后,按顺序的拿每一段数据的url去获取ts流。

流媒体协议—— HTTP Live Streaming(HLS)

 

HLS如何切片

Media encoder将视频源中的视频数据转码到目标编码格式(H264)的视频数据,之后,在stream segmenter模块将视频切片。切片的结果就是index file(m3u8)和ts文件,如上图

HLS协议的优点:

1.跨平台性:支持iOS/Android/浏览器,通用性强。

2.穿墙能力强:由于HLS是基于HTTP协议的,因此HTTP数据能够穿透的防火墙或者代理服务器HLS都可以做到,基本不会遇到被防火墙屏蔽的情况。

3.切换码率快(清晰度):自带多码率自适应,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。

3.负载均衡:HLS基于无状态协议(HTTP),客户端只是按照顺序使用下载存储在服务器的普通TS文件,做负责均衡如同普通的HTTP文件服务器的负载均衡一样简单。

HLS的缺点:

1.实时性差:苹果官方建议是请求到3个片之后才开始播放。所以一般很少用HLS做为互联网直播的传输协议。假设列表里面的包含5个 ts 文件,每个 TS 文件包含5秒的视频内容,那么整体的延迟就是25秒。苹果官方推荐的ts时长时10s,所以这样就会大改有30s(n x 10)的延迟。相比 RTMP 这类长连接协议, 延时较高, 难以用到互动直播场景。

2.文件碎片化严重:对于点播服务来说,由于 TS 切片通常较小,海量碎片在文件分发,一致性缓存, 存储等方面都有较大挑战。

改进

由于客户端每次请求 TS 或 M3U8 有可能一个新的连接请求, 无法有效的标识客户端,一旦出现问题, 基本无法有效的定位问题。
一般工业级的服务器都会对传统的 HLS 做一些改进,常见优化是对每个M3U8文件增加Session来标识一条 HLS 连接。
不管通过哪种方式,最终我们都能通过一个唯一的 id 来标识一条流,这样在排查问题时就可以根据这个 id 来定位播放过程中的问题。