Conversione audio senza perdita di dati da FLAC a ALAC utilizzando ffmpeg


13

Sia ALAC che FLAC sono formati audio senza perdita di dati e di solito i file avranno più o meno le stesse dimensioni quando convertiti da un formato all'altro. Uso ffmpeg -i track.flac track.m4aper convertire tra questi due formati ma noto che i file ALAC risultanti sono molto più piccoli di quelli originali. Quando si utilizza un software di conversione come MediaHuman Audio Converter, la dimensione degli ALAC rimarrà circa della stessa dimensione dei FLAC, quindi credo che qui manchi alcuni flag che causano il ffmpegdownsampling del segnale.


ffmpegin genere è necessario -acodecche qualsiasi destinazione sia sicura che la conversazione venga eseguita correttamente. Ci sono molti front-end che usano ffmpegma ho notato che molti non includono ALAC come opzione di output.
Fanatico vegano,

Risposte:


23

Ok, probabilmente sono stato un po 'veloce per chiedere qui, ma per motivi di futuro riferimento ecco la risposta:

Si dovrebbe passare il flag -acodec alacper ffmpegper una conversione lossless FLAC e ALAC tra:

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


6
Per spiegare cosa sta succedendo qui: .m4a è una variante Apple del formato di file MP4. FFmpeg e la maggior parte degli altri s / w passeranno automaticamente all'encoder AAC quando vengono inviati a mp4o m4a, quindi -acodecè necessaria l' opzione express .
Gyan

2
Alcuni file FLAC contengono una miniatura della copertina dell'album. È possibile aggiungere -vcodec copyper includere quelli nei nuovi file ALAC.
Sean,

2

E per convertire un'intera directory ...

uso

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"

Alternativa:

Pensavo di riuscire a farlo funzionare in un solo comando, ma non sfugge a caratteri speciali, come [.

Sembrava così promettente ...

#!/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')"

2
Ecco un one-liner che uso per la conversione: 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 Sembra un'opzione perfetta per le singole directory, nessuna ricorsione.
CoolAJ86
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.