下载腾讯视频Blob资源的尝试

不知何时起,发现B站收藏夹里的很多视频都被下架了,其中一些是因为版权投诉。尊重版权,对此类下架无可厚非,只是这让我不再信任视频平台,不知道什么时候它们会以什么理由让我喜欢的东西消失得无影无踪。

尤其在我喜欢昆曲之后,会搜集很多别人分享的演出片段,这些分享并非随处可见,一旦下架就真的没有了。所以我已经形成习惯,看到感兴趣的内容第一个念头就是“赶快下载下来”。

我对视频平台的不信任是和对硬盘可靠性的不信任同时出现的,开始关注到数据安全的重要性。几个月前把收藏的200GB资源分类整理后在本地和OneDrive各保存一份,我真的担心失去这些音视频和文档,因为可以肯定,其中一部分已经不可能在互联网上找到了。

回到标题,起因是曾经在腾讯视频下载过一场昆曲演出,最高分辨率720PIDM下载成功。内容和画质都很满意,唯一遗憾是右上角的“腾讯视频”水印。我一直反感国内视频平台滥用水印,如果是用户顾及版权自己加的尚且合理,而一个平台把水印强加到用户视频上,展现出的只有“傲慢”。

单雯 牡丹亭 山坡羊

失效

我有3个视频下载软件,You-GetDownieIDMYou-Get是跨平台命令行工具,IDMWindows独占,Downie则是Mac独占,而我已经切换到Mac,所以常用Downie

Downie在功能强大的同时设计得也很精致,粘贴URL会自动解析下载最高画质的资源,即使偶尔不能识别还可以在User-Guided Extraction模式下手动操作。可遗憾的是这次它们三个都失效了,You-GetWindows虚拟机里的IDM都能识别到720P资源,但前者下载下来是有水印的15个分段,后者则是数百个2Mts分段。而Downie识别到720P下载下来却是无水印的480P,在User-Guided Extraction模式下则完全找不到资源,除了广告…

下载时显示1280x720,实际是848x480

downie

明明几个月前就是用IDM下载成功,带着疑惑开始搜寻可能的原因。排查一圈大概明白,现在流行一种Blob播放机制,音视频并非我擅长的领域,但知道无论怎么隐藏最终一定会有链接指向真实地址。对于腾讯视频的Blob,是要找到隐藏的M3U8链接,即视频的分段资源列表(应该就是IDM解析到的那数百个2M分段),再逐个下载、转码合并。支持下载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填进去,然后点击书签执行。

qq m3u8

这个视频的真实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 的下载参数,这段代码可能不适合其它视频
ffmpeg -i [url] -c copy -bsf:a aac_adtstoasc ~/Downloads/output.mp4

下载后发现在手机播放器上会看到明显的拼接痕迹,而电脑端却正常,试着用HandBrake以原参数重新编码,问题解决。

每次遇到这样的事情都觉得有趣,在一个陌生领域执行陌生操作出现陌生问题,逐个尝试各种可能的解决方法,运气好很快搞定,运气不好只能干着急,期盼“灵光一闪”然后感慨“原来如此”。

arrow_upward