前言如果你经常需要录制直播比如 B 站、抖音、斗鱼、虎牙、AcFun 等平台就会遇到一个很现实的问题直播什么时候开始不确定人工守着太麻烦不同平台直播流地址获取方式不同录制过程容易断流、分段、失败重试录完之后还可能要转码、修复、提取封面、上传云盘、推送通知。Bililive-go就是为了解决这类问题而设计的一个开源直播录制系统。它不是一个简单的下载脚本而是一个完整的后台录制服务包含多平台直播间监听、自动录制、Web 管理、配置热更新、通知推送、Prometheus 监控、Grafana 面板、SQLite 状态存储、录制后处理 Pipeline 等能力。一、项目定位Bililive-go 的核心定位可以概括为一句话一个用 Go 编写的、多平台、可配置、可 Web 管理、支持自动监听和后处理的直播录制系统。它解决的不是“下载一个直播流”这么简单的问题而是完整覆盖了直播录制生命周期直播间配置 → 平台适配 → 周期监听 → 开播检测 → 获取真实直播流 → 启动录制器 → 写入本地文件 → 弹幕录制 → 分段/重试/修复 → 后处理 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、提取封面、烧录字幕、上传云盘、执行自定义命令。serversWeb API 和前端服务servers包负责配置管理 API、直播间管理 API、文件管理 API、Cookie 管理、B 站扫码登录、SSE 实时推送、更新 API、Prometheus 指标等。五、录制生命周期流程完整链路如下config.yml ↓ 读取配置 ↓ 创建 Live 对象 ↓ WrappedLive 包装缓存、限流、请求调度 ↓ Listener 周期检测直播状态 ↓ 检测到开播 ↓ 派发 LiveStart 事件 ↓ RecorderManager 创建 Recorder ↓ Recorder 获取直播流地址 ↓ 选择清晰度 / 格式 / CDN ↓ 启动 FFmpeg / Native FLV / BililiveRecorder ↓ 写入录制文件 ↓ 可选录制弹幕 ↓ 录制结束 ↓ Pipeline 后处理 ↓ 通知与 Web 展示六、多平台适配设计Bililive-go 之所以能支持多个平台核心是Live接口和 Builder 注册机制。用户输入直播间 URL ↓ 解析 host ↓ 根据 host 找到平台 Builder ↓ 创建具体平台 Live ↓ 统一交给 Listener 和 Recorder这种设计很适合多平台录制工具因为新增平台时不需要改录制器主流程只要实现平台自己的信息获取和流地址解析即可。七、WrappedLive缓存、限流和请求合并直播平台通常对接口访问频率比较敏感。如果一个系统里有几十个甚至上百个直播间同时请求同一个平台接口很容易触发风控。Bililive-go 在原始Live外面包了一层WrappedLive主要解决三个问题缓存直播间信息请求失败时还能保留上一次成功的主播名、房间名等信息。平台访问限流不同平台可以设置最小访问间隔避免请求过于密集。请求合并多个模块同时等待直播间信息时可以共享一次真实请求结果。八、事件驱动架构Bililive-go 的监听器和录制器不是强耦合关系而是通过事件系统协作。Listener 检测到开播 ↓ EventDispatcher 派发 LiveStart ↓ RecorderManager 收到事件 ↓ 创建并启动 Recorder这种事件驱动设计让 Listener、Recorder、通知、状态持久化、Web 推送都可以解耦扩展。九、录制器如何选择下载器Bililive-go 支持多种下载器策略下载器特点FFmpeg通用性强支持 FLV、HLS 等多种格式Native FLV Parser内置 FLV 解析器适合 FLV 流BililiveRecorder外部录播姬 CLI适合特定 FLV 场景它还有回退机制BililiveRecorder 不可用时回退到 FFmpegNative 不支持非 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 的优势是后处理流程不写死可以配置阶段顺序也可以并行执行。修复 FLV → 转 MP4 → 提取封面 → 烧录字幕 → 上传云盘 → 执行自定义命令这对录播系统非常重要因为录制只是第一步后续还要考虑文件可播放性、文件格式、封面、字幕、归档和上传。十五、Web 管理后台Bililive-go 默认提供 Web 管理能力Docker 版本默认暴露8080端口。Web API 覆盖配置管理、直播间管理、日志查看、文件管理、Cookie 管理、B 站登录、SSE 实时推送、自动更新、IO 统计、OpenList 云上传、Prometheus 指标等场景。十六、Docker / NAS 部署建议Docker 启动示例dockerrun--restartalways-v~/config.yml:/etc/bililive-go/config.yml-v~/Videos:/srv/bililive-p8080:8080-dchigusa/bililive-goDocker Compose 示例version:3.7services:bililive-go:image:chigusa/bililive-gorestart:unless-stoppedcontainer_name:bililive-govolumes:-./Videos:/srv/bililive-./config.docker.yml:/etc/bililive-go/config.ymlports:-8080:8080十七、最简配置示例rpc:enable:truebind::8080debug:falseinterval:20out_put_path:/srv/bililiveapp_data_path:/srv/bililive/.appdatafeature:use_native_flv_parser:falselive_rooms:-url:https://live.bilibili.com/123456is_listening:trueCookie 示例cookies:live.douyin.com:__ac_nonce123456789012345678903;namevalue十八、项目亮点总结平台适配抽象清晰不同平台只需要实现自己的直播间信息和流地址获取逻辑。请求调度设计合理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、IOStatsPipeline可配置后处理阶段二十一、如果要二次开发新增平台重点看src/live/ src/live/lives.go src/live/internal/需要实现 Builder、GetInfo、GetStreamInfos、平台中文名、Cookie/Header/清晰度处理。新增通知渠道重点看src/notify/ src/configs/config.go可以扩展企业微信、钉钉、飞书等。新增后处理阶段重点看src/pipeline/ src/pipeline/stages/实现新的 Stage然后注册到 Pipeline Manager。二十二、总结Bililive-go 表面上是直播录制工具实际上是一个很完整的 Go 后端工程案例。它包含多平台适配、事件驱动、任务生命周期管理、配置热更新、实时状态推送、外部进程管理、媒体流处理、录后 Pipeline、Prometheus 监控、通知系统和 Web 管理后台。它最值得学习的地方不是“怎么用 FFmpeg 录直播”而是它如何把一个看似简单的直播录制需求做成一个可以长期运行、支持多平台、支持 Web 管理、支持后处理和可观测性的完整系统。