状态机
录制任务的创建、运行、停止、失败与重启语义,以及幂等与恢复。
状态机
录制会话只有一条合法路径,任何越级调用都返回负的错误码而不是被忽略。
idle ──Start──▶ starting ──sink.Start 成功──▶ recording ──Stop──▶ stopping ──产物校验通过──▶ stopped
│ │ │
└──sink.Start 失败─────────────┴────────────────────┴──▶ error| 状态 | 含义 | 触发 |
|---|---|---|
idle | 尚未开始 | 初始状态 |
starting | 已校验参数,正在启动 sink | RecordingPipeline::Start |
recording | sink 已就绪,可推帧 | sink 启动成功 |
stopping | 已停止推帧,等待封装收尾 | Stop |
stopped | 产物已校验(存在、非空、容器头、时长 > 0) | 校验通过 |
error | 启动/写入/校验失败 | 任一步失败,回调 onError |
非法转换
| 调用 | 当前状态 | 返回 |
|---|---|---|
Start | starting / recording / stopping | -ERR_INVALID_STATE |
PushVideoFrame | 非 recording | -ERR_INVALID_STATE |
Stop | 非 recording/starting | -ERR_INVALID_STATE |
joinChannel | 已存在会话 | -ERR_ALREADY_IN_USE |
leaveChannel | 无会话 | -ERR_LEAVE_CHANNEL_REJECTED |
为什么 stopped 不能假
stopped 只在 VerifyRecordingFile 通过后进入。校验失败时管线转入 error、lastError 记录错误码、output.verified 保持 false,并把失败原因回传给 joinChannel/leaveChannel/stopRecording 的调用方。测试 TestNoSilentSuccess 用一个「返回成功但没有产物」的假 sink 固定了这条约束。