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

一、目标与高层功能
- 功能目标:为 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) 成本估算与时间表)