MiguDelay 架构 12:Output 实时延时与时钟
MiguDelay(DDLive)项目架构系列文档:Output 实时延时与时钟。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。
系列导航:系列总览 · 上一篇: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. 输入与输出
输入
addVideoAVFrameInfoaddAudioAVFrameInfoupdateDelayTimesetRuntimeDependenciessetPushMute- 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.hsrc/code/module/output/Output.cppsrc/code/module/output/outputmoderouting.hsrc/code/module/playback/outputmode/ioutputmodesource.hsrc/code/module/playback/aux/iauxframesource.h
系列导航:系列总览 · 上一篇:MiguDelay 架构 11:收流、探测、解复用与解码 · 下一篇:MiguDelay 架构 13:长延时文件链与 DelayFileReader