Преобразование аудио без потерь из FLAC в ALAC с использованием ffmpeg

13

И ALAC, и FLAC являются аудиоформатами без потерь, и файлы обычно имеют более или менее одинаковый размер при преобразовании из одного формата в другой. Я использую ffmpeg -i track.flac track.m4aдля преобразования между этими двумя форматами, но я замечаю, что результирующие файлы ALAC намного меньше, чем исходные. При использовании программного обеспечения для преобразования, такого как MediaHuman Audio Converter, размер ALAC будет примерно таким же, как у FLAC, поэтому я полагаю, что здесь не хватает некоторых флагов, которые вызывают ffmpegпонижающую дискретизацию сигнала.

DarthPaghius
источник
ffmpegкак правило, необходимо -acodecдля любого пункта назначения, чтобы убедиться, что вы сделали разговор правильно. Есть много внешних интерфейсов, которые используют, ffmpegно я заметил, что многие не включают ALAC в качестве опции вывода.
веганский фанатик

Ответы:

23

Хорошо, я, вероятно, был немного быстр, чтобы спросить здесь, но ради будущей ссылки вот ответ:

Нужно передать флаг , -acodec alacчтобы ffmpegдля преобразования без потерь между FLAC и ALAC:

ffmpeg -i track.flac -acodec alac track.m4a

DarthPaghius
источник
6
Чтобы объяснить, что здесь происходит: .m4a - вариант Apple формата файла MP4. FFmpeg и большинство других программ будут по умолчанию использовать кодировщик AAC при выводе в mp4или m4a, поэтому необходима -acodecопция express .
Гьян
2
Некоторые файлы FLAC содержат эскиз обложки альбома. Вы можете добавить -vcodec copyих в свои новые файлы ALAC.
Шон
2

И для преобразования всего каталога ...

Применение

pushd './Music/Some Album [flac]'
bash flac-to-alac.sh 

flac-to-alac.sh:

#!/usr/bin/env bash
my_bin="$(dirname $0)/flac-to-alac-ffmpeg.sh"
find . -type f -name '*.flac' -exec "$my_bin" {} \;

flac-to-alac-ffmpeg.sh:

#!/usr/bin/env bash
set -e # fail if there's any error
set -u

my_file=$1
my_new="$(echo $(dirname "$my_file")/$(basename "$my_file" .flac).m4a)"
echo "$my_file"
ffmpeg -y -v 0 -i "$my_file" -acodec alac "$my_new"
# only gets here if the conversion didn't fail
#rm "$my_file"

Альтернатива:

Я думал, что смогу заставить это работать в одной команде, но это не экранирует специальные символы, такие как [.

Это казалось таким многообещающим ...

#!/usr/bin/env bash
set -e # exit immediately on error
set -u # error if a variable is misspelled

while read -r my_file; do
  # ./foo/bar.flac => ./foo/bar.m4a
  my_new="$(dirname "$my_file")/$(basename "$my_file" .flac).m4a"

  ffmpeg -i "$my_file" -acodec alac "$my_new"

  # safe because of set -e, but still do a test run
  #rm "$my_file"
done <<< "$(find . -type f -name '*.flac')"
CoolAJ86
источник
2
Вот строчка, которую я использую для конвертации: for i in *.flac; do echo $i; ffmpeg -i "$i" -y -v 0 -vcodec copy -acodec alac "${i%.flac}".m4a && rm -f "$i"; done
Пол Линднер
@PaulLindner Это похоже на идеальный вариант для отдельных каталогов, без рекурсии.
CoolAJ86