Video Conferencing with Durable Streams
摘要
使用 S2 durable streams 构建完整的视频会议应用。文章展示了如何将流既作为存储又作为传输介质,实现一个与众不同的视频会议架构。
核心亮点
核心洞察: 当流被视为存储原语而非仅仅是消息层时,许多实时应用程序变得更容易构建和运营。
架构设计
- 流作为存储 + 传输: 每个房间使用一组命名流
rooms/{room}/media/{user}→ 视频 + 音频 + 屏幕,交叉存储rooms/{room}/chat→ 持久聊天历史rooms/{room}/meta→ 加入/离开 + 控制事件(如举手)
关键简化
- 直播 = 流读取
- 录制 = no-op,流本身就是持久的
- 回放 = 另一个流读取
- MP4 导出 = 流读取 + ffmpeg 合成
无需单独的录制管道、回放数据库或后处理步骤!
技术细节
- Go 服务器使用
AppendSession批量写入(5ms 窗口) - 每个记录体是原始媒体负载,媒体类型作为 S2 记录头存储
- 每个参与者从当前尾部读取每个远程媒体流
- 可配置保留策略(5 秒到无限)
回放机制
回放不是特殊文件格式,服务器只是再次读取房间流:
- 读取 meta 流获取参与者历史和加入/离开事件
- 读取第一个媒体记录获取开始时间戳
- 使用
CheckTail()获取结束时间戳
MP4 导出
服务器读取每个参与者的媒体流,将音频和视频直接通过 ffmpeg 合成,流式传输到浏览器,无需中间文件。
相关项目
探索于 2026-03-20 via Lobsters