对于单个 .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。