MiguDelay 架构 15:推流、网络复用与重试
MiguDelay(DDLive)项目架构系列文档:推流、网络复用与重试。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。
系列导航:系列总览 · 上一篇:MiguDelay 架构 14:录制、编码与原始复用 · 下一篇:MiguDelay 架构 16:输出模式
扫描基线
- 项目:
MiguDelay(DDLive)- 分支:
refactor/video-frame-provider- HEAD:
d28ec061406e4e3df93e3d1a92478d71a9ad4908- 工作树:clean
- 扫描日期:2026-08-04
- 说明:内容以当前 HEAD 源码为准;仓库旧架构文档只作为检索线索。
1. 启动时机
push request 在主 receive ready 后准备,但首次 startPush 等待当前 generation 的第一帧 DelayedOutput video,防止延时输出尚未建立时启动编码。
2. 核心类
| 类 | 职责 |
|---|---|
StartPushTask |
创建视频、多轨音频 encoder 和网络 muxer |
PushStreamContext |
保存 encoder、muxer 与音轨映射 |
| AVC/NV HEVC Encoder | 输出视频编码 |
AACFFmpegEncoder |
每输入音轨一个编码器 |
NetStreamMuxer |
FFmpeg 网络封装与发送 |
PushRetryController |
领域级重试 timer |
TaskOrchestrator |
校验并重新提交 |
3. 媒体链
flowchart LR
D["Delayed video"] --> VE["Video encoder"]
A["Aux video"] --> VE
DA["Delayed or push audio"] --> AE["Audio encoders"]
VE --> VM["Encoded video packets"]
AE --> AM["Encoded audio packets"]
VM --> M["NetStreamMuxer"]
AM --> M
M --> N["RTMP or SRT endpoint"]
视频 encoder 注册 delayed、Aux 和 file-output delayed callback;音频 encoder 注册实时 Output 与 file Output 的 push-audio callback。
4. Muxer 初始化
每个 muxer 取得 protocol、destination URL、video codec context、选择的 audio track、audio codec context 和 track-to-stream mapping。packet callback 使用 weak_ptr,避免 muxer 销毁后悬空。
5. Legacy 单槽限制
TaskHandle 当前以 key 0 保存 push context。新层可以维护 typed 资源账本,但底层仍是单推流槽模型;未来支持多任务或多组输出前必须先明确 key 语义。
6. 失败重试
sequenceDiagram
participant W as Push Worker
participant G as TaskHandleGateway
participant O as TaskOrchestrator
participant R as PushRetryController
W-->>G: start push failed
G-->>O: current generation failure
O->>R: handleFailure
alt timer not pending
R->>R: increment attempt and start timer
R-->>O: retryRequested
O->>O: verify Running and generation
O->>G: startPush prepared request
else duplicate failure
R->>R: keep one timer
end
当前固定间隔 3000ms、无最大 attempt、同一窗口只有一个 pending timer。success、stop、restart 和 shutdown 会清理 timer。
7. 仅地址变化
restartPush() 冻结最新 request;无当前 push 时直接启动,有 push 时先 stop。stop pending 期间新地址只替换 pending request,成功后只启动最后一次地址。
8. 源码证据
src/code/module/taskhandle/pushstream/StartPushTask.cppsrc/code/module/taskhandle/pushstream/StopPushTask.cppsrc/code/module/encoder/**src/code/module/muxer/ffmpeg/NetStreamMuxer-FFmpeg.*src/code/module/playback/retry/pushretrycontroller.*
系列导航:系列总览 · 上一篇:MiguDelay 架构 14:录制、编码与原始复用 · 下一篇:MiguDelay 架构 16:输出模式