内容简介:三年前发过一篇m3u8 文件是 hls 协议中视频的描述文件,m3u8 的结构,要先去了解下。m3u8 中的视频片段可以进行加密,而加密的方法和 key 文件路径都会记录在 m3u8 文件中。如果加密后没有做特别的处理,其实加密和没加密没有啥区别,都可以直接使用 ffmpeg 来下载、合并:
三年前发过一篇 帖子 ,陆陆续续还有人发邮件问我怎么下载、解密。在这把我所了解的说一下吧。现在大多网站视频播放都是使用 hls 协议,主要讲下该协议视频的下载、解密。
m3u8 文件是 hls 协议中视频的描述文件,m3u8 的结构,要先去了解下。
m3u8 中的视频片段可以进行加密,而加密的方法和 key 文件路径都会记录在 m3u8 文件中。如果加密后没有做特别的处理,其实加密和没加密没有啥区别,都可以直接使用 ffmpeg 来下载、合并:
ffmpeg -allowed_extensions ALL -i video.m3u8 -c copy output.mp4
很多播放器软件可以直接播放 m3u8 链接。
常见的做法是,对视频片段加密后,还会对 key 的获取进行限制,来达到加密的效果。例如,对 key 也加密一遍。但浏览器终究要播放视频,还是会在浏览器端解密的,所以我们还是可以找到 key 的解密方法的,只不过是难易的问题。
可以根据 xhr 来 debug,找关键位置。或者 ctrl
+ shift
+ f
搜相关 url,找关键位置。一般是找到播放器代码所在文件,然后一步步打断点 debug。
也可以在常见关键词附近打些断点: loadsuccess
、 decryptkey
、 decryptdata
。
一般解密后的 key 都是 16 字节的,前端中会用 Uint8Array 来存储,长度为16。
Uint8Array 对象转存文件,浏览器端可以:
function saveU8a(arr) { const u8a = new Uint8Array(arr); const blob = new Blob([u8a]); const url = URL.createObjectURL(blob); const aObj = document.createElement('a'); aObj.href = url; aObj.download = 'video.key'; aObj.click(); } // [73, 101, 50, 100, 87, 103, 89, 99, 116, 86, 120, 88, 80, 48, 121, 110] 为需要转存为文件的 Uint8Array 对象的数组 saveU8a([73, 101, 50, 100, 87, 103, 89, 99, 116, 86, 120, 88, 80, 48, 121, 110]);
node.js 端可以:
function saveU8a(arr) { const u8a = new Uint8Array(arr); fs.writeFile('./video.key', u8a, () => { console.log('done'); }); } // [73, 101, 50, 100, 87, 103, 89, 99, 116, 86, 120, 88, 80, 48, 121, 110] 为需要转存为文件的 Uint8Array 对象的数组 saveU8a([73, 101, 50, 100, 87, 103, 89, 99, 116, 86, 120, 88, 80, 48, 121, 110]);
导出了真正 key 后,我们需要根据实际调整 m3u8 中 key 的路径,可以使用相对路径,如:
#EXT-X-KEY:METHOD=AES-128,URI="./video.key",IV=0xe94125cf7e71fd4b98e035bdfe61f6bd
如果路径都没问题,可以用前面的FFmpeg命令来读取本地的 m3u8 文件并处理。对于播放器,貌似还是需要一个链接才能播放,可以随便启动个本地 server 来为播放器提供播放链接。
延伸
openssl 解密 ts 文件
除了使用 FFmpeg 来解密已加密的 ts 文件,还可以 openssl
来解密,参考链接:
假设有这样一个 m3u8 文件,对第二个 ts 文件 002.ts
解密:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:5 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHOD=AES-128,URI="video.key" #EXTINF:5.000000, 001.ts #EXTINF:5.000000, 002.ts #EXTINF:5.000000, 003.ts #EXT-X-ENDLIST
1.加载并处理 key :
strkey=$(hexdump -v -e '16/1 "%02x"' './video.key')
2.获得 iv 。
例子中没有 IV
值,所以,对每个ts文件从0开始按顺序编号,我们要解密第二个 ts 文件,所以,编号为 1。然后,获取 iv:
iv=$(printf '%032x' 1)
如果 #EXT-X-KEY
中含有 IV
值,如:
#EXT-X-KEY:METHOD=AES-128,URI="./video.key",IV=0xe94125cf7e71fd4b98e035bdfe61f6bd
去掉前面的 0x
即可:
iv='e94125cf7e71fd4b98e035bdfe61f6bd'
3.解密 ts 文件:
openssl aes-128-cbc -d -in 002.ts -out 002_decryptd.ts -nosalt -iv $iv -K $strkey
如果不报 bad decrypt
之类的 error,就代表解密成功了。
利用 aria2c 下载 m3u8 中的所有 ts 文件
aria2c -i video.m3u8
工具
Stream Recorder - download HLS as MP4
Chrome 浏览器的扩展,用过最强大的视频下载扩展了。普通的 hls 视频可以轻松检测到并下载,对于那些特殊处理过的(例如 key 被加密了的) ,可以使用录制模式来下载。可能也正因为太强大了,所以被从 Chrome 应用商店下架了。我把之前安装好的导出了:
- 重新打包的 crx 文件。由于 Chrome 不允许安装非 Chrome 应用商店的扩展,所以不适用官方版的Chrome
https://www.lanzous.com/i48m7wd - 导出的源文件。打开开发者模式,然后加载已解压扩展的方式来运行,适合官方 Chrome
https://www.lanzous.com/i48lzkd
以上所述就是小编给大家介绍的《说一下一般网站的视频下载》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 手把手教你写 Pornhub 视频下载 Chrome 插件
- 批量下载 B 站视频
- BiliDuang 2.1.5 发布,Bilibili 视频下载 C# GUI 版
- youtube-dl 2021 新版本发布,视频下载命令行工具
- youtube-dl 2021.01.08 发布,视频下载命令行工具
- youtube-dl 2021.01.16 发布,视频下载命令行工具
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。