如何下载视频资源以 blob:http 开头的资源
Category(分类): Other Status: 已读
原文:如何下载视频资源以blob:http开头的资源(博客园,多出处合集文章)。 本文为整理版本:保留 blob 原理与 m3u8/ts 下载合并的完整技术方案。原文后半部分涉及"免费观看 VIP 视频"的解析操作,因版权风险本文略去,只保留技术原理层面的一句话说明。
一、问题场景
想下载某视频资源(如知乎视频),发现视频链接是这样的:
blob:https://v.vzuu.com/b6146956-6e52-406d-8909-f3f1b81ae461
blob:https 是什么牛逼的新协议吗?
二、结论:blob 不是协议
blob:https 并不是一种协议,而是 HTML5 中 blob 对象赋给 video 标签后生成的一串标记,blob 对象包含的数据由浏览器内部解析——服务端页面里并没有这个地址,它是浏览器执行 JS(URL.createObjectURL)后生成的。
详细原理见本分类《为什么视频网站的视频链接地址是blob?》:大多数视频站的 src 其实是 URL.createObjectURL(MediaSource),配合 MSE 边下边播。
三、真实地址在哪
资源的真实下载链接可在 Chrome 调试模式的 Network 面板中找到。
但有一种资源比较特殊——m3u8 格式:视频被分解成很多 ts 小片段,m3u8 链接下载到的是一个包含多个 ts 视频地址的索引集合。这样做的目的:
- 方便切换分辨率(多个 ts 支持无缝流畅播放,MP4 不行);
- 客观上起到了防下载的作用。
四、方案一:ffmpeg 直接下载(推荐)
拿到 m3u8 地址后一条命令搞定(拉流地址和输出地址用英文引号括起来):
ffmpeg -i "https://xxxxxx.m3u8" "out.mp4"
# 更完整的转封装写法
ffmpeg -i "http://xxx.m3u8" -vcodec copy -acodec copy -absf aac_adtstoasc 下载的视频名称.mp4
ffmpeg 会自动拉取索引里的所有 ts 分片、按序合并并转封装为 mp4。
五、方案二:手动下载 ts 分片再合并
不想装 ffmpeg 时可以纯手动(Chrome + 记事本):
- 下载 m3u8 文件:视频页面按 F12 打开调试工具 → Network → 刷新页面 → 找到 m3u8 请求 → 右击 → Open in new tab → 下载到本地;
- 补齐相对路径:有的 m3u8 里 ts 的 URL 是相对路径,在每个 ts URL 前面加上域名前缀(记事本替换功能即可);
- 去掉索引信息:删除
#EXTINF:~这类行,只保留 ts 文件的绝对路径 URL(可用正则批量删除); - 批量下载:把所有 ts 的 URL 复制下来,用 Chrome 插件 Chrono 批量下载;
- 统一文件名序号位数:把 ts 全部放到同一文件夹,重命名使序号位数一致(1.ts → 001.ts,2.ts → 002.ts……),否则 copy /b 合并时顺序会乱;
- 合并:cmd 执行
copy /b D:\Downloads\*.ts D:\Downloads\new.ts
六、方案三:专用工具
- 浏览器插件 HDS/HLS Video Downloader:安装后刷新页面,自动嗅探页面中可下载的 m3u8 视频地址,点击 download 一键下载(最终生成 ts 格式,同样可播放);
- m3u8 downloader(blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html):网页工具,粘上链接就可以下载,自带帮助文档并提供不能下载、跨域等问题的解决方案;
- 无差别视频提取工具:m3u8 downloader 的"胞弟",直接粘贴页面地址即可(SegmentFault 有原创文章介绍)。
七、方案四:you-get 命令行下载(站内视频通用)
you-get 是基于 Python 的下载工具,pip3 install you-get 安装(Windows 也有打包版),支持国内外大多数视频网站:YouTube、Twitter、网易云音乐、bilibili、爱奇艺、优酷、腾讯视频等。
查看视频属性(-i):
λ you-get -i https://www.bilibili.com/video/av36043614
site: Bilibili
title: 一个MV 周杰伦《晴天》
streams: # Available quality and codecs
[ DASH ] ____________________________________
- format: dash-flv720
container: mp4
quality: 高清 720P
size: 80.8 MiB (84735780 bytes)
# download-with: you-get --format=dash-flv720 [URL]
...
按清晰度下载:
λ you-get --format=flv720 https://www.bilibili.com/video/av36043614
Downloading 一个MV 周杰伦《晴天》.flv ... 100% ( 81.0/ 81.0MB) 8 MB/s
Downloading 一个MV 周杰伦《晴天》.cmt.xml ...
连弹幕(cmt.xml)都会一并下载好。
八、其他思路
- 审查 JS 资源:Network 中搜索 m3u8 找不到时,可审查页面加载的 JS 资源,有些站点能直接从代码里找到 flv 格式的真实视频地址;
- 爬虫场景:用爬虫抓取时发现视频链接打开 404,同样是 blob 形式——处理思路相同(找到 m3u8/flv 真实地址再下载);
- 原文还提到用油猴脚本 + 解析网站"免费观看 VIP 视频"的做法,涉及版权问题,此处不做展开——技术原理上仍是"拦截真实分片地址 → 代理播放"同一套机制。
总结:下载方法速查
| 场景 | 方法 |
|---|---|
| 已拿到 m3u8 地址 | ffmpeg -i "xxx.m3u8" out.mp4(最省事) |
| 不想装 ffmpeg | 手动:下载 m3u8 → 补路径 → 批量下 ts → 统一序号 → copy /b 合并 |
| 想一键操作 | HDS/HLS Video Downloader 插件、m3u8 downloader 网页工具 |
| 站内视频(B 站等) | you-get -i <url> 查清晰度 → you-get --format=<fmt> <url> 下载 |
整理者注
理解了《为什么视频网站的视频链接地址是blob?》就知道:blob URL 本身无法(也无意义)下载,要下载的是它背后 MediaSource 喂进去的分片(m3u8 索引的 ts/m4s)。本文所有方法本质上都是在找真实分片地址,然后下载合并。请注意尊重版权,下载内容仅供个人学习研究。