在 SoX 中将 .aiff 转换为 .wav

Converting .aiff to .wav in 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;

但是我在这两种情况下都收到一条错误消息 "cannot execute binary file"。此错误的来源可能是什么?

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

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

这个问题也和sox的文件属性有关。为了赋予它可执行属性,只需转到 sox 所在的文件夹和 运行 chmod +x sox 命令(您首先需要 root 访问权限)。

你链接到的两个片段在我看来有点粗略,因为它们使用了 lsecho
echo -e 实际上可能是导致语法错误的原因,因为 OSX (BSD) echo 没有 -e 选项。 (在终端中输入 man echo 以查看)。

我根据 find 及其 -exec 选项自由组装了另一种单线。

find -E . -maxdepth 1 -iregex '.*\.(aif|aiff)' -exec bash -c '[=10=] "" "${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

  • 中执行以下

这里有点复杂

  • '[=31=] "" "${1%.*}.wav"':这是在bashshell中调用运行。 [=32=] 将扩展到 program name. "" will expand to the first (and in this case, only) argument, enclosed in double quotes in case of white-spaces. "${1%.*}.wav" will also expand to the first argument, except it will strip away the last period and everything after,然后在末尾标记“.wav”。有效地替换文件扩展名。

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

  • 中称为 </code> </ul> <p>说的有点啰嗦,我也不是专家,所以我写的可能会有一些错误,但大纲应该是可靠的。</p> <p><sub>*这是 OSX 具体的,不太漂亮但更便携的选项是:</sub></p> <pre><code>find . -maxdepth 1 \( -iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '[=11=] "" "${1%.*}.wav"' sox {} \;