bash -/usr/local/bin/ffmpeg : cannot execute binary file

标签 bash macos

想要使用脚本将我的 m4a 文件转换为 mp3 文件。这会节省一些时间...我有超过 100 GB 的音乐文件。

操作系统:OSX10.14/终端与 Bash 脚本

我可以从终端运行ffmpeg -v 5 -y -i musicFile.m4a -acodec libmp3lame -ac 2 -b:a 320k musicFile.mp3。它会转换文件,我可以从 iTunes 中查看和播放该文件。

当我从 bash 脚本运行相同的内容时,它无法转换。

ffmpeg -v 5 -y -i $ENTRY_FILE -acodec libmp3lame -ac 2 -b:a 320k $MP3NAME

我的 ipod nano 刚刚坏了,我买了一个新的 mp3 播放器。现在我需要将 iTunes 文件从 AAC 格式转换为 MP3。 ffmpeg是一个成熟的视频和音乐文件转换器。

当我从 bash 脚本运行它时,我尝试了一些操作。

我在文件前面添加了./,但失败了,因为它安装在/usr/local/bin下而不是在同一目录下。

我还尝试了 sh ffmpeg...这让我无法执行二进制文件。

#!/usr/bin/env bash

# convert m4a file to mp3
set -e

file_convert() {
    ENTRY_FILE=$(printf %q "${entry}")
    FILE_NAME=$(printf %q "$(basename "${entry}")")
    DIR=$(printf %q "$(dirname "${entry}")")
    NAME="${FILE_NAME%.*}"
    EXT="${FILE_NAME##*.}"
    MP3NAME="${DIR}/${NAME}.mp3"

    printf "%*s%s\n"                    $((indent+2)) '' "$ENTRY_FILE"
    printf "%*s\tNew File :\t%s\n"      $((indent+2)) '' "$MP3NAME"

    if [ $EXT == "m4a" ]
    then
      printf "%*s\tConverting: \t%s\n" $((index+2)) '' "$ENTRY_FILE"
      ffmpeg -v 5 -y -i $ENTRY_FILE -acodec libmp3lame -ac 2 -b:a 320k $MP3NAME
    fi
}

walk() {
    local indent="${2:-0}"
    printf "\n%*s%s\n\n" "$indent" '' "$1"
    # If the entry is a file convert it
    for entry in "$1"/*; do [[ -f "$entry" ]] && file_convert; done
    # If the entry is a directory recurse
    for entry in "$1"/*; do [[ -d "$entry" ]] && walk "$entry" $((indent+2)); done
}

# If the path is empty use the current, otherwise convert relative to absolute; Exec walk()
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || pushd "${1}" && ABS_PATH="${PWD}"
walk "${ABS_PATH}"
popd
echo

我希望 >./aacToMp3.sh ./music 遍历音乐目录并将每个 m4a 文件转换为 .mp3。

它正在遍历文件系统并打印出正确的文件,并转义空格。当它到达 ffmpeg 线时它就会停止。我将 set -e 放在文件顶部,以在命令失败时强制它失败。如果没有 set -e,它会愉快地遍历所有音乐文件并将它们打印到标准输出。

最佳答案

如果您有大量文件需要处理,并且有不错的多核 CPU 和快速磁盘,我会推荐 GNU Parallel,您可以使用 homebrew 安装它:

brew install parallel

然后在测试目录中复制一些文件并尝试:

parallel --dry-run ffmpeg -v 5 -y -i {} -acodec libmp3lame -ac 2 -b:a 320k {.}.mp3 ::: *.m4a

如果看起来不错,请将 --dry-run 替换为 --progress

如果看起来不错,您可以(先进行备份)并完成全部操作:

find path/to/music -name "*.m4a" -print0 | parallel -0 --progress ffmpeg -v 5 -y -i {} -acodec libmp3lame -ac 2 -b:a 320k {.}.mp3

关于bash -/usr/local/bin/ffmpeg : cannot execute binary file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56348842/

相关文章:

python - 如何将鼠标单击事件发送到 mac osx 中的窗口

objective-c - 在 Mac 应用程序中连接到 Internet

bash - bash 中的命令行参数到 Rscript

bash - 使用 sed 进行字段排序

regex - 在 SED 命令中传递多个文件 : Log Extract

bash - 计算 "find"结果的最佳方法是什么?

macos - 将自定义日志位置添加到 OS X 控制台应用程序

c - 为什么 `.` 和 `..` 在 Mac 上的 `/` 内部有不同的 inode 编号?

swift - 在菜单栏子菜单中列出所有已安装的卷(仅以编程方式)

bash - 为什么我们可以通过添加 "g"来用 sed 替换字符串?