Verlustfreie Audiokonvertierung von FLAC zu ALAC mit ffmpeg

13

Sowohl ALAC als auch FLAC sind verlustfreie Audioformate, und Dateien haben normalerweise mehr oder weniger die gleiche Größe, wenn sie von einem Format in das andere konvertiert werden. Ich verwende ffmpeg -i track.flac track.m4azum Konvertieren zwischen diesen beiden Formaten, stelle jedoch fest, dass die resultierenden ALAC-Dateien viel kleiner sind als die ursprünglichen. Wenn Sie eine Konvertersoftware wie den MediaHuman Audio Converter verwenden, bleibt die Größe der ALACs ungefähr gleich groß wie die der FLACs. Ich denke, ich vermisse hier einige Flags, die dazu führen ffmpeg, dass das Signal heruntergesampelt wird .

DarthPaghius
quelle
ffmpegIm Allgemeinen muss das -acodecfür jedes Ziel sicher sein, dass Sie das Gespräch richtig führen. Es gibt viele Frontends, die verwendet werden, ffmpegaber ich habe festgestellt, dass viele ALAC nicht als Ausgabeoption enthalten.
Veganer Fanatiker

Antworten:

22

Ok, ich habe hier wahrscheinlich ein wenig schnell gefragt, aber zum späteren Nachschlagen hier ist die Antwort:

Für eine verlustfreie Konvertierung zwischen FLAC und ALAC sollte man das Flag -acodec alacan übergeben ffmpeg:

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

DarthPaghius
quelle
6
Um zu erklären, was hier passiert: .m4a ist eine Apple-Variante des MP4-Dateiformats. FFmpeg und die meisten anderen s / w verwenden bei der Ausgabe an mp4oder standardmäßig den AAC-Encoder m4a, daher wird die Express- -acodecOption benötigt.
Gyan
2
Einige FLAC-Dateien enthalten eine Miniaturansicht des Albumcovers. Sie können diese hinzufügen -vcodec copy, um sie in Ihre neuen ALAC-Dateien aufzunehmen.
Sean
2

Und zum Konvertieren eines ganzen Verzeichnisses ...

Verwendungszweck

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"

Alternative:

Ich dachte, ich könnte dies in einem einzigen Befehl zum Laufen bringen, aber es entgeht keinen Sonderzeichen wie [.

Es schien so vielversprechend ...

#!/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
quelle
1
Hier ist ein Einzeiler, den ich für die Konvertierung verwende: for i in *.flac; do echo $i; ffmpeg -i "$i" -y -v 0 -vcodec copy -acodec alac "${i%.flac}".m4a && rm -f "$i"; done
Paul Lindner
@PaulLindner Das scheint eine perfekte Option für einzelne Verzeichnisse zu sein, keine Rekursion.
CoolAJ86