# 时间轴修复

时间轴修复是 DDTV 在每段录制完成后自动执行的"修复 + 转封装"流程,用来解决录出来的视频无法拖动进度条、时长显示错误、部分播放器打不开等问题。该功能默认开启,普通用户无需任何设置即可享受;本页主要解释它的工作原理,以及出问题时怎么手动处理。

# 为什么录出来的文件需要修复

DDTV 录制时是把网络上的直播流数据直接写入本地文件的:

  • HLS 模式(默认):把 fMP4 分片(m4s)逐个追加写入 _original.mp4
  • FLV 模式:把 FLV 流追加写入 _original.flv

这种方式快且省资源,但直播流的时间戳由主播端推流决定——主播网络卡顿、断线重推、PK 连线切换时,时间戳可能跳变或重置,直写出来的文件缺少正确的索引信息,播放器就会无法拖动进度条或显示错误时长。

# DDTV 的处理方法

每段录制结束后,DDTV 会自动调用 ffmpeg 对原始文件做一次转封装处理:

-y -i "{before}" -c copy "{after}"

-c copy 表示不重新编码,只是重新封装并按正确顺序重建索引/时间轴,速度快、无画质损失。处理完成后:

  • 原始文件:xxx_original.mp4(HLS)或 xxx_original.flv(FLV)
  • 修复后文件:xxx_fix.mp4

修复成功且文件大小符合预期时,源文件会被自动删除,最终你得到的就是一个可以正常播放、正常拖动的 xxx_fix.mp4

# 相关配置

配置文件 ./Config/DDTV_Config.ini(也可在 Desktop 设置页 / WEBUI 设置中修改):

配置项 默认值 说明
AutomaticRepair true 录制完成后自动修复/转码总开关
AutomaticRepair_Arguments -y -i "{before}" -c copy "{after}" 修复时执行的 ffmpeg 参数({before}/{after} 为占位符),想做真正的转码见自动转码
DeleteOriginalFileAfterRepair true 修复成功后删除 _original 源文件
TranscodeFileDifference 0.05 修复后文件允许的最大体积误差比例(默认 5%)。修复后文件比源文件小超过这个比例时,判定为异常,保留源文件
DetectErroneousFilesFixThem false 检测到修复结果异常时,改用 MKVToolNix 尝试高级修复(需要 MKVToolNix)
UsingCustomFFMPEG 自定义 ffmpeg 路径,如 D:/tools/ffmpeg.exe
RecordingMode 1 录制模式:1=Auto(优先 HLS,无 HLS 流时自动降级 FLV 兜底)、2=FLV_Only、3=HLS_Only

ffmpeg 路径优先级(Windows):UsingCustomFFMPEG 自定义路径 → ./Plugins/ffmpeg/ffmpeg.exe./Plugins/Plugins/ffmpeg/ffmpeg.exe;非 Windows 系统直接使用系统 PATH 中的 ffmpeg,因此 Linux/macOS 用户需要先自行安装 ffmpeg 并加入环境变量,否则修复/转码无法执行。

# 修复结果异常时会发生什么

  • 修复后的文件比源文件小超过 TranscodeFileDifference 设定的比例:判定修复结果异常,不删除源文件;若开启了 DetectErroneousFilesFixThem,会再尝试用 MKVToolNix 修复一次。配置了邮件通知时会收到"放弃转码"提醒邮件。
  • 修复过程本身出错(如 ffmpeg 不存在、参数错误):会在源文件旁生成 xxx_fix日志.log 记录 ffmpeg 的完整输出,配置了邮件通知时会收到"修复或转码失败"邮件,方便排查。

# 手动修复 fMP4 文件

如果某个 HLS 录制的 _original.mp4 在自动修复前就损坏了(例如录制中程序异常退出导致文件结构断裂),Desktop(桌面版)的"更多工具"页面提供了 fMP4 结构修复工具:它会扫描文件的 box 结构,提取所有有效的音视频分片(moof+mdat)重新封装成新文件,能救回大部分断裂的录制文件。

# 常见问题

  • 断流重连会不会产生很多碎文件? 不会。录制中断流重连是追加写入同一个文件(而非新建文件),只有触发切割才会分文件,详见文件合并自动切割
  • 修复会损失画质吗? 默认参数是 -c copy 转封装,不重新编码,无画质损失。如果你把 AutomaticRepair_Arguments 改成了真正的转码参数,则取决于你设置的编码参数。