对于单个 .mp3,我可以使用将其转换为 wav
sox ./input/filename.mp3 ./output/filename.wav
我试过了:
#!/bin/bash
for i in $(ls *mp3)
do
sox -t wav $i waves/$(basename $i)
done
但它会引发以下错误:
sox FAIL formats: can't open input file `filename.mp3': WAVE: RIFF header not found
我将如何对输入文件夹中的所有 mp3 文件运行这个 sox 转换并将生成的 wav 保存到输出文件夹?
PS:我不知道为什么它显示包含在反引号(`)和撇号之间的文件'
`文件名.mp3'
我播放了所有的 mp3,它们完美地工作。
听起来您遇到了文件名中的空格问题。如果您有一个名为“My Greatest Hits.mp3”的文件,您的命令将尝试转换名为“My”、“Greatest”和“Hits.mp3”的三个不同文件。不要使用“$()”语法,只需在 for 行中使用“*.mp3”,并确保在 sox 命令中引用文件名。
此外,basename 命令不会删除文件扩展名,只会删除任何文件夹名称。所以这个命令将创建一堆带有“.mp3”扩展名的WAV文件。在命令中添加“-s .mp3”会告诉 basename 去除扩展名,然后在末尾加上“.wav”会添加正确的扩展名。
把它们放在一起,你就有了:
首先,不要那样使用
ls
,它实际上并没有做任何事情,因为无论如何它实际上是在 glob 中生成文件名的 shell*mp3
。另外,如果您的任何文件的名称中有空格,它就会中断。至于错误,我认为
sox
这里试图将 MP3 文件解释为 wav,因为您给出了-t wav
标志。我认为你可以没有它,就像你在单文件案例中所做的那样。您也只需要更改输出文件名的扩展名。basename
如果你告诉它要删除什么,也可以删除后缀。(反引号撇号是
`quoting'
文件名的一种古老习惯。我的反引号应该看起来像左边的引号,看起来像一个旋转的逗号(参见维基百科上的例子)。但从技术上讲,这是错误的,并且在大多数当前字体中看起来很糟糕。)显然,sox 表示它无法处理 mp3 格式文件。我很想在您的系统上获得以下输出:
sox ./input/filename.mp3 ./output/filename.wav
因为您的 sox 似乎通常无法处理 mp3。是的,可以重新编译 sox 以处理 mp3,但您的错误消息表明它正在读取文件,但它需要一个 wav:
WAVE: RIFF header not found
。关于空格问题的其他评论仍然普遍适用,但文件
filename.mp3
没有空格;这是一个mp3。