在SoX中将.aiff转换为.wav

问题描述 投票:3回答:2

我在目录中有多个文件是.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;

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

audio sox
2个回答
1
投票

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

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

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


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 {} \;
© www.soinside.com 2019 - 2024. All rights reserved.