v0.6.0-beta: stdout 重定向(管道)时,下载开始后的全部输出积压到进程退出才写出(Spectre.Console 0.52.1→0.57.1 回归)
Author: iibyteCoderCreated Aug 2, 2026Updated Aug 2, 2026
环境
- Windows 11 x64
- 对比版本:v0.6.0-beta (df70f0b, 20260628) vs v0.5.1-beta (20251029)
复现
将 stdout 重定向到管道(任何 GUI 包装器的典型场景)运行任意下载,按时间戳观察输出到达时机:
N_m3u8DL-RE.exe <任意m3u8> --auto-select --skip-merge --ffmpeg-binary-path <ffmpeg> > out.bin 2>&1实际行为
- v0.5.1-beta:进度帧(
Vid <desc> ------ N/M x% size speed eta)按约 100ms 刷新实时逐帧写出,日志逐行到达,进程退出时无积压输出。 - v0.6.0-beta:进度显示启动(
Progress.StartAsync)之后的所有输出——包括保存文件名、开始下载...、读取媒体信息...、Done等日志行,以及全部进度帧——都积压在进程内部,仅在进程退出瞬间一次性写出(实测为约 13KB 的单个块,EOF 前管道中无任何数据)。
带时间戳的抓包对比(v0.6.0-beta):
[+ 2.88s] OUT: ...已选择的流 / 写出meta json ← 最后一批实时到达的输出
[+16.43s] OUT FINAL(13554B): 保存文件名...开始下载...Vid ...0/8...1/8...8/8 100%...Done ← 全部积压到退出
[+16.43s] EXIT=0v0.5.1-beta 同场景:
[+ 5.06s] OUT: 开始下载...Vid 1264x528 | ... ← 实时
[+ 5.26s] OUT: Vid ... ------ 0/8 0.00% - 0.00Bps --:--:-- ← 进度帧实时逐帧
[+ 7.07s] OUT: Vid ... ------ 1/8 12.50% ...
[+ 7.88s] OUT: Vid ... ------ 8/8 100.00% ...
[+ 7.88s] EXIT=0 ← 无积压影响
所有通过管道解析输出的 GUI 包装器在下载过程中完全拿不到进度数据,进度显示失效;退出时的一次性倾泻还会被 NonAnsiWriter 的 [\r\n] + 正则剥掉换行,粘成无 \n 的单块,进一步增加解析方难度。
定位
回归来自 44861b1(2026-06-27)将 Spectre.Console 从 0.52.1-preview.0.5 升级到 0.57.1(次日随 v0.6.0-beta 发布)。0.57.1 重写了 ANSI 管线(独立的 Spectre.Console.Ansi 包:AnsiWriter / RenderPipeline / IRenderHook),live Progress 显示在非终端输出下的写出时机随之改变。Program.cs 的重定向检测分支(Console.IsOutputRedirected → ForceAnsiConsole + NoAnsiColor)与 NonAnsiWriter 代码在此期间未变。
建议(供您选择)
- 回退 Spectre.Console 至
0.52.1-preview.0.5(恢复 0.5.1-beta 行为); - 或在重定向模式下改用非 live 的逐行进度输出(每次刷新以独立日志行写出);
- 或增加一个面向 GUI 场景的"行缓冲/即时刷新进度输出"开关。
如需要,我可以补充更完整的抓包数据与最小复现脚本。
Source: nilaoda/N_m3u8DL-RE