Bash环境下VMAF命令输出无法重定向至文件的问题咨询
解决VMAF命令输出重定向为空的问题
我来帮你拆解下问题根源,以及对应的解决办法:
可能的原因
VMAF的输出行为和FFmpeg存在差异,导致你用&>重定向时无法捕获内容,主要有两种常见情况:
输出缓冲机制差异
当程序输出到终端时,通常采用行缓冲(输出一行就立即刷新),但重定向到文件时,很多程序会切换为全缓冲(攒够一定字节数才写入文件)。VMAF大概率属于这种情况,命令执行过程中缓冲未被刷新,导致文件看起来是空的。输出直接写入终端设备
部分程序会刻意将输出直接写到终端设备(/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
相关产品推荐
相关产品推荐

