下载腾讯视频Blob资源的尝试
立泉不知何时起,发现B站收藏夹里的很多视频都被下架了,其中一些是因为版权投诉。尊重版权,对此类下架无可厚非,只是这让我不再信任视频平台,不知道什么时候它们会以什么理由让我喜欢的东西消失得无影无踪。
尤其在我喜欢昆曲之后,会搜集很多别人分享的演出片段,这些分享并非随处可见,一旦下架就真的没有了。所以我已经形成习惯,看到感兴趣的内容第一个念头就是“赶快下载下来”。
我对视频平台的不信任是和对硬盘可靠性的不信任同时出现的,开始关注到数据安全的重要性。几个月前把收藏的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个分段,后者则是数百个2Mts
分段。而Downie
识别到720P
下载下来却是无水印的480P
,在User-Guided Extraction
模式下则完全找不到资源,除了广告…
下载时显示1280x720
,实际是848x480
。
明明几个月前就是用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
填进去,然后点击书签执行。
这个视频的真实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
以原参数重新编码,问题解决。
每次遇到这样的事情都觉得有趣,在一个陌生领域执行陌生操作出现陌生问题,逐个尝试各种可能的解决方法,运气好很快搞定,运气不好只能干着急,期盼“灵光一闪”然后感慨“原来如此”。