直播自动化录制:跨平台直播内容采集系统 - LiveAutoRecord技术深度解析
【免费下载链接】LiveAutoRecord基于 Electron 的多平台直播自动录制软件项目地址: https://gitcode.com/GitHub_Trending/li/LiveAutoRecord
LiveAutoRecord是一个面向多直播平台的自动化录制解决方案,通过模块化架构设计实现了B站、斗鱼、虎牙、抖音等主流直播平台的智能内容采集。该系统采用TypeScript技术栈构建,提供桌面客户端、HTTP服务端和命令行工具三种部署模式,满足从个人用户到服务器级部署的多样化需求。
插件化架构:可扩展的平台支持系统
统一接口设计下的平台适配器模式
LiveAutoRecord的核心设计理念基于插件化架构,每个直播平台都作为独立的Provider实现统一的RecorderProvider<E>接口。这种设计使得新增平台支持变得模块化且标准化,开发者只需关注特定平台的API适配,无需修改核心调度逻辑。
interface RecorderProvider<E> { id: string // Provider唯一标识,如"Bilibili" name: string // 显示名称 siteURL: string // 平台网址 matchURL(channelURL: string): boolean resolveChannelInfoFromURL(channelURL: string): Promise<{ id; title; owner } | null> createRecorder(opts): Recorder<E> fromJSON(json): Recorder<E> setFFMPEGOutputArgs(args: string[]): void }现有平台插件包括@autorecord/bilibili-recorder、@autorecord/douyu-recorder、@autorecord/huya-recorder和@autorecord/douyin-recorder,每个插件负责处理对应平台的直播流获取、状态检测和弹幕协议解析。
状态机驱动的录制流程控制
录制器采用严格的状态机模型,确保录制过程的可靠性和一致性。状态流转遵循idle → recording → stopping-record → idle的闭环逻辑,每个状态转换都包含完整的资源清理和错误处理机制。
interface Recorder<E> extends Emitter<Events>, RecorderCreateOpts<E> { id: string // UUID标识符 state: RecorderState // 当前状态:idle, recording, stopping-record channelId: string // 频道/房间号 quality: Quality // 画质等级:lowest, low, medium, high, highest streamPriorities: string[] // 流格式优先级:如flv, hls sourcePriorities: string[] // CDN源优先级 recordHandle?: RecordHandle // 当前录制句柄 }智能调度引擎:多线程并发检测与健壮性保障
三线程并发检查机制
RecorderManager作为系统的核心调度器,实现了高效的并发检测机制。通过multiThreadCheck()函数创建三个并行工作线程,从待检查队列中智能分配任务,最大化利用系统资源的同时避免对直播平台API造成过大压力。
LiveAutoRecord的主界面展示了已配置的直播频道列表,每个频道卡片清晰显示平台、频道ID和当前状态。系统自动管理检查任务的分配和执行,确保及时检测直播状态变化。
录制流程的健壮性设计
录制过程包含多层防护机制,确保在各种异常情况下都能安全恢复:
- 防重入保护:通过
singleton()包装确保同一时间只有一个检查/录制流程运行 - 超时检测:10秒内无FFmpeg输出则判定连接卡顿,自动终止并重试
- 无效流检测:帧数连续10次无变化则判定为无效流,避免录制空内容
- HTTP状态监控:404等HTTP错误直接判定流无效,快速切换到备用源
// 创建超时检测器 const createTimeoutChecker = (onTimeout: () => void, time: number) => { let timer: NodeJS.Timeout | null = null return { update() { if (timer) clearTimeout(timer) timer = setTimeout(onTimeout, time) }, clear() { if (timer) clearTimeout(timer) timer = null } } }数据持久化与文件管理策略
跨平台配置与数据目录结构
LiveAutoRecord使用env-paths库自动适配不同操作系统的数据存储位置,确保配置和录制文件的正确存储:
- Windows:
%APPDATA%/live-auto-record/Config和%APPDATA%/live-auto-record/Data - Linux:
~/.config/live-auto-record和~/.local/share/live-auto-record - macOS:
~/Library/Preferences/live-auto-record和~/Library/Application Support/live-auto-record
核心数据文件包括:
manager.json- Manager全局配置(保存路径规则、检查间隔等)data.json- lowdb数据库(录制器和录制历史记录)settings.json- 应用级设置(通知、语言、调试模式等)
智能文件命名与组织系统
录制文件按照可配置的路径模板自动组织,支持丰富的变量替换:
// 默认保存路径规则 const defaultSavePathRule = '{dataPath}/{platform}/{owner}/{year}-{month}-{date} {hour}-{min}-{sec} {title}.mp4'支持的模板变量包括{platform}(平台名称)、{owner}(主播名)、{title}(直播标题)、{year}、{month}、{date}等时间字段,以及{remarks}(用户备注)。每个录制文件都会生成对应的JSON元数据文件,包含弹幕、礼物消息和录制统计信息。
录制历史界面按时间顺序展示所有录制内容,支持直接播放和SRT字幕生成功能。系统自动按平台和主播分类组织文件,便于内容管理和检索。
多模式部署架构:适应不同使用场景
Electron桌面客户端:一体化用户体验
桌面客户端基于Electron 40和electron-vite 5构建,整合了HTTP Server与Web前端,提供原生的系统集成功能:
- 系统托盘支持:最小化到托盘,后台持续运行
- 单实例锁:
app.requestSingleInstanceLock()防止多开冲突 - FFmpeg静态绑定:内置ffmpeg-static,无需用户单独安装
- 原生通知:录制开始/结束的系统级通知
HTTP Server模式:服务端部署方案
HTTP Server基于Express 5构建,提供完整的REST API和SSE实时事件推送,适合服务器部署和远程管理:
// REST API路由结构 app.use('/api/recorder', recorderRouter) // 录制器CRUD app.use('/api/record', recordRouter) // 录制记录查询 app.use('/api/manager', managerRouter) // Manager配置管理 app.use('/api/event', eventRouter) // SSE事件流 app.use('/api/setting', settingRouter) // 应用设置 app.use('/api/provider', providerRouter) // Provider鉴权管理SSE(Server-Sent Events)机制确保Web前端能实时接收录制状态变化、开始/停止事件等,实现近似实时更新的用户体验。
CLI命令行工具:脚本集成与自动化
CLI工具基于commander构建,提供完整的命令行接口,支持结构化JSON输出,便于脚本集成和AI Agent调用:
# 基本操作命令 lar add https://live.bilibili.com/123456 # 添加录制频道 lar list --json # JSON格式列出所有录制器 lar start <recorder-id> # 手动启动录制 lar watch # 守护模式持续监控 # 配置管理 lar config savePathRule "{platform}/{owner}/{title}.mp4" lar config autoCheckInterval 30000 # 设置检查间隔为30秒FFmpeg集成与流处理优化
自适应流选择算法
系统采用三级优先级算法选择最佳直播流:
- 画质优先级:根据用户设置的
quality参数(lowest/low/medium/high/highest) - 流格式优先级:按
streamPriorities配置的格式顺序(如flv优先于hls) - CDN源优先级:按
sourcePriorities配置的CDN提供商顺序
FragmentMP4格式优化
默认使用FragmentMP4格式进行录制,结合以下FFmpeg参数实现抗损坏和实时播放支持:
-c copy -movflags frag_keyframe -min_frag_duration 60000000-c copy:直接复制流,避免重新编码带来的质量损失和性能开销-movflags frag_keyframe:生成FragmentMP4格式,支持边录边播,具有更好的抗损坏能力-min_frag_duration 60000000:设置最小分段时长为60秒,减少moof boxes数量,优化浏览器加载性能
添加新录制频道界面提供完整的配置选项,包括平台选择、画质设置、流格式和CDN源优先级配置,满足专业用户的精细控制需求。
鉴权系统与平台适配
统一的鉴权接口设计
系统为需要登录的平台提供统一的鉴权接口,支持Cookie注入和浏览器自动登录两种方式:
interface ProviderAuthFlow { loginURL: string // 登录页面URL checkLoginResult: (data: { url: string cookies: { name: string; value: string; domain: string; path: string }[] }) => { success: boolean; authConfig?: Record<string, string> } timeout?: number // 超时时间,默认5分钟 }跨平台的浏览器登录实现
鉴权系统通过依赖注入支持不同环境的浏览器登录:
- Electron环境:使用
BrowserWindow打开登录页面 - HTTP Server独立运行:使用Playwright Chromium进行自动化登录
- CLI环境:同样使用Playwright Chromium,适合无头环境
鉴权配置持久化到manager.json的providerAuthConfigs字段,应用启动时自动加载并注入到对应Provider的API层。
开发与扩展指南
项目结构与构建系统
LiveAutoRecord采用pnpm 10 Workspaces + Turborepo的monorepo架构,包含11个独立的npm包:
live-auto-record/ ├── packages/ │ ├── manager/ # 核心调度引擎 │ ├── core/ # CLI和Server共享模块 │ ├── shared/ # 内部共享工具 │ ├── bilibili-recorder/ # B站平台插件 │ ├── douyu-recorder/ # 斗鱼平台插件 │ └── ... ├── apps/ │ ├── electron/ # Electron桌面客户端 │ ├── http-server/ # HTTP服务端 │ ├── cli/ # 命令行工具 │ └── web/ # Vue 3前端构建顺序由Turborepo自动管理:shared → manager → core + 4 recorders → cli + http-server → electron,支持增量构建和缓存加速。
开发新平台插件的实现模式
开发新直播平台支持需要实现RecorderProvider<E>接口,主要关注三个核心方法:
- URL匹配:实现
matchURL()方法识别平台特定URL模式 - 频道信息解析:实现
resolveChannelInfoFromURL()从URL提取频道ID和基本信息 - 录制器创建:实现
createRecorder()创建平台特定的录制器实例
以B站插件为例,录制流程包含以下关键步骤:
async function checkLiveStatusAndRecord({ getSavePath }) { // 1. 检查直播状态 const { living, owner, title } = await getInfo(this.channelId) if (!living) return null // 2. 获取直播流地址 const { currentStream: stream } = await getStream({ channelId: this.channelId, quality: this.quality, streamPriorities: this.streamPriorities, sourcePriorities: this.sourcePriorities }) // 3. 创建录制目录和元数据文件 const savePath = getSavePath({ owner, title }) ensureFolderExist(savePath) // 4. 启动FFmpeg录制 const ffmpeg = createFFMPEGBuilder(stream.url) .outputOptions(ffmpegOutputOptions) .save(savePath) // 5. 启动弹幕收集 const messageListener = startListen(roomId, msgHandler) // 6. 监控录制过程 const timeoutChecker = createTimeoutChecker(() => { // 超时处理逻辑 }, 10000) return { stop: async () => { /* 清理资源 */ } } }全局设置界面提供完整的系统配置选项,包括保存路径规则、自动检查间隔、通知设置等,支持根据平台和主播信息动态生成文件路径。
技术栈与性能优化
现代TypeScript技术栈
- 运行时:Node.js >= 22.0.0 + TypeScript 5.8+
- 构建工具:tsup (ESM + CJS双输出) + Turborepo
- 桌面端:Electron 40 + electron-vite 5 + Vuetify 3.11
- 服务端:Express 5 + lowdb + Server-Sent Events
- 前端:Vue 3.5 + Vite 7 + Tailwind CSS 4 + Pinia 3
- 录制核心:fluent-ffmpeg + ffmpeg-static
性能优化策略
- 异步节流写入:使用
asyncThrottle()包装数据库写入操作,1秒间隔批量写入,减少磁盘I/O - 事件防抖处理:SSE事件推送使用同tick防抖,避免频繁的客户端更新
- 内存优化:录制元数据使用流式写入,避免大内存占用
- 连接复用:HTTP请求使用axios连接池,减少连接建立开销
实际部署与运维考虑
系统要求与环境配置
- Node.js环境:需要Node.js 22.0.0或更高版本
- FFmpeg依赖:系统PATH中需要包含FFmpeg,或使用内置的ffmpeg-static
- 存储空间:根据录制质量和频率预留足够磁盘空间
- 网络带宽:确保稳定的网络连接,特别是多频道同时录制时
多实例运行限制
由于数据持久化基于JSON文件,系统不支持多实例并发写入。CLI、HTTP Server、Electron客户端三者共享同一数据目录,同一时间只能运行一个实例。系统提供端口检测机制(8085端口),避免冲突。
录制质量与存储平衡
系统支持从lowest到highest五种画质等级,用户可根据存储空间和网络条件灵活选择。默认使用-c copy参数避免重新编码,在保证质量的同时减少CPU使用率。对于需要长期存储的内容,建议选择中等以上画质;对于临时观看或网络条件受限的场景,可选择较低画质。
内置播放器基于DPlayer构建,支持录制内容的直接预览和播放控制,无需额外安装播放软件。播放器显示直播赛事内容,包含队伍阵容和实时比分信息。
扩展性与二次开发
API集成与自动化脚本
HTTP Server提供的REST API支持外部系统集成,可用于:
- 自动化频道管理(添加、删除、修改录制器)
- 录制状态监控和报警
- 录制内容的后处理和分析
- 与其他系统的数据同步
自定义Provider开发
开发者可以基于现有Provider实现模板,快速添加新的直播平台支持。关键步骤包括:
- 实现平台特定的API客户端
- 适配直播流获取逻辑
- 集成平台弹幕协议(如WebSocket或HTTP长轮询)
- 实现鉴权机制(如需要)
数据导出与处理
录制生成的JSON元数据文件包含完整的弹幕和礼物消息时间线,可用于:
- 生成SRT字幕文件
- 直播内容分析(热门时段、互动频率等)
- 内容摘要生成
- 与其他分析工具集成
LiveAutoRecord通过其模块化设计、健壮的录制引擎和灵活的部署选项,为直播内容采集提供了完整的技术解决方案。无论是个人用户的内容收藏,还是专业团队的批量录制需求,系统都能提供可靠的技术支撑。
【免费下载链接】LiveAutoRecord基于 Electron 的多平台直播自动录制软件项目地址: https://gitcode.com/GitHub_Trending/li/LiveAutoRecord
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考