前言

如果你经常需要录制直播,比如 B 站、抖音、斗鱼、虎牙、AcFun 等平台,就会遇到一个很现实的问题:直播什么时候开始不确定,人工守着太麻烦;不同平台直播流地址获取方式不同;录制过程容易断流、分段、失败重试;录完之后还可能要转码、修复、提取封面、上传云盘、推送通知。
Bililive-go 就是为了解决这类问题而设计的一个开源直播录制系统。它不是一个简单的下载脚本,而是一个完整的后台录制服务,包含多平台直播间监听、自动录制、Web 管理、配置热更新、通知推送、Prometheus 监控、Grafana 面板、SQLite 状态存储、录制后处理 Pipeline 等能力。
一、项目定位
Bililive-go 的核心定位可以概括为一句话:
一个用 Go 编写的、多平台、可配置、可 Web 管理、支持自动监听和后处理的直播录制系统。
它解决的不是"下载一个直播流"这么简单的问题,而是完整覆盖了直播录制生命周期:
text
直播间配置 → 平台适配 → 周期监听 → 开播检测 → 获取真实直播流 → 启动录制器 → 写入本地文件 → 弹幕录制 → 分段/重试/修复 → 后处理 Pipeline → 通知/上传/Web 展示
二、系统架构总览

从源码结构看,Bililive-go 可以拆成五层:
| 层级 | 主要模块 | 作用 |
|---|---|---|
| 用户入口层 | Web 管理后台、REST API、SSE、文件浏览 | 提供可视化管理与实时状态查看 |
| 业务调度层 | 配置中心、事件分发器、ListenerManager、RecorderManager | 负责监听、调度、状态转换 |
| 平台适配层 | Bilibili、Douyin、Douyu、Huya、AcFun、SOOP 等 | 屏蔽不同直播平台差异 |
| 录制执行层 | FFmpeg、Native FLV Parser、BililiveRecorder、弹幕录制 | 负责真实流下载和文件写入 |
| 后处理与观测层 | Pipeline、通知服务、Prometheus、Grafana、SQLite | 负责录后处理、监控、通知与持久化 |
三、技术栈概览
Bililive-go 的后端主体是 Go。项目依赖里可以看到 Web 路由、WebSocket、Prometheus、SQLite、YAML、Sentry、系统资源统计、媒体相关库等。
| 能力 | 代表组件 | 作用 |
|---|---|---|
| Web 服务 | gorilla/mux | 提供 Web 管理后台和 API |
| 实时推送 | SSE / WebSocket | 推送直播状态、日志、录制进度 |
| 指标监控 | Prometheus | 暴露 /metrics 给 Grafana |
| 配置解析 | YAML | 读取和写入 config.yml |
| 状态存储 | SQLite | 直播状态、Pipeline 任务等持久化 |
| 媒体录制 | FFmpeg / Native FLV | 录制直播流 |
| 错误监控 | Sentry | 捕获运行异常 |
| 后处理 | Pipeline | 转码、修复、封面、上传、自定义命令 |
四、核心模块职责

live:平台适配核心
live 包负责抽象不同直播平台。它定义统一 Live 接口,平台实现只需要关心如何获取直播间信息、如何判断开播状态、如何获取真实直播流地址、如何处理 Cookie 和清晰度。
listeners:直播状态监听器
listeners 包负责周期性检测直播间状态,主要触发三类事件:LiveStart、LiveEnd、RoomNameChanged。
recorders:录制器管理
recorders 包负责创建、启动、停止、重启录制器。它监听 LiveStart 后自动开始录制,监听 LiveEnd 后停止录制。
pipeline:录后处理
Pipeline 是录制完成后的任务编排系统,可以做修复 FLV、转 MP4、提取封面、烧录字幕、上传云盘、执行自定义命令。
servers:Web API 和前端服务
servers 包负责配置管理 API、直播间管理 API、文件管理 API、Cookie 管理、B 站扫码登录、SSE 实时推送、更新 API、Prometheus 指标等。
五、录制生命周期流程

完整链路如下:
text
config.yml
↓
读取配置
↓
创建 Live 对象
↓
WrappedLive 包装缓存、限流、请求调度
↓
Listener 周期检测直播状态
↓
检测到开播
↓
派发 LiveStart 事件
↓
RecorderManager 创建 Recorder
↓
Recorder 获取直播流地址
↓
选择清晰度 / 格式 / CDN
↓
启动 FFmpeg / Native FLV / BililiveRecorder
↓
写入录制文件
↓
可选录制弹幕
↓
录制结束
↓
Pipeline 后处理
↓
通知与 Web 展示
六、多平台适配设计
Bililive-go 之所以能支持多个平台,核心是 Live 接口和 Builder 注册机制。
text
用户输入直播间 URL
↓
解析 host
↓
根据 host 找到平台 Builder
↓
创建具体平台 Live
↓
统一交给 Listener 和 Recorder
这种设计很适合多平台录制工具,因为新增平台时,不需要改录制器主流程,只要实现平台自己的信息获取和流地址解析即可。
七、WrappedLive:缓存、限流和请求合并
直播平台通常对接口访问频率比较敏感。如果一个系统里有几十个甚至上百个直播间,同时请求同一个平台接口,很容易触发风控。
Bililive-go 在原始 Live 外面包了一层 WrappedLive,主要解决三个问题:
- 缓存直播间信息:请求失败时还能保留上一次成功的主播名、房间名等信息。
- 平台访问限流:不同平台可以设置最小访问间隔,避免请求过于密集。
- 请求合并:多个模块同时等待直播间信息时,可以共享一次真实请求结果。
八、事件驱动架构
Bililive-go 的监听器和录制器不是强耦合关系,而是通过事件系统协作。
text
Listener 检测到开播
↓
EventDispatcher 派发 LiveStart
↓
RecorderManager 收到事件
↓
创建并启动 Recorder
这种事件驱动设计让 Listener、Recorder、通知、状态持久化、Web 推送都可以解耦扩展。
九、录制器如何选择下载器?
Bililive-go 支持多种下载器策略:
| 下载器 | 特点 |
|---|---|
| FFmpeg | 通用性强,支持 FLV、HLS 等多种格式 |
| Native FLV Parser | 内置 FLV 解析器,适合 FLV 流 |
| BililiveRecorder | 外部录播姬 CLI,适合特定 FLV 场景 |
它还有回退机制:BililiveRecorder 不可用时回退到 FFmpeg,Native 不支持非 FLV 时也回退到 FFmpeg。
十、流选择与清晰度偏好
录制时,系统会先获取平台返回的多个可用流,例如原画、1080p、720p、FLV、HLS、H.264、H.265、不同 CDN。然后根据配置中的 stream_preference 选择最匹配的流。
如果没有配置偏好,则默认使用第一个可用流;如果配置了偏好但没有匹配成功,也会回退到第一个可用流,避免录制直接失败。
十一、FLV / HLS 探测
为了让 Web 页面展示真实流信息,Bililive-go 会对直播流进行探测。
| 流类型 | 处理方式 |
|---|---|
| FLV | 启动代理探测编码、分辨率、帧率 |
| HLS | 异步探测 TS 分段信息 |
| 其他格式 | 标记为暂不支持头部探测 |
十二、弹幕录制
Bililive-go 还支持弹幕录制,目前主要覆盖哔哩哔哩、抖音、斗鱼。弹幕会输出为 ASS 字幕文件,也可以通过 SSE 回调推送到 Web 前端实时展示。
弹幕配置支持字体大小、字体名称、滚动区域、滚动时间、分辨率、描边、背景透明度、礼物、上舰、SuperChat 等。
十三、录制失败与重试机制
直播录制最麻烦的地方就是不稳定。可能出现平台 API 请求失败、直播流 404、主播刚开播但流还没准备好、FFmpeg 秒退、HLS 分片异常、网络抖动、平台明确返回已下播等问题。
Bililive-go 的 recorder 并不是只录一次,而是在循环中不断尝试录制。每次失败后至少等待 5 秒,避免快速失败造成死循环。如果平台明确返回"已下播",系统会派发 LiveEnd 事件,让录制器正常回收。
十四、Pipeline 后处理系统
录完文件后,Bililive-go 可以进入 Pipeline 后处理。Pipeline 的优势是:后处理流程不写死,可以配置阶段顺序,也可以并行执行。
text
修复 FLV → 转 MP4 → 提取封面 → 烧录字幕 → 上传云盘 → 执行自定义命令
这对录播系统非常重要,因为录制只是第一步,后续还要考虑文件可播放性、文件格式、封面、字幕、归档和上传。
十五、Web 管理后台
Bililive-go 默认提供 Web 管理能力,Docker 版本默认暴露 8080 端口。
Web API 覆盖配置管理、直播间管理、日志查看、文件管理、Cookie 管理、B 站登录、SSE 实时推送、自动更新、IO 统计、OpenList 云上传、Prometheus 指标等场景。
十六、Docker / NAS 部署建议

Docker 启动示例:
bash
docker run --restart=always -v ~/config.yml:/etc/bililive-go/config.yml -v ~/Videos:/srv/bililive -p 8080:8080 -d chigusa/bililive-go
Docker Compose 示例:
yaml
version: "3.7"
services:
bililive-go:
image: chigusa/bililive-go
restart: unless-stopped
container_name: bililive-go
volumes:
- ./Videos:/srv/bililive
- ./config.docker.yml:/etc/bililive-go/config.yml
ports:
- 8080:8080
十七、最简配置示例
yaml
rpc:
enable: true
bind: :8080
debug: false
interval: 20
out_put_path: /srv/bililive
app_data_path: /srv/bililive/.appdata
feature:
use_native_flv_parser: false
live_rooms:
- url: https://live.bilibili.com/123456
is_listening: true
Cookie 示例:
yaml
cookies:
live.douyin.com: __ac_nonce=123456789012345678903;name=value
十八、项目亮点总结
- 平台适配抽象清晰:不同平台只需要实现自己的直播间信息和流地址获取逻辑。
- 请求调度设计合理:WrappedLive 把缓存、限流、请求合并放在统一层处理。
- 事件驱动解耦:Listener 负责检测状态,RecorderManager 负责录制生命周期。
- 长时间运行稳定性强:失败重试、显式下播处理、context 优雅关闭、分段重启、内存监控、IO 统计都服务于长期运行。
- Web 管理能力完整:不仅能录制,还能管理配置、直播间、Cookie、文件、日志、更新和监控。
- Pipeline 扩展性好:录制后处理被抽象为可配置阶段。
十九、需要注意的问题
- 平台接口经常变化,适配维护成本较高。
- 配置项较多,新手建议先用 Docker 默认配置跑起来。
- FFmpeg 仍是最通用、最重要的录制组件。
- Web API 不建议裸奔公网,尤其涉及配置、文件、Cookie 和更新接口。
- 多房间同时录制时,要重点关注磁盘 IO 和网络带宽。
二十、适合学习什么?
| 学习点 | 内容 |
|---|---|
| Go 服务启动 | 配置、日志、context、信号处理 |
| 多平台架构 | Interface + Builder |
| 事件驱动 | Listener 与 Recorder 解耦 |
| 长任务管理 | goroutine、WaitGroup、优雅关闭 |
| 外部进程 | FFmpeg 生命周期管理 |
| Web 后台 | REST API、SSE、静态文件服务 |
| 配置系统 | YAML、默认值、层级覆盖、CAS 更新 |
| 可观测性 | Prometheus、Grafana、IOStats |
| Pipeline | 可配置后处理阶段 |
二十一、如果要二次开发
新增平台
重点看:
text
src/live/
src/live/lives.go
src/live/internal/
需要实现 Builder、GetInfo、GetStreamInfos、平台中文名、Cookie/Header/清晰度处理。
新增通知渠道
重点看:
text
src/notify/
src/configs/config.go
可以扩展企业微信、钉钉、飞书等。
新增后处理阶段
重点看:
text
src/pipeline/
src/pipeline/stages/
实现新的 Stage,然后注册到 Pipeline Manager。
二十二、总结
Bililive-go 表面上是直播录制工具,实际上是一个很完整的 Go 后端工程案例。它包含多平台适配、事件驱动、任务生命周期管理、配置热更新、实时状态推送、外部进程管理、媒体流处理、录后 Pipeline、Prometheus 监控、通知系统和 Web 管理后台。
它最值得学习的地方不是"怎么用 FFmpeg 录直播",而是它如何把一个看似简单的直播录制需求,做成一个可以长期运行、支持多平台、支持 Web 管理、支持后处理和可观测性的完整系统。