HLS入门

HLS入门

常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这二种基本是完全不同的东西,目前比较方便又好用的是用 HTTP 渐进下载方法。在这个中 apple 公司的 HTTP Live Streaming 是这个方面的代表。

HLS (HTTP Live Streaming),是Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。

这里提到的M3U(8),以m3u8文件为例,其本质是一个Unicode编码的文本文件,其内容如下:

$ cat videos.m3u8 
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:255
#EXT-X-TARGETDURATION:15
#EXTINF:11.656, no desc
videos-255.ts
#EXTINF:11.587, no desc
videos-256.ts
#EXTINF:10.880, no desc
videos-257.ts
#EXTINF:11.291, no desc
videos-258.ts
#EXTINF:10.179, no desc
videos-259.ts
#EXTINF:11.185, no desc
videos-260.ts

这段文件中的信息大致含义如下表:

字段 含义
#EXTM3U m3u文件头,必须放在第一行
#EXT-X-VERSION 版本信息
#EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号
#EXT-X-TARGETDURATION 每个分片TS的最大的时长
#EXT-X-ALLOW-CACHE 是否允许cache
#EXT-X-ENDLIST m3u8文件结束符
#EXTINF extra info,分片TS的信息,如时长,带宽等

相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

例如,我当前的srs设置了hls切片,其保存的目录中会有如下文件:

[live]$ ls
videos-312.ts  videos-313.ts  videos-314.ts  videos-315.ts  videos-316.ts  videos-317.ts  videos-318.ts.tmp  videos.m3u8

这些文件是会不断的更新的,客户端就是通过读取videos.m3u8文件来获取索引进行播放,当获取的ts文件播放完了,hls就会更新索引并且删除当前目录过期的ts文件。

当我们通过curl去请求一个m3u8文件时,也会看到其索引信息

< HTTP/1.1 200 OK
< Server: marco/0.9
< Date: Thu, 10 Mar 2016 09:39:07 GMT
< Content-Type: application/vnd.apple.mpegurl
< Content-Length: 327
< Connection: keep-alive
< X-Source: C/200
< Access-Control-Allow-Origin: *
< Last-Modified: Thu, 10 Mar 2016 09:38:56 GMT
< X-Real-Ip: 103.251.128.30
< ETag: "56e140b0-147"
< Accept-Ranges: bytes
< Expires: Sat, 03 Mar 1990 23:33:33 GMT
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
< Age: 0
< X-Cache: MISS|MISS from cun-hz-fdi-148, MISS|MISS from ntt-cn-hkg-006, MISS|MISS from ntt-us-lax-148
< X-Request-Id: c6512d750f05fa25419c330930dd0483
< Via: S.cmn-hz-fdi-084, T.1221.M.2, T.1221.M.1, V.cun-hz-fdi-148, T.1284.M.2, T.1284.M.1, V.ntt-cn-hkg-006, T.60148.M.2, T.60148.M.1, M.ntt-us-lax-148
< Strict-Transport-Security: max-age=604800
< 
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:333
#EXT-X-TARGETDURATION:15
#EXTINF:11.198, no desc
videos-333.ts
#EXTINF:11.989, no desc
videos-334.ts
#EXTINF:11.195, no desc
videos-335.ts
#EXTINF:11.176, no desc
videos-336.ts
#EXTINF:11.182, no desc
videos-337.ts
#EXTINF:11.998, no desc
videos-338.ts
* Connection #0 to host www.fangwenjun.com left intact
* Closing connection #0

我们可以通过vlc去播放这个们m3u8文件,iPhone或mac自带的浏览器safari可以直接播放hls文件

))