文章

MiguDelay 架构 14:录制、编码与原始复用

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

MiguDelay 架构 14:录制、编码与原始复用

系列导航系列总览 · 上一篇:MiguDelay 架构 13:长延时文件链与 DelayFileReader · 下一篇:MiguDelay 架构 15:推流、网络复用与重试

扫描基线

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

1. 真实实现

Orchestrator 根据主流快照分别提交视频录制和音频录制。StartRecordTask 当前实际实现是 video-only 与 audio-only 两条链;startRecordAudioVideo() 仍是空壳,因此上层拆分请求是当前合同。

2. 核心类

作用
StartRecordTask 构造 encoder 与 raw muxer
RecordContext 持有 encoder/muxer
视频 Encoder MPEG2、AVC、X264、NV HEVC
音频 Encoder AAC、PassThrough
RawVideoPacketMuxer 写视频数据与索引
RawAudioPacketMuxer 写音频数据
StopRecordTask take context 后停止

3. 视频录制链

sequenceDiagram
    participant T as StartRecordTask
    participant H as TaskHandle
    participant O as Output
    participant E as Video Encoder
    participant M as RawVideoPacketMuxer
    participant C as RecordContext

    T->>H: getRecvContext
    T->>C: create RecordContext
    T->>E: init and start encoder
    T->>O: register current original video callback
    T->>M: init video and index paths
    T->>E: register encoded video callback
    T->>M: startMuxer
    T->>H: setRecordContext

4. 音频录制链

1
2
3
4
5
Output.CurrentAudioFrameProcessed
  -> AACFFmpegEncoder or AudioDataPassThrough
  -> EncodedAudioFrameProcessed
  -> RawAudioPacketMuxer
  -> PCM recording file

5. 参数流

视频 encoder 使用尺寸、GOP、bitrate、color metadata、目标 pixel format、bit depth、frame-rate rational 和 context-pool size。Raw video header 保存编码类型、分辨率、帧率、pixel format 和完成标记。

音频参数来自对应 input track;audio index 决定注册哪一轨。Raw audio header 保存 sample format、sample rate、总/有效 channel 数和每视频帧 sample 数。

6. 生命周期

  • recv context 必须存在。
  • recordId 不得占用。
  • encoder/muxer init 或 start 失败则不发布成功。
  • setRecordContext() 是最终注册门。
  • stop 使用 takeRecordContext(recordId)
  • RecordContext 析构顺序:muxer → video encoder → audio encoder。

7. 类调用总链

1
2
3
4
5
6
7
8
9
TaskOrchestrator
  -> TaskHandleGateway.startRecord
  -> LegacyTaskHandleAdapter
  -> TaskHandle.addTask
  -> StartRecordTask.execute
  -> Output callback
  -> EncoderBase
  -> MuxerBase
  -> record files

8. 源码证据

  • src/code/module/taskhandle/record/StartRecordTask.cpp
  • src/code/module/taskhandle/record/StopRecordTask.cpp
  • src/code/module/encoder/**
  • src/code/module/muxer/rawdatamuxer/**

系列导航系列总览 · 上一篇:MiguDelay 架构 13:长延时文件链与 DelayFileReader · 下一篇:MiguDelay 架构 15:推流、网络复用与重试

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