使用 sox 将 mp3 文件批量转换为 wav

使用 sox 将 mp3 文件批量转换为 wav

对于单个 .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,它们的文件工作得很好。

答案1

听起来您遇到了文件名中空格的问题。如果您有一个名为“My Greatest Hits.mp3”的文件,您的命令将尝试转换名为“My”、“Greatest”和“Hits.mp3”的三个不同文件。不要使用“$()”语法,只需在 for 行中使用“*.mp3”,并确保在 sox 命令中引用文件名。

此外,basename 命令不会删除文件扩展名,而只会删除任何文件夹名称。所以这个命令将创建一堆带有“.mp3”扩展名的WAV文件。在命令中添加“-s .mp3”会告诉 basename 去除扩展名,然后将“.wav”放在末尾会添加正确的扩展名。

把它们放在一起,你就得到了这个:

for i in *.mp3
do
    sox "$i" "waves/$(basename -s .mp3 "$i").wav"
done

答案2

首先,不要ls那样使用,实际上并没有任何东西,因为无论如何,实际上是 shell 生成了 glob 中的文件名*mp3。另外,如果您的任何文件名称中包含空格,它就会中断。

至于错误,我认为sox这里尝试将 MP3 文件解释为 wav,因为您给出了标志-t wav。我认为你可以不用它,就像你在单文件情况下所做的那样。您只需要更改输出文件名的扩展名即可。basename如果你告诉它要删除什么,也可以删除后缀。

#!/bin/bash
for i in *.mp3
do
    sox "$i" "waves/$(basename "$i" .mp3).wav"
done

(反引号撇号是`quoting'文件名的一种古老习惯。反引号应该看起来像左侧引号,看起来像旋转的逗号(请参阅维基百科上的示例)。但从技术上讲,这是错误的,而且在大多数当前字体中看起来都很糟糕。)

答案3

显然,sox 表示它无法处理 mp3 格式文件。我非常有兴趣在您的系统上获取以下输出:

sox ./输入/文件名.mp3 ./输出/文件名.wav

因为你的 sox 似乎一般无法处理 mp3。是的,可以重新编译 sox 来处理 mp3,但是您的错误消息表明它正在读取文件,但它需要一个 wav: WAVE: RIFF header not found

关于空格问题的其他评论仍然适用,但该文件filename.mp3没有空格;这是一个 mp3。

相关内容