web-dev-qa-db-fra.com

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

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.m4a pour convertir entre ces deux formats mais je remarque que les fichiers ALAC résultants sont beaucoup plus petits que les fichiers originaux. Lorsque vous utilisez un logiciel de conversion tel que MediaHuman Audio Converter, la taille des ALAC restera à peu près la même que celle des FLAC, donc je suppose qu'il me manque des indicateurs ici qui font que ffmpeg sous-échantillonne le signal.

13
DarthPaghius

D'accord, 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 à ffmpeg pour une conversion sans perte entre FLAC et ALAC:

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

22
DarthPaghius

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')"
2
CoolAJ86