文章

MiguDelay 架构 15:推流、网络复用与重试

MiguDelay(DDLive)项目架构系列文档:推流、网络复用与重试。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。

MiguDelay 架构 15:推流、网络复用与重试

系列导航系列总览 · 上一篇: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.cpp
  • src/code/module/taskhandle/pushstream/StopPushTask.cpp
  • src/code/module/encoder/**
  • src/code/module/muxer/ffmpeg/NetStreamMuxer-FFmpeg.*
  • src/code/module/playback/retry/pushretrycontroller.*

系列导航系列总览 · 上一篇:MiguDelay 架构 14:录制、编码与原始复用 · 下一篇:MiguDelay 架构 16:输出模式

本文由作者按照 CC BY 4.0 进行授权