下载腾讯视频 Blob 资源的尝试
立泉不知何时起,发现哔哩哔哩收藏夹里很多视频被下架了,其中一些是因为版权投诉。尊重版权对此类下架无可厚非,只是这让我不再信任视频平台,不知道什么时候它们会以什么理由让我喜欢的东西消失得无影无踪。
尤其爱上昆曲之后,我会搜集很多别人分享的演出片段,这些分享并非随处可见,一旦下架就真的没有了。所以已经形成习惯,看到感兴趣的内容第一个念头就是“下载下来”。
我对视频平台的不信任是和对硬盘可靠性的不信任同时出现的,开始关注到数据安全的重要性。几个月前把收藏的 200GB 资源分类整理后在本地和 OneDrive 各保存一份,真的担心失去这些音视频和文档,因为可以肯定,其中一部分已经不能在互联网上找到了。
回到标题,起因是曾经在腾讯视频下载过一场昆曲演出,最高分辨率 720P 用 IDM 下载成功。内容和画质都很满意,唯一遗憾是右上角的“腾讯视频”水印。我一直反感国内视频平台滥用水印,如果是用户顾及版权自己加的尚且合理,而一个平台把水印强加到用户视频上,展现出的只有“傲慢”。

失效
我有 3 个视频下载软件,You-Get、Downie 和 IDM。You-Get 是跨平台命令行工具,IDM 是 Windows 独占,Downie 则是 Mac 独占,我已经切换到 Mac 所以常用 Downie。
Downie 在功能强大的同时设计得很精致,粘贴 URL 会自动解析下载最高画质的资源,偶尔不能识别还可以在 User-Guided Extraction 模式下手动操作。遗憾的是这次它们三个都失效了,You-Get 和 Windows 虚拟机里的 IDM 能识别到 720P 资源,但前者下载下来是有水印的 15 个分段,后者则是数百个 2M 大小 ts 分段。而 Downie 识别到 720P 下载却是无水印的 480P,在 User-Guided Extraction 模式下则完全找不到资源。
下载时显示 1280x720,实际是 848x480。

明明几个月前就是用 IDM 下载成功,带着疑惑开始搜寻可能的原因。排查一圈大概明白,Web 流行一种 Blob 播放机制,音视频不是我擅长的领域,但知道无论怎么隐藏最终一定会有链接指向真实地址。对于腾讯视频,是要找到隐藏的 M3U8 链接,即视频的分段资源列表(应该就是 IDM 解析到的那数百个分段),再逐个下载、转码合并。支持下载 M3U8 资源的软件有很多,要解决的问题是如何获取到 M3U8 链接。
一些博文提到可以打开浏览器的 Developer Tools,从数千个 URL 中筛选查找。我尝试一会,毕竟不是 Web 开发者,看得眼花缭乱,没找到。
于是搜寻如何以最简单的方式获取 M3U8 链接,从这篇文章看到,已经有针对各个视频平台的 JS 脚本。
// 腾讯视频
javascript:var a=prompt(PLAYER._DownloadMonitor.context.dataset.title,PLAYER._DownloadMonitor.context.dataset.ckc?PLAYER._DownloadMonitor.context.dataset.currentVideoUrl:PLAYER._DownloadMonitor.context.dataset.currentVideoUrl.replace(/:.*qq.com/g,"://defaultts.tc.qq.com/defaultts.tc.qq.com"));
以腾讯视频为例,在视频开始播放后执行这个脚本,通常是创建一个 Bookmark 书签把这段 JS 作为 URL 填进去,点击书签执行。

这个视频的真实 M3U8 链接为:
https://defaultts.tc.qq.com/defaultts.tc.qq.com/A2vuJDIKrfbFxXWF-uFTN8txhLOQnlG_IZu1ZlGTq01o/uwMROfz2r5zAoaQXGdGnC2df64-iUwCiwZmikOBGnwTA3zLD/k6I0wycPsYglZ651b7GgNjdE-hvTEx51OFec5on36F-fjNMPxGKu_UamPARQW40SvWJQ7jbOkrRfj_XgvI27hBVr9g2IWpid2YUcBKUn9xlPmjEAOOhAO8RRj3awkJ4YzVYFWneDhRE0z-tGIxAI-Q0iBGSZ4LgIkHCukOGqF5U/z0562bgb9s4.321003.ts.m3u8\?ver\=4
下载
其实大部分 M3U8 下载器都是对 FFmpeg 的封装,下载分段然后转码合并。
执行ffmpeg -i [url]获取视频流信息,再指定目标音视频编码copy到本地:
# 保存到本地指定位置
ffmpeg -i [url] -c copy -bsf:a aac_adtstoasc ~/Downloads/output.mp4
下载后发现在手机 nPlayer 播放器中会看到明显拼接痕迹,而电脑端却正常,试着用 HandBrake 以原参数重新编码,问题解决。
每次遇到这样的事情都觉得有趣,在一个陌生领域执行陌生操作出现陌生问题,逐个尝试各种可能的解决方法,运气好很快搞定,运气不好只能干着急,期盼“灵光一闪”然后感慨“原来如此”。