【直播切片工作台】

简介: live-mixer 是面向直播回放的端到端AI切片工作台,基于Go+React构建。通过DB任务队列(乐观锁)、同进程Worker、JSONB存储与接口化依赖,实现ASR转写、AI智能选段、剪映草稿自动生成及成片导出,全流程轻量高效。(239字)

第1章:项目全景与架构总览

本章鸟瞰 live-mixer(直播切片工作台)的整体面貌:它解决什么问题、由哪些部分组成、数据如何流动。后续所有章节都在这张地图上展开,建议先通读本章再进入细节。

流程

live-mixer 是一条面向直播回放的端到端切片流水线。用户从浏览器(React 前端)录入直播素材 URL,后端(Go + Gin)将素材落库并异步触发 ASR 语音转写;转写完成后,用户创建剪辑项目,选择系统提示词;随后走上两条路径之一——「一键成片」自动串联 AI 切片与剪映草稿生成,或「AI 粗选 + 人工精修」先让大模型挑出高价值句段(clips1),人工调整后再单独生成草稿。最终产物是可供下载的剪映草稿(draft_url)、切片 tar 包(clips_tar_url)以及可选的成片视频(video_url)。

整个系统由四类进程/容器协作:

  • live-mixer 主服务:单进程同时承载 HTTP API 与后台 Worker(ASR、AI 切片、草稿、一键成片四组)。
  • capcut-mate 服务:独立的剪映草稿生成服务,主服务通过 REST 调用它。
  • nginx:静态资源与反向代理,统一对外入口。
  • PostgreSQL:唯一的持久化存储,Worker 通过数据库乐观锁实现多实例安全调度。
flowchart TD
    A[浏览器 React 前端] -->|HTTP/JSON| B[Go API: Gin 路由]
    B --> C[(PostgreSQL)]
    B --> D[ASR Worker]
    B --> E[AI 切片 Worker]
    B --> F[草稿/一键成片 Worker]
    D --> G[豆包 BigModel ASR]
    E --> H[OpenAI 兼容 LLM]
    F --> I[capcut-mate]
    F --> J[ffmpeg / 对象存储]
    I --> K[剪映草稿 / 成片]

一次典型「一键成片」任务的时序是:POST /tasks/ai-slice-draft 创建 Task(pending)→ Worker 乐观锁抢占(processing)→ 读取素材 ASR 段落与项目提示词 → LLM 返回索引数组与标题/描述/话题 → 回写 video_project.clips1 → 下载源视频、ffmpeg 裁剪切片、上传对象存储 → 调用 capcut-mate 建草稿、加视频轨、加字幕 →(可选)触发成片生成并轮询 → 任务标记 completed,客户端轮询 GET /tasks/:id 拿到三个 URL。

实现

代码采用经典的 Go 分层架构,目录即架构:

backend/internal/
├── handler/    # HTTP 层:参数绑定、校验、调 service、写响应
├── service/    # 业务层:编排 repository 与 Worker、跨模块流程
├── repository/ # 数据访问层:GORM 封装、乐观锁、筛选
├── model/      # 实体与 JSONB 嵌套结构
├── draft/      # 剪映草稿流水线(prepare → session → steps)
├── pkg/        # 可复用内聚包:asr / llm / capcutmate / storage / media ...
├── scheduler/  # 独立于业务 Worker 的定时任务
├── migrator/   # 建表(仅 envinit 调用)
└── seeder/     # 种子数据

几个贯穿全书的架构决策值得先记住:

  1. API 与 Worker 同进程:cmd/webserver/main.go 在启动 HTTP 服务的同时 Start() 四个 Worker,部署上只需一个容器。并发度与孤儿回收阈值由 WorkerConfig 控制。
  2. 数据库即任务队列:没有引入消息队列,Task 表 + 乐观锁(version CAS)+ 定时轮询(3 秒)完成多实例安全的任务分发。这是整个系统最值得学习的简化取舍。
  3. 快照式冗余:Task 创建时把画布尺寸、live_url、live_name 从关联表复制到本行,列表查询零 JOIN;代价是关联数据变更后任务显示的是创建时快照。
  4. 外部依赖全部接口化:LLM(LLMChatClient)、裁剪(VideoSegmentCutter)、上传(ObjectUploader)等在依赖处定义为小接口,配合大量 *_test.go 实现高覆盖单测。

前端是独立的 React 18 + Vite + Ant Design 5 工程,通过 /openapi/live-mixer/v1/* 与后端通信,详见第 47~49 章。

📌 设计决策

  • 选择「DB 任务队列」而非 Redis/MQ:依赖最小化,多实例扩展仍安全;代价是轮询延迟(≤3 秒)与数据库写放大,对本系统任务量级完全可接受。
  • 选择「同进程 Worker」而非独立 worker 容器:运维简单;若未来需要独立扩缩容,只需把 main.go 中 Worker 启动段拆为另一个 cmd。
  • 大量业务字段(clips、asr_paragraphs、topics)用 PostgreSQL JSONB + GORM serializer 存储,避免为嵌套结构建关联表。

代码示例

启动入口清晰展示了「一个进程,两类职责」的装配方式:

// cmd/webserver/main.go(节选)
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()

asrWorker.Start(ctx)         // ASR 转写 Worker
aiSliceWorker.Start(ctx)     // AI 切片 Worker
draftWorker.Start(ctx)       // 剪映草稿 Worker
aiSliceDraftWorker.Start(ctx) // 一键成片 Worker

sched := scheduler.New(logger)
sched.Register(scheduler.Job{
    /* staging 清理 */ })
sched.Start(ctx)

srv := &http.Server{
   Addr: cfg.Server.Addr(), Handler: r}
go func() {
    _ = srv.ListenAndServe() }()

<-ctx.Done() // 优雅退出:先停 HTTP,再随 ctx 取消停 Worker

任务实体是理解全局的钥匙,其字段注释即业务契约:

// internal/model/task.go(节选)
type Task struct {
   
    ID             string `gorm:"primaryKey;size:36"` // UUID,仓储层生成
    Type           string `gorm:"size:32;index"`      // ai_slice / draft / ai_slice_draft
    Status         string `gorm:"default:pending;index"`
    Progress       int16                              // 0-100,客户端轮询展示
    Version        int64                              // 乐观锁:CAS 抢占时递增
    VideoProjectID *uint                              // 关联剪辑项目(可空)
    DraftURL       string                             // 草稿下载地址,成功后回写
    VideoURL       string                             // 成片地址,gen_video 完成后回写
    ClipsTarURL    string                             // 切片 tar 包地址
    LiveURL        string                             // 创建时快照,列表免 JOIN
}

小结

  • live-mixer = 素材管理 + ASR + AI 选段 + 剪映草稿 + 成片导出的单进程 Go 服务。
  • 核心架构关键词:分层、DB 任务队列(乐观锁)、JSONB、外部依赖接口化。
  • 三个产物 URL(draft / video / clips_tar)都挂在 Task 上,客户端只需轮询一个接口。

思考题

  1. 若任务量从每天数百涨到数十万,DB 任务队列会在哪些点先到达瓶颈?
  2. Task 冗余快照字段与实时 JOIN 各自的适用边界在哪里?

项目信息

  • GitHub仓库:Chyona/live-mixer
相关文章
|
26天前
|
人工智能 编解码 前端开发
【直播切片工作台】第11章:剪辑项目模型 VideoProject
本章详解剪辑项目模型 `VideoProject`:以双层选段(clips0粗筛、clips1精修)为核心,聚合素材、提示词、画布与发布元数据;约束常量统一校验LLM输出与前端输入,实现AI与人工协同的高精度短视频生产。
|
5月前
|
人工智能 监控 算法
智慧工业园区 AI 视觉安防监管系统建设方案
本方案基于AI算法盒子+专属安全算法+高清监控,构建端边云协同的智慧园区监管系统,实现24小时实时监测、智能识别、自动告警与数据追溯,覆盖安全帽/安全带佩戴、跌倒、闯入、车辆等五大行为检测,助力园区从“事后处置”迈向“事前预防、事中预警”。
651 3
|
API PHP C语言
php8安装fileinfo扩展
php8安装fileinfo扩展
2270 0
|
2月前
|
人工智能 自然语言处理 前端开发
把整个测试流程交给 AI 是什么体验?
开源AI测试平台ai_test_sheng,用自然语言一句“帮我测订单流程”,AI自动完成需求分析、页面探索、用例设计、执行、报告及UI脚本生成等8阶段全流程。支持Playwright真实浏览器操作、SSE流式对话、L1-L3故障自愈、多会话隔离与DeepSeek/Cluade双引擎。MIT协议,Docker一键部署,附在线体验(admin/admin123)。
282 3
|
2月前
|
NoSQL 前端开发 安全
零成本邮件验证码全链路拆解,附最新 QQ 邮箱 SMTP 授权码完整步骤
本文详解个人项目“词帆CiFan”中邮件验证码功能的完整实现:选用QQ邮箱SMTP零成本方案,涵盖密码重置与账号注销两大核心场景,包含前后端链路设计、Redis降级容错、安全配置避坑(如授权码获取、端口选择、环境变量保护)及AI辅助开发技巧。
240 0
零成本邮件验证码全链路拆解,附最新 QQ 邮箱 SMTP 授权码完整步骤
|
9月前
|
传感器 人工智能 架构师
2026实战蓝图:AI Agent全栈开发培训流程与AI Agent职业路线进阶指南
摘要: 2026年,大模型正式进入“行动元年”。AI Agent(智能体)已从的对话接口转变为具备自主逻辑、环境感知与复杂协作能力的数字员工。本文将深度拆解从LLM向Agent覆盖的技术基础逻辑,规划从初级开发者到Agent架构师的职业路径,并提供一套简单的工程化的培训方法论。
6013 3
|
2月前
|
人工智能 API
Luna降价80%,老金教你20美元Plus当100美元Pro用
![Image](https://ucc.alicdn.com/pic/developer-ecology/p3shvhj26rigq_cfb66ec429e24ad3b3040b2007a76397.png) 先说结论。如果你正在用20美元的Codex Plus,这次先别急着掏100美元升级Pro。 你账户里已经有的GPT-5.6 Luna,刚刚降价80%。把它的Max推理打开,再让Sol
|
9月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle多租户容器数据库
Oracle 12c引入多租户容器数据库(CDB),支持在一个数据库服务器上管理多个可插拔数据库(PDB),提升资源利用率,降低成本。CDB由根容器、PDB种子和多个PDB组成,可通过DBCA或SQL脚本创建,实现高效数据库整合与运维。
684 2
|
10月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用开发中的关键技术。前者为跨模型工具调用提供标准化协议,实现解耦与兼容;后者是模型调用外部功能的内置机制。二者互补,共同构建“意图解析-协议传输-工具执行”的分层架构,推动AI应用生态发展。
|
人工智能 算法 安全
AI降噪耳机,可在嘈杂人群中单独通话,看一眼锁定目标
【6月更文挑战第15天】AI降噪耳机结合AI算法与麦克风阵列,能在嘈杂环境中确保清晰通话,提升沟通效率和隐私保护。尽管价格高、降噪效果有限且有安全隐患,它们为用户带来便利的同时,也引发了对隐私和安全的关注。
897 1

热门文章

最新文章