经常会有人找我帮忙下载各种视频,时间长了,门路也摸索清楚了,写点东西记录下。

m3u8

HLS(HTTPLiveStreaming)是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案。在HLS技术中Web服务器向客户端提供接近实时的音视频流。使用的标准的HTTP协议。HTTP的应用使用HLS的技术,就能提供点播和直播。

原理

将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。支持的视频流编码为H.264,音频流编码为AAC。

多码率适配流

m3u8,是HTTP Live Streaming直播的索引文件。可以做多码率适配,根据网络带宽,客户端会选择一个适合自己码率的文件进行播放,保证视频流的流畅。

多码率适配流:

1
2
3
4
5
6
7
8
9
#EXTM3U
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=1280000
http://xxx.com/low.m3u8
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=2560000
http://xxx.com/mid.m3u8
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=7680000
http://xxx.com/hi.m3u8
#EXT-X-STREAM-INF: PROGRAM-ID=1, BANDWIDTH=65000, CODECS="mp4a.40.5"
http://xxx.com/audio-only.m3u8

单码率适配流:

1
2
3
4
5
#EXTM3U
#EXT-X-TARGETDURATION: 5220
#EXTINF: 5220,
http://xxx.com/entire.ts
#EXT-X-ENDLIST

m3u8文件组成

  • URI:一个URI表示一个媒体文件或是变种播放列表文件。
  • 空行:空行会被忽略
  • 字符串#开头:标签以#EXT开头,表示一个“tag”
1
#EXTINF:<DURATION>,<TITLE>

DURATION是一个整数,它指定了媒体文件以秒为单位的持续时间。
行内逗号后边的剩余部分是媒体文件的名字。

1
#EXT-X-KEY:METHOD=<method> [,URI=<uri>][,IV=<iv>]

媒体文件可能是被加密的,EXT-X-KEY提供了解密媒体文件的必要信息,用于取得16bytes的key文件解码ts文件。它的格式如上:

Method属性指定了加密方法,定义了两种加密方法:NONE和AES-128。

加密方法NONE表示媒体文件不被加密,如果加密方法是NONE,那么URI和IV属性不存在。

加密方法AES(Advanced Encryption Standard)-128表示媒体文件使用高级加密标准128位密钥和PKCS7padding加密。如果加密方法是AES-128,key tag和URI属性共同表示了一个key文件,通过URI可以获得这个key。那么对于URI属性,如果存在,则指定获取密钥的方法;

对于IV属性,如果存在,则指定使用密钥的初始化向量,将改值当成16个字节的16进制数,如果没有IV(Initialization Vector),则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0。

IV属性出现在协议版本2中,新的EXT-X-KEY将会取代任何一个先前的EXT-X-KEY。

如果播放列表文件没有包含EXT-X-KEY标签,那么媒体文件将不会被加密。