Bililive-go 一个 Go 实现的多平台直播自动录制系统

前言

如果你经常需要录制直播,比如 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 包负责周期性检测直播间状态,主要触发三类事件:LiveStartLiveEndRoomNameChanged

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,主要解决三个问题:

  1. 缓存直播间信息:请求失败时还能保留上一次成功的主播名、房间名等信息。
  2. 平台访问限流:不同平台可以设置最小访问间隔,避免请求过于密集。
  3. 请求合并:多个模块同时等待直播间信息时,可以共享一次真实请求结果。

八、事件驱动架构

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

十八、项目亮点总结

  1. 平台适配抽象清晰:不同平台只需要实现自己的直播间信息和流地址获取逻辑。
  2. 请求调度设计合理:WrappedLive 把缓存、限流、请求合并放在统一层处理。
  3. 事件驱动解耦:Listener 负责检测状态,RecorderManager 负责录制生命周期。
  4. 长时间运行稳定性强:失败重试、显式下播处理、context 优雅关闭、分段重启、内存监控、IO 统计都服务于长期运行。
  5. Web 管理能力完整:不仅能录制,还能管理配置、直播间、Cookie、文件、日志、更新和监控。
  6. 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 管理、支持后处理和可观测性的完整系统。