为何无法捕获soxi命令的verbose模式输出内容?
问题
我尝试从音频样本中获取循环起止点元数据,使用带有-V(verbose)参数的soxi命令。所需数据会显示在终端中,但无法被捕获或通过管道传递给后续命令。
执行soxi命令的示例:
$ soxi -V sample.aif soxi INFO formats: detected file format type `aiff' soxi INFO aiff: AIFF Loop markers: soxi INFO aiff: Loop 0: start: 75576 soxi INFO aiff: end: 103868 soxi INFO aiff: count: 1 soxi INFO aiff: type: soxi INFO aiff: forward soxi INFO aiff: Unity MIDI Note: 52 soxi INFO aiff: Low MIDI Note: 50 soxi INFO aiff: High MIDI Note: 53 Input File : 'sample.aif' Channels : 1 Sample Rate : 44100 Precision : 24-bit Duration : 00:00:03.80 = 167665 samples = 285.145 CDDA sectors File Size : 507k Bit Rate : 1.07M Sample Encoding: 24-bit Signed Integer PCM
但将输出重定向到文本文件时,顶部的INFO信息仍显示在终端,只有底部的常规信息被写入文件:
$ soxi -V sample.aif >> data.txt soxi INFO formats: detected file format type `aiff' soxi INFO aiff: AIFF Loop markers: soxi INFO aiff: Loop 0: start: 75576 soxi INFO aiff: end: 103868 soxi INFO aiff: count: 1 soxi INFO aiff: type: soxi INFO aiff: forward soxi INFO aiff: Unity MIDI Note: 52 soxi INFO aiff: Low MIDI Note: 50 soxi INFO aiff: High MIDI Note: 53 $ cat data.txt Input File : 'sample.aif' Channels : 1 Sample Rate : 44100 Precision : 24-bit Duration : 00:00:03.80 = 167665 samples = 285.145 CDDA sectors File Size : 507k Bit Rate : 1.07M Sample Encoding: 24-bit Signed Integer PCM
为何无法捕获包含所需数据的顶部输出内容?
解答
这是因为soxi把-V参数产生的INFO日志输出到了标准错误流(stderr),而常规的音频信息输出到了标准输出流(stdout)。默认的重定向操作>> data.txt只捕获stdout的内容,stderr的内容会直接打印到终端,不会被写入文件。
要捕获包含循环数据的INFO内容,可通过以下方式处理:
- 同时捕获stdout和stderr到同一文件:
其中soxi -V sample.aif >> data.txt 2>&12>&1表示将文件描述符2(stderr)的内容重定向到文件描述符1(stdout)的输出位置。 - 单独捕获stderr到指定文件:
soxi -V sample.aif >> data.txt 2>> loop_info.txt - 仅提取循环相关的INFO信息:
soxi -V sample.aif 2>&1 | grep -E "Loop 0: start|end"
内容的提问来源于stack exchange,提问作者Dan Weaver
相关产品推荐
相关产品推荐

