【问题标题】:Converting .aiff to .wav in SoX在 SoX 中将 .aiff 转换为 .wav
【发布时间】:2017-10-09 23:18:38
【问题描述】:

我在一个目录中有多个 .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


    【解决方案1】:

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

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

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

    【讨论】:

    • file sox 的输出是Mach-O 64-bit executable x86_64uname -a 的输出是14.5.0 Darwin Kernel Version 14.5.0: Tue Apr 11 16:12:42 PDT 2017; root:xnu-2782.50.9.2.3~1/RELEASE_X86_64 x86_64 这些不兼容吗? (我不熟悉二进制文件)。感谢您的帮助。
    • 我不是Mac用户,很遗憾,我不熟悉它。不过,它们似乎都是 64 位的。可以试试用su命令切换到root用户,进入sox所在目录,然后运行chmod +x sox吗?然后尝试再次运行它,最好使用sudo sox,并使用root 权限。此外,人们似乎在 Mac 中也有类似的问题,因此您可能想尝试安装旧版本的 sox,它可能兼容:stackoverflow.com/questions/13499871/…
    • 这行得通,但现在我收到语法错误。我想这应该是一个单独的问题。谢谢!
    • 不客气。请问:chmod +x sox 或安装旧版本是否有助于运行它?我问的原因是我可以编辑我的答案,使其涵盖所有相关步骤。
    • chmod +x sox 似乎有效,或者至少给我一个不同的错误信息。
    【解决方案2】:

    您链接到的两个 sn-ps 在我看来有点粗略,因为它们使用了 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 {} \;
    

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多