Conversion audio sans perte de FLAC en ALAC à l'aide de ffmpeg

13

ALAC et FLAC sont tous deux des formats audio sans perte et les fichiers auront généralement plus ou moins la même taille lorsqu'ils sont convertis d'un format à l'autre. J'utilise ffmpeg -i track.flac track.m4apour convertir entre ces deux formats mais je remarque que les fichiers ALAC résultants sont beaucoup plus petits que les originaux. Lorsque vous utilisez un logiciel de conversion comme MediaHuman Audio Converter, la taille des ALAC restera à peu près la même taille que les FLAC, donc je suppose que je manque ici quelques indicateurs qui provoquent une ffmpegsous-échantillonnage du signal.

DarthPaghius
la source
ffmpega généralement besoin -acodecde n'importe quelle destination pour être sûr que la conversation se déroule correctement. Il y a beaucoup de frontaux qui utilisent ffmpegmais j'ai remarqué que beaucoup n'incluent pas ALAC comme option de sortie.
Vegan Fanatic

Réponses:

23

Ok, j'ai probablement été un peu rapide à poser ici, mais pour des références futures, voici la réponse:

Il faut passer le drapeau -acodec alacà ffmpegpour une conversion sans perte entre FLAC et ALAC:

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

DarthPaghius
la source
6
Pour expliquer ce qui se passe ici: .m4a est une variante Apple du format de fichier MP4. FFmpeg et la plupart des autres s / w utiliseront par défaut l'encodeur AAC lors de la sortie vers mp4ou m4a, donc l' -acodecoption express est nécessaire.
Gyan
2
Certains fichiers FLAC contiennent une miniature de couverture d'album. Vous pouvez ajouter -vcodec copypour les inclure dans vos nouveaux fichiers ALAC.
Sean
2

Et pour convertir un répertoire entier ...

Usage

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:

Je pensais pouvoir faire fonctionner cela en une seule commande, mais cela n'échappe pas aux caractères spéciaux, tels que [.

Cela semblait si prometteur ...

#!/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
la source
2
Voici un one-liner que j'utilise pour la conversion: 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 Cela ressemble à une option parfaite pour les répertoires uniques, pas de récursivité.
CoolAJ86