说一下一般网站的视频下载

栏目: 编程工具 · 发布时间: 5年前

内容简介:三年前发过一篇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。

也可以在常见关键词附近打些断点: loadsuccessdecryptkeydecryptdata

一般解密后的 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 来解密,参考链接:

解密HLS中的AES加密

假设有这样一个 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 应用商店下架了。我把之前安装好的导出了:


以上所述就是小编给大家介绍的《说一下一般网站的视频下载》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python学习手册

Python学习手册

Mark Lutz / 侯靖 / 机械工业出版社 / 2009-8 / 89.00元

《Python学习手册(第3版)》讲述了:Python可移植、功能强大、易于使用,是编写独立应用程序和脚本应用程序的理想选择。无论你是刚接触编程或者刚接触Python,通过学习《Python学习手册(第3版)》,你可以迅速高效地精通核心Python语言基础。读完《Python学习手册(第3版)》,你会对这门语言有足够的了解,从而可以在你所从事的任何应用领域中使用它。 《Python学习手册(......一起来看看 《Python学习手册》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器