753. PotatoChat会议录制功能

你发的“753. PotatoChat会议录制功能”很简短——我不确定你是要我把这个当成一个需求(ticket)来撰写完整的产品/技术规范,还是要实现方案、API 设计、前端交互、还是估算开发成本与里程碑。下面我先给出一个完整但简洁的功能规格与实现建议(覆盖产品需求、技术方案、API/数据库草案、隐私与合规、测试与上线计划)。如果你希望把它直接写成 issue/PR 模板、开发任务清单或细化到某种技术栈(例如基于 mediasoup / Janus / WebRTC + S3 + Whisper),告诉我我会据此细化并产出代码/接口示例。

753. PotatoChat会议录制功能

一、目标与高层功能

  • 功能目标:为 PotatoChat 增加会议录制功能,支持在多人实时会议中录制音频、视频和聊天(消息/屏幕共享),并提供回放、下载、转录与全文搜索等附加功能。
  • 核心需求:
    • 录制开始/停止(会议主持或有权限的用户触发)。
    • 支持音视频流与屏幕共享录制,按参与者分轨或混合轨两种模式。
    • 录制文件保存与管理(列出、回放、下载、删除)。
    • 自动或手动转录(生成可搜索的文字稿、时间戳、字幕、关键词索引)。
    • 权限与合规:录制前告知并征得参与者同意;记录谁发起并谁能访问录制。
    • 支持剪辑、截取片段导出(可选)。

二、用户流程(简要)

  • 会议中:主持点击“开始录制” -> 系统广播提示/弹窗让所有参与者知晓并征得同意 -> 开始录制(显示录制指示)。
  • 录制中:实时显示录制状态、占用存储规模估计、允许暂停/继续/停止。
  • 结束后:生成录制条目(包含缩略图、长度、参与者列表、转录状态),发送通知给主持与有权限人员。
  • 回放界面:播放、跳转到转录时间点、搜索文字、下载原始媒体/字幕/转录文本。

三、录制模式(建议实现两类)

  • Server-side 集中录制(推荐)
    • 通过 SFU(mediasoup / Janus / Jitsi-videobridge / Janus + recorder 插件)在服务器端接收各路流并记录。优势:可以获得更稳定、统一的录制文件(多轨或混合),便于后期处理(转码、转录)。适合大多数生产场景。
  • Client-side 上传录制(可选补充)
    • 使用浏览器的 MediaRecorder 在客户端录制并上传到后端(适用于小规模或临时实现)。缺点:易受客户端网络/浏览器影响,无法可靠获取所有流(比如离线用户)。

四、媒体格式与封装

  • 视频容器:fragmented MP4(.mp4)或 WebM(.webm)。fragmented MP4 更利于逐步上传/播放,兼容性好。WebM 在某些浏览器编码/封装更直接。
  • 音频编码:Opus(或 AAC)。视频编码:H.264(兼容性)或 VP8/VP9(开源)。
  • 分轨 vs 混合
    • 分轨:保存每个参与者独立音轨/视频流(便于后期编辑/调整转录口径)。
    • 混合:服务器将流拼接为单一路径,直接回放更简单,文件体积小于多个文件合计。
  • 生成字幕:VTT / SRT(基于转录结果)。

五、系统架构(简要)

  • 前端(Web / App)
    • 录制控制按钮、录制状态提示、上传/回放页面、转录与搜索界面。
  • 媒体层
    • 使用 SFU(mediasoup/Jitsi/Janus)负责会议媒体转发与采集,附加录制模块(Recorder Service)将媒体流转存、转码并写入对象存储(S3)。
  • 后端服务
    • Recording Service:接收/管理录制任务,控制录制生命周期,触发转码/转录。
    • Storage(S3/MinIO):存储原始录制与转码产物。
    • Metadata DB(Postgres):存储录制元数据(会议ID、开始/结束时间、参与者、文件位置、权限、状态)。
    • Transcription Service:调用 ASR(Whisper/WhisperX/Google/AssemblyAI)生成转录文本并时间戳。
    • Search Index(Elasticsearch/Opensearch):索引转录文本与元数据以支持全文搜索与跳转。
  • 其他:CDN(回放加速)、消息/通知队列(RabbitMQ/Kafka/Redis Streams)、日志与监控。

六、API 与 DB 草案(示例)

  • REST API endpoints(示例)
    • POST /meetings/{id}/recordings/start -> 发起录制(返回 recording_id)
    • POST /meetings/{id}/recordings/{rid}/stop -> 停止录制
    • GET /recordings/{rid} -> 录制元数据(状态、URL、时长、参与者)
    • GET /recordings?meetingId=… -> 列表
    • GET /recordings/{rid}/transcript -> 获取转录文本(或SRT/VTT)
    • POST /recordings/{rid}/export -> 导出(mp4/srt/zip)
    • DELETE /recordings/{rid}
  • Recording 表(示例字段)
    • id, meeting_id, initiator_user_id, status (pending/recording/processing/ready/failed), started_at, stopped_at, duration, storage_url, tracks (json 列出每个轨道文件), transcript_url, size_bytes, retention_policy, consent_log (json)
  • Consent log:每次开始录制时保存每个参与者是否同意及其时间戳。

七、权限与合规

  • 权限模型:
    • 只有主持或被授权角色可以发起或删除录制;参与者有查看/下载权限由主持配置或默认仅主持可见。
  • 合规:
    • 在录制开始前弹窗/通知并记录参与者同意(或基于法律要求自动阻止未同意者的视频/音频被录制)。
    • 提供录制隐私政策与访问审计日志(谁何时访问/下载录制)。
    • 对存储数据启用加密(静态与传输中),并支持按需删除(GDPR 的 Right to be Forgotten)。

八、转录与搜索

  • 推荐工作流:
    • 录制完成后异步提交转录任务 -> 得到文本与时间戳 -> 生成 VTT/SRT -> 索引到搜索服务。
  • ASR 选择:
    • Open-source:Whisper / WhisperX(本地部署或 GPU 实例);优点成本可控但需要算力。
    • 商业 API:Google Speech-to-Text / Azure Speech / AssemblyAI(更高准确率与时间戳、实时转写选项)。
  • 搜索与跳转:在回放 UI 中点击转录中的句子可把播放器跳到对应时间。

九、前端回放界面要点

  • 播放器支持:seek、播放速率、音轨选择、字幕显示/隐藏、按参与者音量调整(若是分轨)。
  • 时间轴显示转录文字,支持按词或按句搜索并跳转。
  • 显示录制元数据与下载按钮(权限控制)。

十、监控与成本估算(粗略)

  • 存储:1 小时 720p 视频大约 300–1000 MB(取决于码率);音频仅 ~5–50 MB。按 1 GB/h 估算。
  • 转录费用:Whisper 本地成本(GPU小时)或商业 API 按分钟计费。
  • 计算:若使用 SFU + Recorder,大流量时需扩容 SFU 和转码服务。
  • 建议:先做 MVP(只录音或混合录制 mp4),再做分轨与实时转录。

十一、实施计划(建议迭代)

  • Sprint 0(设计/评估,1 周):选定 SFU(mediasoup/janus/现有服务),明确合规要求、存储选型。
  • Sprint 1(MVP,2–3 周):实现开始/停止录制、server-side 混合录制为 mp4、存储与回放页面、基本权限与通知。
  • Sprint 2(处理与转录,2 周):异步转录、生成 VTT、回放字幕与索引基础搜索。
  • Sprint 3(增强,2–4 周):分轨、剪辑导出、自动缩略图、完整审计与 retention 策略。
  • 上线与灰度:先对内部或小组灰度,再按需逐步扩展。

十二、测试要点

  • 功能测试:不同浏览器/设备的开始/停止、回放、下载、转录完整性。
  • 负载测试:并发录制、长时间录制稳定性、存储写入吞吐。
  • 隐私测试:同意流程、未同意者是否被排除、删除行为是否彻底。
  • 恢复测试:断网/断流后能否恢复并合并录制片段。

十三、风险与替代方案

  • 风险:浏览器不一致性导致 client-side 录制失败;SFU 复杂性与成本上升;转录质量受背景噪音影响。
  • 替代方案:初期只录制音频(实现更快、成本低),或只支持主持端录制(避免服务器端复杂度)。

如果你需要,我可以:

  • 把上述内容转成一个可直接放入 issue tracker(JIRA/GitHub)的任务模板(包含验收标准与 PR 要求)。
  • 基于某个具体 SFU(如 mediasoup)写更具体的架构与代码示例(录制流程、Recorder 服务伪代码、S3 上传)。
  • 生成前端组件的 UI 文案与交互流程图(同意弹窗、录制徽章、录制管理页)。
  • 给出成本估算表(按并发会议数/小时数、S3 存储/月、转录费用)。

你希望接下来怎么推进?(例如选择要输出:1) 一份 JIRA/PR 级别的需求定义,2) 详细的工程设计与调用示例,3) 前端/后端代码片段,或 4) 成本估算与时间表)