HLS 视频下载方法的总结

in Software with 0 comment

HLS协议

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

HLS协议规定:

  1. 视频的封装格式是TS。
  2. 视频的编码格式为H264,音频编码格式为MP3、AAC或者AC-3。
  3. 除了TS视频文件本身,还定义了用来控制播放的m3u8文件(文本文件)。

视频文件下载

了解了 HLS 协议,剩下的就是分析怎么下载视频了。说白了主要由以下几个步骤:

  1. 获取视频索引 m3u8 文件(可能需要添加凭证,添加http请求头信息 etc. cookie
  2. 解析 m3u8 文件,分析出ts格式视频文件地址
  3. 根据上一步获取的地址,下载ts格式视频文件(可能需要添加凭证,添加http请求头信息 etc. cookie
  4. 如果视频有加密,则需要获取加密key(可能需要添加凭证)
  5. 将解密(如果视频加密)后的视频片段视频合成一个完整的视频

这里使用了 M3U8批量下载器 下载视频,并且 自定义协议头 添加凭证信息(主要是 cookie )。采用编辑 m3u8 文件的方式下载视频,我这里的ts视频地址是相对地址,于是就添加了 #YUMING|http://xxx.xx 配置(在第一行下面插入,即 #EXTM3U 下面)。

接下来说一下解密key的获取,很多时候直接把 m3u8 文件拖进工具里,不见得能正常下载视频(现在普遍的做法,都是给视频添加加密信息),于是我们就不得不获取解密key了。m3u8 文件里会有解密key信息,在 #EXT-X-KEY 配置节里,其中阐述了加密算法(即 METHOD)、key获取地址(即 URI),一条完整 #EXT-X-KEY 示例如下:

#EXT-X-KEY:METHOD=AES-128,URI="http://example.com/get_video_key",IV=0x00000000000000000000000000000000

很多时候,通过 URI 地址获取到的信息一般都是二进制数据(查看响应信息都是乱码,我们无法直接使用,至于为什么浏览器能正常播放,那是因为在视频播放器中做了解析)。这时需要我们自己对二进制数据做解析,对于 M3U8批量下载器 我们需要对二进制数据进行 base64 编码,并替换原来 URI 里的信息,完整的 #EXT-X-KEY 信息示例如下(这里假设解密key二进制数据,经过 base64 编码后的字符串为:pAEGoJ14Zy5gTMwc44OKKw==):

#EXT-X-KEY:METHOD=AES-128,URI="pAEGoJ14Zy5gTMwc44OKKw==",IV=0x00000000000000000000000000000000

现在就可以把 m3u8 文件拖入 M3U8批量下载器 里下载了。

M3U8批量下载器 提供了分析 m3u8 文件,下载并解密视频,最后合成视频。关于该工具的详细使用说明,请参考链接里面内容,这里就不再啰嗦了。

关于使用 M3U8批量下载器 的其它问题,请参考 Q&A 章节。


使用FD(fiddler)获取响应二进制流的 base64 编码字符串方法:

监视请求,查找请求解密key的http请求,点击查看详情,点击 Inspectors 选项卡,查看 Transformer 选项页,这时会显示 Response body: 16bytes,这时点击右侧的 HexView 选项页(二进制文本查看),选择 黑色字体 (这里就是响应体,绿色信息响应头)信息,右击选择 copy -> Copy as base64

fd01.png
fd02.png
fd03.png

主要参考文章

Comments are closed.