You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash环境下VMAF命令输出无法重定向至文件的问题咨询

解决VMAF命令输出重定向为空的问题

我来帮你拆解下问题根源,以及对应的解决办法:

可能的原因

VMAF的输出行为和FFmpeg存在差异,导致你用&>重定向时无法捕获内容,主要有两种常见情况:

  1. 输出缓冲机制差异
    当程序输出到终端时,通常采用行缓冲(输出一行就立即刷新),但重定向到文件时,很多程序会切换为全缓冲(攒够一定字节数才写入文件)。VMAF大概率属于这种情况,命令执行过程中缓冲未被刷新,导致文件看起来是空的。

  2. 输出直接写入终端设备
    部分程序会刻意将输出直接写到终端设备(/dev/tty),而非标准输出(stdout)或标准错误(stderr)。这种情况下,普通的重定向命令(包括&>)无法捕获这些内容,因为它们绕过了标准流通道。

具体解决办法

方法1:使用VMAF自带的输出参数(推荐)

VMAF通常支持直接指定输出文件的命令行参数,比如--output(可简写为-o),这是最可靠的方式:

vmaf -r "r.Y4M" -d "d.Y4M" --threads=24 --output result.txt

直接让程序把结果写入目标文件,完全避开流捕获的问题。

方法2:禁用输出缓冲

如果VMAF没有自带输出参数,可以用stdbuf命令强制启用行缓冲,让输出实时写入文件:

stdbuf -oL -eL vmaf -r "r.Y4M" -d "d.Y4M" --threads=24 &> result.txt
  • -oL:对标准输出(stdout)启用行缓冲
  • -eL:对标准错误(stderr)启用行缓冲

方法3:用script捕获终端输出

如果VMAF确实是直接写入终端设备,script命令可以帮你捕获所有终端交互内容:

script -q -c 'vmaf -r "r.Y4M" -d "d.Y4M" --threads=24' result.txt
  • -q:静默模式,不显示script本身的启动/结束提示
  • -c:指定要执行的目标命令

为什么FFmpeg可以正常工作?

FFmpeg默认将日志和结果输出到标准错误(stderr),而&>会同时捕获stdout和stderr。另外FFmpeg的输出缓冲策略更友好,即使重定向到文件也会及时刷新缓冲,所以你之前的方法能直接生效。

内容的提问来源于stack exchange,提问作者Wilhelm Olejnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:18:10