在SoX中将.aiff转换为.wav

时间:2017-10-09 23:18:38

标签: audio sox

我在目录中有多个文件是.aiff格式,我想使用SoX将它们转换为.wav。我在this网站上尝试了代码,如下所示

theFiles = `/Users/me/RainbowAiff/*.aiff`; 
for eachFile in $theFiles; do v1=${eachFile%*.aiff}; 
oldFile="$v1.aiff"; newFile = "$v1.wav"; 
echo oldFile $oldFile; echo newFile $newFile; sox $oldFile $newFile; done

this网站,如下

for i in `/Users/me/RainbowAiff/ *.aiff`; do echo -e "$i"; sox $i $i.wav; echo -e "$i.wav"; done;

但是我在两个实例中都收到一条错误消息,说明"无法执行二进制文件"。可能是这个错误的根源是什么?

2 个答案:

答案 0 :(得分:1)

不兼容的二进制文件导致此错误see this question

如果file soxuname -a命令的输出表明二进制文件与操作系统之间存在差异,即x86与ARM,则需要为SoX找到正确的二进制文件。虽然自2015年以来没有SoX版本,但请检查thisthis以查找与您的系统兼容的版本。

问题还与sox的文件属性有关。为了给它提供可执行属性,只需转到sox所在的文件夹并运行chmod +x sox命令(首先需要root访问权限)。

答案 1 :(得分:1)

使用lsecho时,您链接的两个片段对我来说有点粗略。 echo -e实际上可能是语法错误,因为OSX(BSD)echo没有-e选项。 (在终端中键入man echo以查看)。

我冒昧地组装了一个基于find及其-exec选项的替代单线程。

find -E . -maxdepth 1 -iregex '.*\.(aif|aiff)' -exec bash -c '$0 "$1" "${1%.*}.wav"' sox {} \;

解释一下:

  • find:可以找到任何内容

  • -E:启用extended regex *

  • .:从当前工作目录开始。可以用相对或绝对路径替换

  • -maxdepth 1:仅在第一个目录层中查找。将1替换为2也可以在文件夹中找到文件,3也可以在文件夹中的文件夹中找到文件...
    删除此选项将启用完全递归(一直查找文件)

  • -iregex:使用不区分大小写的正则表达式

  • '.*\.(aif|aiff)':匹配以任意长度(.)开头的任何内容(*),后跟句点(\.)和字符串' AIF'或者' aiff' (或' AIF',' AIFF',' aiFF' ...)((aif|aiff)

  • -exec bash -c:在非交互式bash shell中执行以下操作

就在这附近会变得有点复杂

  • '$0 "$1" "${1%.*}.wav"':这是在bash shell中运行的调用。 $0将扩展为program name"$1"将扩展为第一个(在这种情况下,仅)参数,在白色空格的情况下用双引号括起来。 "${1%.*}.wav"也会扩展到第一个参数,除了它strip away the last period and everything after,然后标记为' .wav'在末尾。有效地替换文件扩展名。

  • sox {}:这些是传递给shell调用的参数。第一个(sox)是我们想要使用的程序,在调用中称为$0。第二个({})是find找到的文件,在shell调用中称为$1

那是相当满口的,我不是专家,所以我写的可能会有一些错误,尽管总体大纲应该是可靠的。

*这是特定于OSX的,不太漂亮但更便携的选项是:

find . -maxdepth 1 \( -iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '$0 "$1" "${1%.*}.wav"' sox {} \;