/ usr / local / bin / ffmpeg: невозможно выполнить двоичный файл - PullRequest
2 голосов
/ 28 мая 2019

Хотите конвертировать мои файлы m4a в mp3 файлы, используя скрипт. Это сэкономит время ... У меня более 100 ГБ музыкальных файлов.

ОС: OSX10.14 / Terminal против 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 в верхней части файла, чтобы заставить его потерпеть неудачу, если команда потерпит неудачу. Без набора -e он с удовольствием гуляет по всем музыкальным файлам и печатает их на стандартный вывод.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Если у вас много файлов для обработки, приличный многоядерный процессор и быстрый диск, я бы порекомендовал 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 голос
/ 30 мая 2019

Спасибо за все комментарии.

Через некоторое время я закончил записывать все строки ffmpeg в файл сценария. Рад, что сделал. Мне удалось быстро отсканировать файл, увидеть некоторые ошибки и исправить их. Это то, что я придумал. По сути, я пишу прямой текст на стандартный вывод и направляю его в файл. Который я конвертировал в скрипт оболочки для конвертации каждого файла. Один за раз. Запустил сгенерированный скрипт за ночь.

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

Марк Я попробую параллельно, когда в следующий раз куплю еще музыку.

Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...