你发的标题很简短——“548. PotatoChat会议录制功能”。我不确定你是要一份产品/功能规格、技术设计、代码实现、还是只想讨论需求与优先级。下面先给你一个从产品到技术的完整蓝图(包含 MVP 建议、架构选型、关键细节与 API 示例),你可以据此决定下一步需要哪部分深入(比如具体代码样例、数据库表结构、前端集成示例等)。

一、目标(Scope)
- 在 PotatoChat 中为在线会议提供录制功能,支持录制音视频并保存、回放、下载、分享与转写(可选)。
- 要点:可靠、可扩展、安全、支持多客户端(Web/iOS/Android)。
二、用户故事(示例)
- 会议主持人可以在会议开始时点击“开始录制”,结束时点击“停止录制”。
- 录制过程中可视化显示“正在录制”徽章。
- 完成后生成录制文件并通知主持人/与会者,支持在线播放、下载、分享链接、删除、设置访问权限。
- 支持按发言人分轨录制(可选)、自动转录并生成可搜索文本(可选)。
三、MVP(最小可行版)建议
核心功能快速交付的优先级:
- Server-side 混合录制(单文件 MP4 或 WebM,含音频与视频)并保存到对象存储(S3)。
- UI 控制:开始/停止录制、录制状态指示、录制列表与下载。
- 权限:仅主持人/有权限的用户可启动/停止与访问录制。
- 通知与基本元数据(时长、大小、时间戳、参与者列表)。
可后续增加:单轨分离、转录/字幕、章节/剪辑、逐帧索引、自动摘要、P2P/端侧录制选项。
四、录制方式对比(优缺点)
- 客户端(端侧)录制:每个客户端本地保存或上传。优:简单、资源分散;缺:不可靠(掉线、权限)、合并困难、多轨同步复杂。
- 服务端(SFU/MCU)录制:在媒体服务器端抓取流并合成录制。优:可靠、可控、可做混流与单轨分离;缺:需媒体服务器、成本较高。建议采用服务端录制(SFU + 录制组件)。
- 第三方服务(Agora/Twilio)录制:快速集成,托管。优:快速、可扩展;缺:成本、受限于第三方特性。
五、技术方案(推荐)
- WebRTC + SFU(如 mediasoup、Janus、Jitsi、LiveSwitch)用于实时通话。SFU 负责转发媒体流并输出给各参会者。
- 录制组件(inside SFU 或独立 Recorder 服务)订阅 SFU 的流,执行:
- 混流(合成画面 + 主音轨)或
- 多轨保存(每个参与者单独音/视频轨 + 合成视图)
- 编码/封装:视频 VP8/H.264,音频 Opus,封装为 MP4 (需要转码) 或 WebM(直接封装 VP8/Opus)。
- 存储:对象存储(S3 或兼容),并启用生命周期策略与 CDN 分发。
- 元数据:数据库(例如 PostgreSQL)保存录制记录与权限信息。
- 转录:可用 Whisper、Azure/Google Speech-to-Text、AWS Transcribe 等;做完后把字幕(VTT)和全文文本(JSON)关联到录制记录。
- 安全:HTTPS/WSS、录制文件加密(SSE-KMS 或应用层加密)、访问控制(signed URLs、token 校验)。
- 监控/日志:录制失败率、存储成本、时长分布、错误原因。
六、核心组件与流程(简化)
- 会话建立:客户端通过信令服务器与 SFU 建立 WebRTC 会话。
- 发起录制:主持人点击“开始录制” -> 前端发送控制请求到后端 Recording API -> 后端指示 SFU/Recorder 开始订阅该会议的流并开始写入临时容器(分片)。
- 录制进行中:Recorder 按时间段(例如每 5 分钟)写出分片,避免单文件太大;并在结束后合并或保持分片供回放 concat。
- 完成录制:Recorder 停止并上传最终文件到 S3,同时写入 db(路径、时长、参与者、转码状态)。
- 通知:向主持人/会议参与者发送通知,提供回放链接(可临时签名)。
- 回放:前端使用 HLS/DASH 或直接播放 MP4/WebM 文件;若需要剪辑/多轨则提供 UI。
七、数据模型(示例)
Recording {
id,
meeting_id,
started_at,
stopped_at,
duration,
size_bytes,
storage_url,
playback_url,
status (processing/ready/failed),
owner_user_id,
tracks_info (json: per participant tracks),
transcript_id (optional),
created_at,
updated_at
}
八、REST API(示例)
- POST /meetings/{meeting_id}/recordings/start -> 触发录制(需权限)
- POST /meetings/{meeting_id}/recordings/stop -> 停止录制
- GET /meetings/{meeting_id}/recordings/ -> 列表
- GET /recordings/{recording_id} -> 详情(含 playback_url、meta)
- POST /recordings/{id}/share -> 生成分享链接 / 改权限
- DELETE /recordings/{id} -> 删除录制
返回中可包含 signed URL(有效期)或 HLS 播放地址。
九、并发与扩展性要点
- 使用 SFU 集群 + 录制服务水平扩展;对热会议用单独实例录制。
- 录制流程异步化:录制完成后用消息队列(Kafka/RabbitMQ)通知后续处理(转码、生成缩略图、转录)。
- 存储分层:热文件保留较短时间(如 30 天),长期归档到更便宜的存储。
- 成本控制:按时长/分辨率计费,支持只录音/只录像以降低成本。
十、安全与合规
- 合法合规:明确通知/征得与会者录音录像同意(法律要求视地区而定)。
- 访问控制:只有授权用户可访问录制内容,外链使用签名 URL + 过期时间。
- 隐私:对敏感数据转写要小心,可能需要数据删除与保留策略。
- 日志与审计:记录谁发起/访问/下载录制。
十一、可选高级功能(Roadmap)
- 单轨保存并支持按发言人剪辑与导出。
- 自动转录 + 说话人分离(diarization)与时间轴(subtitle/VTT)。
- 智能摘要(关键片段提取)、关键词搜索。
- 视频剪辑/标注、章节化、时间标注分享。
- 端侧录制作为备选(在网络丢失情况下可以恢复部分内容)。
十二、示例技术栈建议
- 实时:mediasoup / Janus / Jitsi / LiveKit(依据团队熟悉程度)
- 后端:Node.js/Go/Python + PostgreSQL + Redis
- 消息:RabbitMQ / Kafka
- 存储:AWS S3 (或 MinIO)
- 转码:FFmpeg(Docker)或使用云转码服务
- 转录:OpenAI Whisper / Azure / Google / AWS
- 前端播放:video.js 或 hls.js(若使用 HLS)
如果你希望,我可以:
- 基于你现在的架构(说一下你现在用的 SFU/信令/后端),给出更具体的实现方案与步骤;
- 给出详细的 API 规范、数据库表结构和示例 SQL;
- 给出 Recorder 服务的伪代码或 Node.js + FFmpeg 的实现示例;
- 给出前端集成示例(WebRTC + 控制录制按钮)以及示例 UI 文案(合规提示)。
你想从哪部分开始?(例如:“给我一个基于 mediasoup 的录制实现示例”,或“先出产品需求文档(PRD)”)