Checkpoint: v4.0 media service, compose deploy, and verified docs

这个提交包含在:
cryptocommuniums-afk
2026-03-14 21:45:31 +08:00
父节点 27083d5af9
当前提交 d5431aee0e
修改 41 个文件,包含 4056 行新增883 行删除

65
docs/media-architecture.md 普通文件
查看文件

@@ -0,0 +1,65 @@
# Media Architecture
## Responsibilities
Node 应用负责:
- 用户登录
- 训练计划与分析业务
- 视频库元数据写入
- 开发时 `/media` 同源代理
Go 媒体服务负责:
- 创建录制会话
- WebRTC 信令交换
- 接收分段上传
- 写入关键片段标记
- 会话 finalize
- 归档与回放资源生成
## HTTP API
- `POST /media/sessions`
- `POST /media/sessions/{id}/signal`
- `POST /media/sessions/{id}/segments?sequence={n}&durationMs={ms}`
- `POST /media/sessions/{id}/markers`
- `POST /media/sessions/{id}/finalize`
- `GET /media/sessions/{id}`
- `GET /media/sessions/{id}/playback`
- `GET /media/health`
## Session lifecycle
- `created`: 会话已建立,等待录制
- `recording`: 正在录制或接收分段
- `streaming`: WebRTC 连接已建立
- `reconnecting`: 摄像头或连接中断,客户端正在恢复
- `finalizing`: 会话完成,等待 worker 归档
- `archived`: 回放已生成
- `failed`: 上传、信令或归档失败
## Storage model
每个会话目录包含:
- `session.json`: 会话状态和 marker 元数据
- `segments/`: 原始分段
- `concat.txt`: FFmpeg 拼接清单
- `public/sessions/<id>/recording.webm`
- `public/sessions/<id>/recording.mp4`
## Archive flow
1. 浏览器 `finalize`
2. 会话状态变为 `ArchiveQueued`
3. worker 读取全部分段
4. 优先直接 concat,失败则重新编码为 WebM
5. 可用时生成 MP4 归档
6. 写回 playback URL 和文件大小
## Constraints
- 当前为单机本地卷模型,不依赖对象存储
- 当前 WebRTC 仅用于浏览器到服务端的实时上行,不做多观众直播分发
- Safari 原生 MP4 录制不在当前目标内