完美的 bilibili 上传流程

vicat
发布于 2025-10-19 / 6 阅读
1
0

完美的 bilibili 上传流程

关于我想搞一个完美的 bilibili 视频上传流程。

缘起

在很久很久以前,我只是一个 b 站的重度用户,有着多年b站全勤登录的一点小积累。要追溯到我的第一个视频是十年前我高考结束时录制的 pc 上玩的给他爱5。但是可能因为当时标题和封面没有仔细挑选,导致视频至今未能过审。再后来就是零零散散的上传过很多又短又无趣的视频。直到老头环横空出世的那一天,我才灵光一闪发现我玩游戏的过程没有持续不断地记录。后来就挑上了 bilibili,寻思硬盘反正是给人用的,传了以后我也没损失,于是就开始进行录制+上传。

在开始将自己的游戏过程开始上传了以后,我发觉它给我带来了很多的好处,虽然自己也不曾有多少观看记录。但是可以把自己的游玩过程进行简单的记录,也可以实时和同事们进行分享。

目标

我的目标就是将自己的视频录制下来并传到b站,因为如下原因

  1. 我是资深b站用户,至少十二年的站龄了
  2. 我是单机玩家,会玩好多自己单机游玩的游戏
  3. 既然我都是老b站用户了,那我简单吃一点点b站的硬盘可以吧
  4. 等我以后闲着没事可以看看,偶尔会有那么一点打开老视频看的念想
  5. 可以很方便的分享给同事和朋友观看

问就是低创、自娱自乐、毫无营养。致力于把 b站的硬盘占满,来彰显我是一个合格的b站用户。

最初的流程

在整个过程的最开始我是通过这样的方式来进行录制的:

  1. 使用 OBS 实时录制视频
  2. 导入 Pr 进行简单的剪辑
  3. 将剪辑好的视频批量导出到 media encoder 进行编码
  4. 上传视频到 b站

整个流程是比较正常的,也是比较符合用户习惯的,但是这个流程会有一些缺陷。

1. 关于b站账号的限制

b站对视频有着一系列限制

  1. b站对码率有着自己明确的要求,这就代表着原生视频无法直接上传,至少要进行编码并降低码率才可以
  2. b站对视频大小有限制,没有到达3级电磁力的话单个视频只能上传8g(2025年变为 16g,超过 100 粉丝 32g)
  3. 合集系统实在是污染个人主页,因为单机游戏要录完并保证大小至少会产生 100 多个视频,会大规模污染自己的主页
  4. 分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 服务器 对服务进行开启。

image-20251018230657710

之后点击移动端 app 的加号即可。在成功连接后即可进入录制画面。

多视角

有了obs后,可能就会想要录制除了显示器之外的画面,对于我这种没有摄像头的人来说,就想要借助手机来实现,如果是小米手机的话,就可以使用小米电脑管家的摄像头协同功能,如果不是小米手机的话,这里就推荐使用 DroidCam 来进行手机与电脑的协同,这种多视角的配置才能实现【太鼓达人】百花缭乱(松5星)_太鼓达人 的效果。不过博主确实没有相关需求。

手动分p

在该过程中同样可以一瞥时间,在 40 分钟或者一个半小时的时候点击停止,达到手动分p的效果。

自动化

在整个 obs 的使用过程中,目标当然是减少人力的介入,所以追踪我对 obs 的操作就至关重要,所幸,obs 提供了完善的扩展性,只要在电脑上安装 python3.6 版本,就可以监听 obs 的变化。在这里我定义了一个脚本来监听我录制的启动、停止操作,并配置了视频要上传的目录,及要存储的地址:

image-20251018232048752

这段代码可以看代码仓库中,仓库中是有同款。这里配置的 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

至此,神功已然大成,我已经完成了从录制到上传的一条龙实现,总结下来整个流程就如图所示。希望各位能积极尝试!
flow.drawio


评论