文章

MiguDelay 架构 13:长延时文件链与 DelayFileReader

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

MiguDelay 架构 13:长延时文件链与 DelayFileReader

系列导航系列总览 · 上一篇:MiguDelay 架构 12:Output 实时延时与时钟 · 下一篇:MiguDelay 架构 14:录制、编码与原始复用

扫描基线

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

1. 目的

长延时时,系统将收录文件作为中间介质。DelayFileReader 读取视频数据、索引和音频文件,解码视频后送入 OutputWithLocalFileReader

2. 核心类

职责
DelayFileReader 跨分片读取视频索引、视频数据和音频数据
FileReader 底层文件读
MultiThreadIFrameDecoderSync 编码视频帧同步解码
OutputWithLocalFileReader InDelay/Delay 队列、音频 buffer、本地 tick
legacy reconfiguration session 运行中替换 reader 与输出链

3. Reader 初始化

DelayFileReaderInfo 包含视频文件、代理/索引文件、音频文件、decoder thread count 和 delay seconds。

sequenceDiagram
    participant B as Start or Reconfiguration Binding
    participant R as DelayFileReader
    participant F as FileReader
    participant D as MultiThread Decoder
    participant O as OutputWithLocalFileReader

    B->>R: initReader paths and delay
    R->>F: open video index and audio files
    R->>D: initialize decoder
    R->>O: set delayed video queue
    B->>R: startReader
    R->>R: readFileThreadFunc
    R->>D: submit encoded video
    D-->>R: decoded frame
    R-->>O: enqueue video and audio

4. 跨文件读取

Reader 维护 current file/proxy/audio path、suffix index、视频/音频位置和 packet/fragment 计数。handleCrossFile() 切换分片,视频根据索引定位 packet,音频按对应位置读取。

5. 读速监控

最近五秒 bucket 记录视频读取帧数,并依据期望帧率计算低速阈值。该机制用于诊断和恢复,不直接改任务 phase。

6. File Output

flowchart LR
    REC["Record files"] --> R["DelayFileReader"]
    R --> ID["InDelay queues"]
    R --> DD["Delayed queues"]
    ID --> O["OutputWithLocalFileReader tick"]
    DD --> O
    AUX["IAuxFrameSource"] --> O
    MODE["IOutputModeSource"] --> O
    O --> PRE["Preview callbacks"]
    O --> ENC["Push encoders"]

OutputWithLocalFileReader 有独立本地 tick、InDelay/Delayed 视频队列、音频 buffer、同步 YUV converter 和 cache readiness。AuxVideoOnly 模式下视频缓存缺口会生成静音音频切片,维持时钟连续。

7. 长延时重配置

  • 新 reader 使用当前 record-version 路径初始化。
  • 新链初始化成功后才释放旧 reader。
  • 失败保留旧链。
  • operation generation 写入 Output pending generation。
  • 只有新版本 delayed video 到达后才允许返回 Delay。

8. 关闭

停止 read thread、decoder 和 FileReader,detach Output queue/buffer,最后 OutputWithLocalFileReader::uninit() 停止 tick 与 converter。

9. 源码证据

  • src/code/module/filereader/delayfilereader/DelayFileReader.*
  • src/code/module/filereader/FileReader.*
  • src/code/module/output/OutputWithLocalFileReader.*
  • src/code/module/decoder/video/ffmpeg/MultiThreadIFrameDecoderSync.*

系列导航系列总览 · 上一篇:MiguDelay 架构 12:Output 实时延时与时钟 · 下一篇:MiguDelay 架构 14:录制、编码与原始复用

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