有些通过浏览器插件捕获的视频流是无法播放的,原因是服务器对其进行了加密,本文用于记录自己第一次m3u8解密的过程
m3u8是一种流媒体格式,以文件列表的形式存在,里面记录了版本号、加密方式、文件列表等信息
从某个地址(https://abc.net/xx/xx/,m3u8下载地址是https://abc.net/xx/xx/index.m3u8)捕获的index.m3u8文件内容如下
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,RESOLUTION=720x480
1000kb/hls/index.m3u8
这是一个嵌套的m3u8,对我们有帮助的m3u8可以通过地址https://abc.net/xx/xx/1000kb/hls/index.m3u8下载
这个index.m3u8的内容如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.key"
#EXTINF:1.668333,
6qYsze1019000.ts
#EXTINF:0.834167,
6qYsze1019001.ts
#EXTINF:0.834167,
6qYsze1019002.ts
……
下面还有很多
……
如果没有#EXT-X-KEY这一行,就是没有加密,METHOD表明了加密方式,URI是密匙文件的地址,有的网站会直接写出详细地址,有些则不会,甚至有些会对uri地址进行加密,对uri地址解密的方法百度上有很多
密匙文件一般为16字节,在浏览器中输入URI可能不会直接下载密匙,而是在浏览器中显示密匙
我的密匙文件内容是
5fa1f545ebbba8bd
这里没有给出详细地址,一般来说就是默认为相对路径,因此实际URI为https://abc.net/xx/xx/1000kb/hls/key.key
6qYsze1019xxx.ts是视频流文件的获取地址,实际地址是https://abc.net/xx/xx/1000kb/hls/6qYsze1019xxx.ts
可以通过猫抓这些浏览器视频捕获插件获得这些URI地址,将视频定位到末尾,猫抓的信息更新后会显示最后一个视频流的文件(就是6qYsze1019xxx.ts这些文件里面xxx数字最大的那个),然后可以通过迅雷等软件下载这些视频流
下载后的视频流如果被加密了,是无法直接播放的。通过上面获取的index.m3u8(获取地址是https://abc.net/xx/xx/1000kb/hls/index.m3u8,不是https://abc.net/xx/xx/index.m3u8,下同)和key.key的配合,可以通过使用ffmpeg等软件进行解密并且合并,使用格式工厂也可以合并,但是每次输入文件最大是50个,不方便,有了index.m3u8和视频流,使用ffmpeg可以直接使用一行命令来合并所有视频流文件
解密过程:
1、下载index.m3u8、key.key、视频流
2、首先安装ffmpeg,并且设置好环境变量
3、将index.m3u8、key.key放入视频流所在的目录,将key.key改名为key.m3u8(因为key不是ffmpeg内置格式,使用key.key会报错)
4、在命令行中,进入视频流所在目录,输入以下命令即可完成解密以及合并的工作,最后会在当前目录下生成完整的输出视频out.mp4
ffmpeg -i index.m3u8 out.mp4
当然了,最简单的办法当然是直接从网上获取视频,免去下载视频流的步骤,命令如下
-i后面指定m3u8文件的URI
out.mp4是生成文件名,默认是命令行的当前目录,可以通过绝对路径指定具体位置,如G:\abc\xxx.mp4
ffmpeg -i https://abc.net/xx/xx/1000kb/hls/index.m3u8 out.mp4