m3u8 不是一个视频文件,而是一个playlist。用 sublime text 打开下载下载下来的 m3u8 文件是这样子的:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-KEY:METHOD=AES-128,URI="http://hls.videocc.net/a0713eea93/3/a0713eea93d0d017ace1c26de982c673_3.key?pid=1548059731161X1008771&ts=1548059730000&sign=859d3dbfd2f62e76b6e4ba4ed110cbca&ms=d45fbe22c7d970a99750939929f27276",IV=0xa8db2560ebdc26250e7c559e48389139
#EXT-X-TARGETDURATION:12
#EXTINF:11.120000,
http://ab-mts.videocc.net/a0713eea93/18/1512390832000/3/82/c6/73_3/a0713eea93d0d017ace1c26de982c673_3_0.ts?pid=1548059731161X1008771&ts=1548059730000&sign=d45fbe22c7d970a99750939929f27276
#EXTINF:9.960000,
http://ab-mts.videocc.net/a0713eea93/18/1512390832000/3/82/c6/73_3/a0713eea93d0d017ace1c26de982c673_3_1.ts?pid=1548059731161X1008771&ts=1548059730000&sign=d45fbe22c7d970a99750939929f27276
可以看到,视频被分成了很多段。
如果没有 #EXT-X-KEY 或是 EXT-X-KEY:METHOD=NONE,说明视频没有被加密,可以直接用命令下载
ffmpeg -protocol_whitelist "file,http,crypto,tcp" -i a0713eea93d0d017ace1c26de982c67.m3u8 1.ts
如果视频已加密,下面着重讲怎样获取解密的 key
使用 fiddler 网络抓包,找到下载 key 的请求。看 RAW 文本发现是乱码,因为 key 的内容不是可读的字符。从右侧的窗口选择 Inspectors -> HexView, 黑色的部分就是 key 的内容,以16进制显示。
选择黑色的部分,右键 -> save selected bytes 保存成文件,例如名字 a.key。后面解密将要用到。
sublime 打开 m3u8 文件,将 EXT-X-KEY 的 URI 修改成 a.key 的路径,然后执行命令
ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i a0713eea93d0d017ace1c26de982c67.m3u8 1.ts
开始下载视频。