弄啥咧?
B 站收藏夹里的视频一点一点 404 了,索性就把所有收藏里还存活的视频都使用 UWP 客户端下载下来了,大概 400 多 GB。
— 502.li (@muzi_ii) January 13, 2020
为了将 UWP 客户端下载的分段 .flv,写了个 shell 脚本来转码合并为 .mp4。
目前处理了 100 多GB 的 .flv 文件没啥大碍
需要的拿去https://t.co/GX4FsswcfC pic.twitter.com/LG37IGrMdI
好很久没上小破站了,翻了一下自己的收藏夹,我咧个去,将近三分之一的视频都 404 了……,存活的不知道会不会被拉清单。索性就把自己收藏的视频都下载下来,永久保存在自己的硬盘上,咱也不用担心删帖封号了。其中收藏的视频绝大多数都是纪录片和科普视频,在此还是推荐一下[纪录片之家字幕组],中英双语是英语学习的好材料。尤其是走进工厂
系列,基本上每次都会追着看完😂。
另外把这些视频下载下来就不用担心哪天这些优秀的 UP 炸号了,这么宝贵的资源就飞灰湮灭了。所以,自己收藏的视频还是第一时间下载下来为好,另外平时观看的时候也方便。
我是通过 Windows 应用商店里的 哔哩哔哩动画 下载的,事实证明,这玩意下载起来最稳定,我房东家 100MBps 的带宽一直跑满,一天多的时间下载了将近 400GB 的视频。但下载的这些视频有的被分段存储了,而且格式都是 .flv 。然后就想着如何合并这些 flv 文件并转码为 mp4 格式。
劝退三要素😂
- 需要在 Linux 命令行下操作,任何 Linux 发行版或者 Windows Subsystem for Linux,推荐 WSL
- 需要在 Linux 环境下安装
ffmpeg
和jq
命令 - 需要 UWP 哔哩哔哩动画客户端下载和缓存视频文件
咋弄
分析
使用哔哩哔哩动画客户端下载下来的视频,每个视频有一 P 或者多 P ,每一 P 分别存放在从 1 开始正整数命名的文件夹内。每个 P 有的被分割成了若干个 flv 文件,有的是单个 flv 文件。在每个 P 的目录下分别有以下文件.
目录结构
1 | - .flv # 视频文件,有一个或多个 |
多 P 的情况下
1 | ╭─debian@debian /mnt/d/Downloads/bilibili/29656570 |
info 文件
这个 .info 文件时是以视频 av 号命名的(老司机们不要误以为是番号😂),是压缩过的 json 格式,在 Linux 命令行下可以使用 jq 命令来格式化压缩过的 json 文件
1 | { |
我们需要在这个 info 文件中提取几个关键字段来重命合并转码后的 mp4 文件,为了方便起见我们选择 Title
、PartName
、 CreateDate
这三个字段来重命名转码合并后的视频文件。如果视频是单 P 的话 PartName
的值为 null
。在 shell 中获取这三个值也比较简单。在此用 tr
命令去除掉不能当作文件名的特殊字符。
- Title
1 | # 使用 sed 和 tr 去除不能当作文件名的特殊字符 |
- PartName
1 | part_name=$(jq ".PartName" *.info | tr -d "[:punct:]\040\011\012\015") |
- CreateDate
1 | upload_time=$(grep -Eo "20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]" *.info) |
flv 合并
合并 flv 视频文件使用 ffmpeg 工具很简单就能完成,debian/ubuntu 的下直接 apt update && apt install ffmpeg -y
一把梭就行啦,其他发行使用各自的包管理器安装即可
1 | # 如果执行环境没有安装 jq 命令的话需要安装上哦 |
合并多个 flv 文件
使用 ffmpeg 合并文件需要准备一个文本文件,里面记录类似一下的格式:
1 | file '/path/1.flv' |
而我们在 shell 脚本中可以通过 ls *.flv > ff.txt;sed -i ‘s/^/file /g’ ff.txt
来生成该文件
脚本
我放在了 GitHub 上,mbcf 方便维护和问题反馈
1 |
|
把 UWP 哔哩哔哩动画客户端或者 Android 客户端下载缓存视频的目录拷贝到 PC 工作目录下(我的环境是 Windows 10 WSL GNU/Debian
),然后创建该脚本。接着安装好 ffmpeg 和 jq 这两个工具。然后在命令行下执行这个脚本就可以了。合并转码后的 mp4 文件都放在了脚本执行目录下的 mp4 文件夹中。在此一定要将脚本放在正确的目录下执行。
1 | ╭─debian@debian /mnt/d/Downloads/bilibili |
效果
合并转码的速度主要取决于磁盘性能,我放在 5200RPM 的机械硬盘下转码合并 110 多 GB 的 flv 文件,耗时 1 个多小时,放在 NVME 的固态硬盘下十几分钟就转换完了。
- 截取一小部分😂
1 | 2016-08-06_【木鱼微剧场】《帝国的毁灭》万恶之源.mp4 |