云服务很方便, 直到我收藏的视频莫名其妙地被删掉了.
现在都用上了 HTML5 video, 理论上只要能够下载 HTML5 video 就能从大多网站上下载视频了.
所以直接 wget video.src 不就万事大吉了?
实际上 B 站和 youtube 的 video 标签长这样:
<video src="blob:https://www.youtube.com/xxx"></video>
blob URL 是作用域仅在本页面的链接, 它是这样创建的:
var mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);
console.log(video.src) // blob:https://xxxxxxx
这里有更好的介绍 mdn: https://developer.mozilla.org/en-US/docs/Web/API/MediaSource
我们更关心如何下载它.
看起来劫持浏览器请求就能拿到视频数据, 但是实际执行起来, 判断识别组合, 都有难度.
前面代码展示了 blob URL 指向了 mediaSource object. 实际上就是 mediaSource 内包含了视频的数据,
appendBuffer()
方法向 mediaSource 内 feed 数据, 我们是否可以劫持这个方法拿数据?
可行! 为此我还写了一篇博客和相应的包:
https://www.tiaoxingyubolang.com/zh/article/2020-10-09_mediasource
1
kookpua 2020-10-09 07:42:11 +08:00 via iPhone
b 站的客户端不是可以下载视频么
|
2
ipadpro4k 2020-10-09 07:53:01 +08:00 via iPhone
拜膜大佬,写英文博客
|
3
sutking 2020-10-09 08:04:35 +08:00 1
@kookpua #1 B 站客户端下载的视频离开了客户端怎么办?然后,将来换了手机怎么办?再然后,下载的多了,手机空间放不下怎么办?
|
4
iConnect 2020-10-09 08:05:39 +08:00 via Android
|
5
weak 2020-10-09 08:10:45 +08:00 via Android
IDM 解君愁
|
6
windseeker386 2020-10-09 08:15:05 +08:00 via iPhone
b 站 ump 版本下载神器,最高分辨率,自动转 mp4 格式,弹幕同步下载
|
8
monkeyWie 2020-10-09 09:25:32 +08:00
这种实现方式做不到断点下载吧?
|
9
Mikewu 2020-10-09 09:34:49 +08:00 via Android
b 站 api 获取视频源文件 cdn 地址,改下 headers 就能直接下载了
|
10
chuankoog OP |
12
kookpua 2020-10-09 09:48:26 +08:00
|
13
TypeError 2020-10-09 10:25:46 +08:00 via Android
我还是喜欢直接用 YouTube-dl 、youget 这些工具,功能多解析全
|