高级弹幕渲染——Baka 如何在 mpv 之上叠加弹幕层
弹幕渲染架构
Baka 的弹幕渲染独立于视频渲染:
┌──────────────────────────────────┐
│ 弹幕渲染层(Flutter 绘制) │ ← 弹幕、自定义 UI
├──────────────────────────────────┤
│ 字幕渲染层(libass) │ ← ASS/SRT 字幕
├──────────────────────────────────┤
│ 视频渲染层(mpv + Anime4K) │ ← 视频画面
└──────────────────────────────────┘
弹幕层是最上层,这意味着:
- 弹幕总是在字幕之上(可以在弹幕设置中调整层序)
- 弹幕不影响视频渲染管线(Anime4K 处理的是视频层)
- 可以独立调整弹幕的透明度、密度和位置
弹幕类型
Baka 支持以下弹幕类型(来自 BGM 弹幕库的数据):
| 类型 | 说明 | 典型用途 |
|---|---|---|
| 滚动弹幕 | 从右往左滚动穿过画面 | 最常见的弹幕形式 |
| 静止弹幕 | 固定在画面中央或顶部/底部 | 重要提示、经典台词 |
| 高级弹幕 | 带坐标、特效、图片等 | 复杂特效弹幕(较少) |
弹幕样式自定义
在弹幕设置中可以调整:
基础样式:
- 字体:默认系统字体,可以切换为中文字体
- 字号:小 / 中 / 大 / 自定义像素值
- 颜色:白色(默认)、红色、绿色、蓝色等预设
- 透明度:0%(不透明)~ 100%(完全透明)
滚动参数:
- 滚动速度:慢 / 正常 / 快 / 自定义(像素/秒)
- 显示区域:全屏 / 顶部 1/4 / 底部 1/4 / 指定高度范围
- 重叠处理:密集弹幕是否自动避让(减少重叠)
弹幕性能优化
弹幕量较大时(一集数千条以上),渲染性能可能成为瓶颈。Baka 的优化手段:
- 离屏缓存:弹幕先绘制到离屏画布,再整体合成到主画面
- 批量绘制:同一帧的多条弹幕批量提交给渲染器
- 不可见剔除:画面外的弹幕不进行绘制
- 密度降采样:默认只渲染 50~70% 的弹幕(可调)
- 限制同屏弹幕数:超过上限后丢弃新弹幕
弹幕与 Anime4K 的配合
弹幕层独立于视频层,这带来一个问题:弹幕是否应该也被 Anime4K 增强?
Baka 的处理方式是:
- 视频层先经过 Anime4K 增强
- 然后字幕层叠加
- 最后弹幕层叠加(原始分辨率,不被增强)
这样做的好处:
- 弹幕文字保持清晰(AI 增强反而可能让文字变模糊)
- 性能更好(只增强视频层)
- 弹幕和增强后视频的相对位置正确
弹幕截图
Baka 截图功能(Ctrl + Shift + S)默认包含弹幕层。如果想要纯视频截图,可以在截图时临时隐藏弹幕(快捷键 F)。