/ usr / local / bin / ffmpeg:无法执行二进制文件

时间:2019-05-28 19:23:30

标签: bash macos

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

OS:OSX10.14 / Terminal vs 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,它将愉快地浏览所有音乐文件并将其打印到标准输出。

2 个答案:

答案 0 :(得分:2)

如果要处理的文件很多,并且有不错的多核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

答案 1 :(得分:1)

感谢所有输入。

一段时间后,我最终将所有ffmpeg行写入脚本文件。很高兴我做到了。我能够快速扫描文件并查看一些错误并进行修复。 这就是我想出的。 基本上,我是将纯文本写入标准输出并将其定向到文件。我将其转换为Shell脚本以转换每个文件。一次一个。过夜运行生成的脚本。

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"

    if [ $EXT == "m4a" ]
    then
      printf 'echo "Converting %s ..."\n' "$FILE_NAME"
      printf 'ffmpeg -v 5 -y -i %s -acodec libmp3lame -ac 2 -b:a 320k %s\n\n' "$ENTRY_FILE" "$MP3NAME"
    fi
}

输出看起来像

#!/usr/bin/env bash

echo "Converting 03\ It\'s\ Not\ My\ Time.m4a ..."
ffmpeg -v 5 -y -i /Users/arthuranderson/Documents/work/projects/mp3Convert/music/3\ Doors\ Down/3\ Doors\ Down\ \(Bonus\ Track\ Version\)/03\ It\'s\ Not\ My\ Time.m4a -acodec libmp3lame -ac 2 -b:a 320k /Users/arthuranderson/Documents/work/projects/mp3Convert/music/3\ Doors\ Down/3\ Doors\ Down\ \(Bonus\ Track\ Version\)/03\ It\'s\ Not\ My\ Time.mp3

echo "Converting 01\ Down.m4a ..."
ffmpeg -v 5 -y -i /Users/arthuranderson/Documents/work/projects/mp3Convert/music/311/Greatest\ Hits\ \'93-\'03/01\ Down.m4a -acodec libmp3lame -ac 2 -b:a 320k /Users/arthuranderson/Documents/work/projects/mp3Convert/music/311/Greatest\ Hits\ \'93-\'03/01\ Down.mp3

标记我下次购买更多音乐时会尝试并行操作。

谢谢大家!