两个管道之间的袜子

Seb*_*bMa 4 pipe audio sox

我试图将“sox”实用程序放在两个管道命令中,以将单声道 44kHz 音频文件重新采样为 16kHz 音频文件。

它适用于单个管道:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k toto.wav
Run Code Online (Sandbox Code Playgroud)

但是当我添加另一个管道时,sox 实用程序会抱怨:

$ speexdec toto.oga - | sox -V -t raw -b 16 -e signed -c 1 -r 44.1k - -r 16k - | cat - > toto.wav
sox FAIL formats: can't determine type of `-'
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

小智 7

您需要通过-t wav在第二个之前添加来声明 sox 输出的类型-

当它是一个文件名时,sox 会查看名称并从那里推断出类型,但是当它是 stdout 时,需要声明类型。

您可能还想声明所有其他设置 ( -b 16 -e signed -c 1) 而不是假设它们是从输入传输的;所有在最后-一个提名输出之前。


chi*_*rlu 5

当您给出明确的文件名时,例如toto.wav,SoX 将从.wav扩展名推断出它应该使用 WAV 格式。如果是-输出\xe2\x80\x9c文件名\xe2\x80\x9d,则无法进行\xe2\x80\x99d的推导,因此必须使用 显式指定类型-t wav。如果您想为文件指定不同的扩展名 ( toto.sound) 或根本不指定扩展名 ( toto),则同样适用。

\n\n

与此无关的一点是,WAV 文件将所包含音频的长度存储在文件开头。在您的情况下,当文件的该部分写入管道时,最终长度是\xe2\x80\x99t 未知的;因此,将写入指示 \xe2\x80\x9cunknown length\xe2\x80\x9d 的值。这可能是也可能不是问题,具体取决于您要对文件执行的操作。

\n