B 站的客户端可以缓存视频到本地,但是只能在 B 站的客户端上播放,其实这背后并没有复杂的加密技术,只是一些基础的混淆视线的做法。

去除这些混淆并不是困难的事情,不关心原理的话可以直接跳到最后,最后提供了 python 脚本用于导出缓存数据为 .mp4 文件。

我们知道这些视频文件被缓存到本地后,数据本身已经存在于本地了。只需要想办法找到这些数据并且以常规的方式显示出来即可。

不同平台默认的 B 站缓存路径如下:

但是不管默认在哪里,可以先在设置里面改到一个自己喜欢的地方。以 Mac 端为例,在左下角“设置”中打开的页面中可以找到“下载设置”,此处可以更改视频缓存目录。

如果缓存了一些视频到本地,打开 B 站缓存视频的文件夹可以看到,里面是很多数字命名的文件夹,每个文件夹中是缓存的一个视频的有关信息,包括一些写了 metadata 的 videoInfo.json,封面图、合集图,以及几个 .m4s 文件。通过对文件内容检查可以发现:

知道了缓存被如何混淆,那么处理这些缓存的思路就很清晰了:

  1. 读取信息:从 videoInfo.json 中提取出 bvidtitle,用来给输出的 MP4 文件直观命名。
  2. 识别流:一个文件夹下会有两个较大的 .m4s。通常体积大的是视频,体积小的是音频。
  3. 文件修复:跳过前 9 个字节,读取剩余的内容并保存。
  4. 封包(Muxing):使用 FFmpeg 将修复后的视频流和音频流合并成一个 MP4 容器。

根据这个思路,很容易写一个 python 脚本批量处理缓存文件夹下的所有视频,写好的脚本放在 github 上。也能从 pypi 直接安装 pip install bv-converter,然后 bv_converter <cache_dir> <export_dir> 即可。

网上有很多导出工具,不是要钱就是有病毒,没必要把简单的事情做的太复杂。