关于我想搞一个完美的 bilibili
视频上传流程。
缘起
在很久很久以前,我只是一个 b 站的重度用户,有着多年b站全勤登录的一点小积累。要追溯到我的第一个视频是十年前我高考结束时录制的 pc 上玩的给他爱5。但是可能因为当时标题和封面没有仔细挑选,导致视频至今未能过审。再后来就是零零散散的上传过很多又短又无趣的视频。直到老头环横空出世的那一天,我才灵光一闪发现我玩游戏的过程没有持续不断地记录。后来就挑上了 bilibili
,寻思硬盘反正是给人用的,传了以后我也没损失,于是就开始进行录制+上传。
在开始将自己的游戏过程开始上传了以后,我发觉它给我带来了很多的好处,虽然自己也不曾有多少观看记录。但是可以把自己的游玩过程进行简单的记录,也可以实时和同事们进行分享。
目标
我的目标就是将自己的视频录制下来并传到b站,因为如下原因
- 我是资深b站用户,至少十二年的站龄了
- 我是单机玩家,会玩好多自己单机游玩的游戏
- 既然我都是老b站用户了,那我简单吃一点点b站的硬盘可以吧
- 等我以后闲着没事可以看看,偶尔会有那么一点打开老视频看的念想
- 可以很方便的分享给同事和朋友观看
问就是低创、自娱自乐、毫无营养。致力于把 b站的硬盘占满,来彰显我是一个合格的b站用户。
最初的流程
在整个过程的最开始我是通过这样的方式来进行录制的:
- 使用 OBS 实时录制视频
- 导入 Pr 进行简单的剪辑
- 将剪辑好的视频批量导出到
media encoder
进行编码 - 上传视频到 b站
整个流程是比较正常的,也是比较符合用户习惯的,但是这个流程会有一些缺陷。
1. 关于b站账号的限制
b站对视频有着一系列限制
- b站对码率有着自己明确的要求,这就代表着原生视频无法直接上传,至少要进行编码并降低码率才可以
- b站对视频大小有限制,没有到达3级电磁力的话单个视频只能上传8g(2025年变为 16g,超过 100 粉丝 32g)
- 合集系统实在是污染个人主页,因为单机游戏要录完并保证大小至少会产生 100 多个视频,会大规模污染自己的主页
- 分p视频没法在网页投稿,只能通过小丸工具箱上传(2025年恢复分p的配置了)
仅存的良心:在某个时间段之后,非大会员可以查看自己投稿视频的任意分辨率了,不用因为不是大会员看不了自己4k的视频了。
2. 整个渲染流程的限制
受限于b站对视频的限制,所以必须在上传前对视频进行预处理。必须保证单个视频不大于 8g,根据我的测试,意味着一个视频在码率拉满的情况下只能有最多50分钟(2025年放宽到16g后大约1个半小时)。
剪辑很麻烦,需要用 Pr 一个一个剪辑,并用 Media Encoder 一个一个进行编码,而且剪辑渲染十分的耗费性能,并且在剪辑完成后需要人工介入并执行上传流程。并且我也不会对视频进行深度处理,简单记录自己的游玩过程即可。
这让我想要找到一套完美的 bilibili 录制+上传一条龙的服务。
完美的方案
于是后来在我不断探索的过程中,我找寻了很多工具,并做出了完整的方案并开源。仓库地址在这里 vicat47/perfect_bili_record_upload
1. 录制
首先是录制的过程,依然使用 obs 进行录制,但是在录制这个场景下我做了些小手段。
高可用
在我使用 obs 时,会有偶发性的视频没有完整录制的情况,于是我引入了名为 StreamCtrl
的安卓软件,来对画面进行实时的监看,防止因各种问题导致视频提前中断,同时也可以在手机端实时控制 obs 的录制、暂停、保存实时片段。
要使用这俩工具进行协作的话需要开启 obs 的 websocket
配置。可以在工具 -> websocket服务器设置 -> 开启 websocket 服务器
对服务进行开启。
之后点击移动端 app 的加号即可。在成功连接后即可进入录制画面。
多视角
有了obs后,可能就会想要录制除了显示器之外的画面,对于我这种没有摄像头的人来说,就想要借助手机来实现,如果是小米手机的话,就可以使用小米电脑管家的摄像头协同功能,如果不是小米手机的话,这里就推荐使用 DroidCam
来进行手机与电脑的协同,这种多视角的配置才能实现【太鼓达人】百花缭乱(松5星)_太鼓达人 的效果。不过博主确实没有相关需求。
手动分p
在该过程中同样可以一瞥时间,在 40 分钟或者一个半小时的时候点击停止,达到手动分p的效果。
自动化
在整个 obs 的使用过程中,目标当然是减少人力的介入,所以追踪我对 obs 的操作就至关重要,所幸,obs 提供了完善的扩展性,只要在电脑上安装 python3.6
版本,就可以监听 obs
的变化。在这里我定义了一个脚本来监听我录制的启动、停止操作,并配置了视频要上传的目录,及要存储的地址:
这段代码可以看代码仓库中,仓库中是有同款。这里配置的 bvid 就是要追加的 bvid,redis 是一个中间件,用来做多个机器解耦的。
关于解耦:我的设想是,录制,渲染,上传并不在同一台机器上,所以引入了 redis 这个中间件用于记录相关的状态。这样若家中有24小时开机的机器的话可以将上传任务分给它。
2. 渲染
参考文献:2024年B站码率参数上限 - 哔哩哔哩,草履虫也能看懂的OBS录制设置概述与推荐。 - 知乎
渲染对于我这种简单需求而言,自然不需要使用 pr 做剪辑调整,更不需要使用 ae 来进行特效调整。所以我这里选择了纯命令行的,久经实践的 ffmpeg
。
在我的代码仓库中也有我对 ffmpeg
命令的一些实践。同时我也撰写了相关 powershell
脚本来渲染录制好的视频。即perfect_bili_record_upload/win_scripts/render_video.ps1 at master · vicat47/perfect_bili_record_upload,在这个脚本中,只要obs向渲染队列中追加了对应视频,脚本就会从队列中取出渲染。并在渲染完成后立即放置到上传队列中。
这样就实现了录制和渲染的解耦,渲染和上传的解耦。
渲染命令
这里使用了 b站伪4k的投稿命令。在保证视频码率的同时,不上传过大文件。
ffmpeg -i $json.filename \
-c:v h264_nvenc \
-profile:v main \
-b:v 20000k \
-s 2844x1600 \
-c:a aac \
-b:a 320k \
-x264opts crf=12 \
-maxrate:v 30000k \
-bufsize 30000k \
-pix_fmt yuv420p \
"R:\OBS\输出\$($new_value)"
可以看到参数基本是如上
参数 | 值 | 描述 |
---|---|---|
-i |
文件路径 | 输入文件,需要文件全路径/相对路径 |
-c:v |
h264_nvenc |
视频编码器,nvenc 代表使用显卡渲染,快但是效果稍微差一丢丢 |
-profile:v |
main |
该视频要满足的视频基准,main 代表主要标准 |
-b:v |
20000k |
视频比特率,决定了视频清晰度 |
-s |
2844x1600 |
视频分辨率,这个分辨率是伪 4k 的关键,因为 2k分辨率是 2560×1440 ,所以比它高一点点的分辨率就可以作为 4k 视频,可以获得更高的视频码率。 |
-c:a |
aac |
音频编码格式 |
-b:a |
320k |
音频的码率 |
-x264opts |
crf=12 |
x264 的配置项,crf 恒定码率系数录制 |
-maxrate:v |
30000k |
视频最大码率 |
-bufsize |
30000k |
缓冲大小 |
-pix_fmt |
yuv420p |
色彩空间配置 |
基本参数就这些,若想要扩展可自行选择
3. 上传
具体的上传以前只能使用工具/页面手动上传。后来我一直在寻找能够自动上传的工具,最后发现了 biliup/biliup-rs: 命令行投稿(B站)和视频下载工具,提供多种登录方式,支持多p。,使用该工具可以快速的完成视频上传功能。我同样提供了命令行工具。perfect_bili_record_upload/win_scripts/upload_video.ps1 at master · vicat47/perfect_bili_record_upload
并且我在发现这个工程的时候它才刚起步,对于我的要求–直接追加分p 并未实现,于是我花了一点点精力实现了对应功能,如何对已上传的视频追加分P · Issue #8 · biliup/biliup-rs。
至此,神功已然大成,我已经完成了从录制到上传的一条龙实现,总结下来整个流程就如图所示。希望各位能积极尝试!