在家想下载视频到本地,发现很多视频网站的video
标签的src
指向了
Blob: http(s)://xxx.xxx.xxx/xxx
,直接进这个链接的话会显示链接已禁用。
想法:既然能播放视频,就证明视频到最后一定是被 video 拿到了的.
谷歌一圈后发现了:
1.window.URL.createObjectURL(object)
方法会返回该链接
A File, Blob, or MediaSource object to create an object URL for.( https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL )
2.window.URL.revokeObjectURL(objectURL)
,禁用上面返回的链接
A string representing a object URL that was previously created by calling createObjectURL().( https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL)
1.hook 了window.URL.revokeObjectURL(objectURL)
来忽略禁用请求,结果没用,依旧被禁用。
2.换个方法,直接 hook 二进制流,你缓存多少,我给你复制多少。查了下MediaSource, 他结合上面的createObjectURL(object)
可以分片的方式加载视频,大概就是看多少,就加多少。
其中的音频和视频分别放在两个 sourceBuffer 中,直接 hook 住SourceBuffer.appendBuffer()
就能实现视频流的截取了。再将每个分片以数组的方式保存下来,最后等视频缓存完后
new Blob(video/audio bufferArray)
这样就实现了视频和音频的保存。
3.由于播放的时候,视频和音频分在两个 SourceBuffer 中,所以最后会得到两个文件。又是一番谷歌,有如下命令:
ffmpeg -i video.mp4 -i audio.mp4 -c:v copy -c:a aac -strict experimental output.mp4
可以将其合并为一个视频。
4.想过用 ffmpeg 的 wasm 库来在线合并,最后输出的,发现 ffmpeg-core 初始化时所需要的文件在国内下载不下来导致报错,从而导致适用的用户可能有点少,所以就没加,可能是我使用方法不对,以后有时间可以改改。
5.发现有些网站的视频是在iframe
标签下的,并且加了sandbox
属性,而有该属性的话就会导致最后的下载被拦截,于是,我使用了如下代码来将页面中的所有frame
替换成无sandbox
属性的:
(function (that) {
let removeSandboxInterval = setInterval(() => {
if (that.document.querySelectorAll('iframe')[0] !== undefined) {
that.document.querySelectorAll('iframe').forEach((v, i, a) => {
let ifr = v;
ifr.removeAttribute('sandbox');
const parentElem = that.document.querySelectorAll('iframe')[i].parentElement;
a[i].remove();
parentElem.appendChild(ifr);
});
clearInterval(removeSandboxInterval);
}
}, 1000);
})(window);
于是有了如下油猴脚本:
英文名:Unlimited_downloader
https://greasyfork.org/en/scripts/445751-unlimited-downloader
Ps: 都是谷歌翻译成英文的,因为英文是个通用语言,所以不同地方的人看起来可能要方便点。
原理:直接 hook 媒体二进制流,换句话说就是你能看到,你就能下载,你能缓存多快,你就能下载多快。
使用方法:安装后,打开任意有视频或音频的网站,等视频缓存条加载完后会自动下载下来。
也可以自己手动开 16 倍速加速缓存,控制台输入:document.querySelector('video').playbackRate = x
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.