文章

MiguDelay 架构 12:Output 实时延时与时钟

MiguDelay(DDLive)项目架构系列文档:Output 实时延时与时钟。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。

MiguDelay 架构 12:Output 实时延时与时钟

系列导航系列总览 · 上一篇:MiguDelay 架构 11:收流、探测、解复用与解码 · 下一篇:MiguDelay 架构 13:长延时文件链与 DelayFileReader

扫描基线

  • 项目:MiguDelay(DDLive)
  • 分支:refactor/video-frame-provider
  • HEAD:d28ec061406e4e3df93e3d1a92478d71a9ad4908
  • 工作树:clean
  • 扫描日期:2026-08-04
  • 说明:内容以当前 HEAD 源码为准;仓库旧架构文档只作为检索线索。

1. 定位

Output 是实时媒体调度中心:接收解码帧、建立两级缓存、按固定 tick 对齐音视频,并产生当前输入、InDelay、DelayedOutput、Aux、录制和推流 callback。它读取输出模式,但不拥有模式状态。

2. 输入与输出

输入

  • addVideoAVFrameInfo
  • addAudioAVFrameInfo
  • updateDelayTime
  • setRuntimeDependencies
  • setPushMute
  • reconnect/disconnect reset

输出

  • current video/audio preview
  • current original video/audio
  • InDelay preview/audio
  • delayed preview/original frames
  • Aux preview/original frames
  • push audio
  • audio level

3. 关键成员

成员 用途
first/second video deque 实时与延时级缓存
audio buffers/queues 多音轨采样缓存
m_tickThread 固定节拍输出
update-seconds thread 延时更新
MultiThreadYuvConverterAsync 预览色彩转换
IOutputModeSource 只读当前 mode
IAuxFrameSource 读取 Aux 帧
pending/active delay generation 标记延时配置真正生效

4. Tick 主循环

flowchart TD
    T["Output tick"] --> CLK["Initialize or read output clock"]
    CLK --> V["Select aligned video frame"]
    V --> A["Consume exact audio samples"]
    A --> M["Read current OutputMode"]
    M --> ROUTE["Route Delay Aux or muted output"]
    ROUTE --> CB["Publish preview record and push callbacks"]
    CB --> NEXT["Advance tick index"]

5. 时钟与同步

  • 输出时钟由基准 PTS 与 tick index 构成。
  • 每拍按 frame rate 计算目标 PTS。
  • 音频按 sample rate 与 tick index 计算本拍 sample 数。
  • 多音轨共享同一 sample timeline。
  • 缺轨可补零,避免一轨阻塞全部输出。
  • PTS discontinuity 触发 timeline reset。
  • 视频严重落后时可重同步 output clock。
  • m_TickMutex 保护同拍音视频操作。

6. 两级缓存

一级缓存吸收网络抖动,二级缓存体现 delay。当前预览与正式输出使用不同 deque,避免预览消费影响编码链。

7. 模式路由

  • Delay:延时视频 + 延时音频。
  • AuxWithAudio:Aux 视频 + Aux 音频。
  • AuxVideoOnly:Aux 视频 + 原延时音频。
  • MutedLive:非 Aux 视频路径,音频由 mute 机制处理。

outputmoderouting.h 提供纯路由判定,避免散落的布尔组合。

8. Runtime dependencies

setRuntimeDependencies() 原子发布 shared_ptr。tick 线程每拍读取本地快照;缺少 mode source 时安全退化为 Delay,缺少 Aux source 时视为无垫片帧。

9. 延时 configuration generation

updateDelayTime() 写 pending generation;只有缓存更新到安全边界才提升 active。此后 delayed video 携带 active generation,FrameAvailabilityTracker 才能证明新延时画面已真实产出。

10. 复杂度热点

Output 同时承担缓存、时钟、PTS 恢复、多轨音频、模式路由、Aux、Preview 和录制/推流 callback,是当前底层最重要的维护热点。

11. 源码证据

  • src/code/module/output/Output.h
  • src/code/module/output/Output.cpp
  • src/code/module/output/outputmoderouting.h
  • src/code/module/playback/outputmode/ioutputmodesource.h
  • src/code/module/playback/aux/iauxframesource.h

系列导航系列总览 · 上一篇:MiguDelay 架构 11:收流、探测、解复用与解码 · 下一篇:MiguDelay 架构 13:长延时文件链与 DelayFileReader

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