Comment convertir des fichiers FLAC en AAC (de préférence VBR 320k +)?

12

Je sauvegarde mes CD sur FLAC, puis transcode en fichiers AAC (.m4a) pour la portabilité sur mon téléphone Android et l'iPhone de l'épouse. J'utilisais XLD sur Mac et cela fait un excellent travail, mais je préfère ne pas voler son Mac pour le faire et pouvoir le faire sur ma propre boîte Debian. Les oeuvres suivantes:

avconv -i "inputfile.flac" -acodec aac -strict experimental "outputfile.m4a" -map_metadata "inputfile.flac":"outputfile.m4a"

Mais ce qui suit ne le fait pas (bien qu'il le fasse, mais ignore le 320 pour la qualité audio et les résultats comme ci-dessus):

avconv -i "inputfile.flac" -acodec aac -aq 320 -strict experimental "outputfile.m4a" -map_metadata "inputfile.flac":"outputfile.m4a"

J'avais trouvé d'autres commandes en ligne telles que "ffmpeg" mais apparemment la plupart ou la totalité d'entre elles sont dépréciées en faveur de la méthode avconv ci-dessus. Toute aide serait grandement appréciée! Je pourrais vivre avec 320 Kbps si ce n'est pas du vrai VBR, mais un LC VBR d'au moins 320 serait le meilleur.

statique
la source
Je dois souligner que sans spécifier, j'obtiens un fichier d'environ 192 Ko en qualité, et bien que la page de manuel pour avconv indique que vous pouvez spécifier la qualité audio avec -aq, il n'y a aucune différence dans le fichier résultant. J'obtiens un défaut de segmentation si j'ajoute un «k» au 320.
statique
Si 320k + vous convient, vous pouvez être plus sûr en utilisant WavPack (mode hybride) (il est jouable sur Android dans un logiciel tiers, par exemple dans deadbeef). Il utilise une méthode de compression complètement différente, qui n'a pas de transformations avec perte obligatoires, et le seul compromis est la quantité de bruit de quantification par rapport au débit binaire, des artefacts amusants sont impossibles. Je suggère au moins d'essayer. L'iPhone peut être le problème ici, cependant: /
Nom d'affichage

Réponses:

16

Tout d'abord, -aqdéfinit un débit binaire variable basé sur la qualité - je pense que vous recherchez -ab(notez que je suis un utilisateur ffmpeg, donc ma connaissance de la syntaxe avconv est limitée - je ne sais pas jusqu'où il a dérivé depuis fourchette).

Quoi qu'il en soit, l'encodeur AAC avconv / ffmpeg intégré est assez mauvais.

fdk_aac

Le seul très bon encodeur AAC pour avconv / ffmpeg est libfdk_aac - mais la licence pour cela est incompatible avec la GPL, donc pour y accéder, vous devrez compiler le vôtre (c'est un guide de compilation ffmpeg, puisque je ne n'en connais pas un pour avconv - le guide Ubuntu devrait convenir à Debian, car je ne pense pas qu'il y ait quoi que ce soit de spécifique à Ubuntu).

Une fois que vous l'avez, suivez le guide d'encodage AAC ; Je recommande fortement d'essayer l' -vbroption de fdk_aac - un réglage de 3 sons transparents pour moi sur tous les fichiers que j'ai essayés, si vous voulez le placebo d'un débit binaire plus élevé, ou si vous êtes ingénieur du son, vous pouvez essayer un réglage de 5.

ffmpeg -i input.flac -c:a libfdk_aac -vbr 3 output.m4a

Pas besoin -map_metadata, car ffmpeg transférera automatiquement les métadonnées (et je suis sûr que avconv le fera aussi).

Pour un débit binaire fixe de 320 kbit / s (sérieusement, cela n'en vaut pas la peine, AAC atteint la transparence audio par rapport au CD audio original à environ 128 kbit / s fixe):

ffmpeg -i input.flac -c:a libfdk_aac -b:a 320k

neroAacEnc

L'encodeur AAC de Nero doit être considéré comme comparable à fdk_aac et qaac (Quicktime AAC). Différentes personnes donneront des opinions différentes sur laquelle est la meilleure, mais vous ne remarquerez des différences qu'à des débits très faibles, et tout le monde convient qu'elles sont toutes de très haute qualité.

neroAacEncest disponible sur le site Web de Nero . Décompressez-le et placez-le quelque part dans votre $ PATH.

Malheureusement, neroAacEncne peut prendre que l'audio WAV en entrée; vous pouvez contourner cela en utilisant avconv ou ffmpeg comme décodeur:

avconv -i input.flac -f wav - | neroAacEnc -if - -ignorelength -q 0.4 output.m4a

Malheureusement, cela supprimera les métadonnées; pour transférer cela, utilisez avprobe / ffprobe (avec -show_format) pour extraire et neroAacTag pour insérer. Un script bash serait probablement en ordre.

Voir la page HydrogenAudio sur neroAacEnc : de mémoire, un -qparamètre de 0,4 me paraissait très bien. Vous pouvez cibler un débit binaire avec -br(encore une fois, je pense que ce serait ainsi exagéré):

avconv -i input.flac -f wav - | neroAacEnc -if - -ignorelength -br 320000 output.m4a

EDIT: voici un script pour convertir des fichiers audio en m4a avec neroAacEnc, puis baliser avec ffprobe et neroAacTag (nécessite qu'ils soient tous dans un répertoire de votre $ PATH). Il peut prendre plusieurs fichiers d'entrée, donc si vous l'enregistrez sous convert-to-m4a, vous pouvez convertir chaque fichier FLAC dans un répertoire avec

convert-to-m4a *.flac

Il ne se limite pas aux seuls fichiers FLAC; tout format audio que votre ffmpeg / avconv peut décoder fonctionnera. Vous voudrez peut-être changer ffprobe et ffmpeg en avprobe et avconv:

#!/usr/bin/env bash

until [[ "$1" = '' ]]; do
  ffmpeg -i "$1" -f wav - | neroAacEnc -if - -ignorelength -q 0.4 "${1%.*}.m4a"
  tags=()
  while read -r; do
    tags+=("$REPLY")
  done < <(ffprobe -i "$1" -show_format 2>/dev/null | sed -ne 's/date/year/' -e '/TAG:/s/TAG/-meta/p')
  neroAacTag "${1%.*}.m4a" "${tags[@]}"
  shift
done
exit 0
evilsoup
la source
J'apprécie votre réponse et j'essaierai dès que possible et vous ferai savoir comment ça se passe. Je préférerais la première option / ffmpeg, mais ffmpeg est ce qui m'a dit d'utiliser avconv car c'est la nouvelle façon / préférée, je suppose. (FYI)
statique
1
@static en fait, ffmpeg et avconv sont des projets activement développés; le 'ffmpeg' dans les référentiels Debian / Ubuntu n'est pas le vrai ffmpeg, mais un faux fourni par les développeurs avconv, et ce message a causé beaucoup de confusion. Voir "Qui peut me dire la différence et la relation entre ffmpeg, libav et avconv?" et «La situation FFmpeg / Libav» .
evilsoup
Notez également que le script ici n'a pas été largement testé, il pourrait bien rompre avec certaines métadonnées
evilsoup
2
"vous devrez compiler le vôtre": comme @static a mentionné un Mac, j'ai pensé qu'il était prudent de dire que j'avais installé ffmpeg avec libfdk_aac facilement avec homebrew. brew install ffmpeg --with-fdk-aac. vous pouvez obtenir une liste d'options avec brew info ffmpeg. Mais bonne idée de ne pas voler le Mac de votre femme :)
Jonathan Komar
@ macmadness86 C'est intéressant mais je pense (je ne suis pas avocat, évidemment) que puisque FDK-AAC est incompatible avec la licence GPL que ffmpeg utilise, il est en fait illégal de distribuer une version de ffmpeg avec FDK-AAC installé. Quiconque fait cela par-dessus les homebrews pourrait potentiellement se mettre dans une situation embêtante.
evilsoup
6

Je suggère d'utiliser FFmpeg pour convertir de FLAC en AAC. FFmpeg s'installe facilement sur une machine Mac OS X avec brew:

brew install ffmpeg

Exécutez ensuite la commande suivante pour convertir tous les fichiers FLAC du répertoire actuel en AAC:

for i in *flac;do of="${i/.flac/.m4a}"; ffmpeg -i "${i}" -vn -acodec libvo_aacenc -b:a 320k -f mp4 -y "${of}";done

Et pour les convertir en MP3:

for i in *flac;do of="${i/.flac/.mp3}"; ffmpeg -i "${i}" -vn -acodec mp3 -b:a 320k -f mp3 -y "${of}";done
Scott Kidder
la source
2
En utilisant flac 3.1.4, j'ai dû utiliser ce qui suit pour la conversion AAC: for i in *flac;do of="${i/.flac/.m4a}"; ffmpeg -i "${i}" -vn -acodec aac -b:a 320k -f mp4 -y "${of}";done
Yannick Wurm
2

Ceci est mon script enveloppant ffmpeg pour convertir tout format audio pris en charge en AAC (en utilisant l'encodeur libfdk-aac qui est l'encodeur aac recommandé par ffmpeg wiki).

#!/usr/bin/env python2.7

from optparse import OptionParser
from subprocess import call
from os.path import splitext
import sys, os

def ffaac(filename, opts):
    cmd = ['ffmpeg', '-hide_banner', '-y', '-i', filename, 
            '-vn', '-c:a', 'libfdk_aac']
    profile = {'lc':'aac_low', 'he':'aac_he', 'he2':'aac_he_v2', 
            'ld':'aac_ld', 'eld':'aac_eld'}
    if not opts.br and not opts.vbr:
        cmd.extend(['-b:a', '320k'])
    if opts.br:
        cmd.extend(['-b:a', str(opts.br)+'k'])
    if opts.vbr:
        cmd.extend(['-vbr', opts.vbr])
    if opts.ar:
        cmd.extend(['-ar', opts.ar])
    if opts.ch:
        cmd.extend(['-ac', opts.ch])
    cmd.extend(['-profile:a', profile[opts.prof]])
    if opts.prof == 'eld' and opts.sbr:
        cmd.extend(['-eld_sbr', '1'])
    cmd.extend(['-f', 'adts'])

    if filename.lower().endswith('.aac'):
        return
    outfile = splitext(filename)[0] + '.aac'
    cmd.append(outfile)

    return call(cmd)

if __name__=='__main__':
    parser = OptionParser(sys.argv[0]+' [OPTIONS] FILE ...')
    parser.add_option('-b', metavar='NUM', type=int, dest='br', help='bitrate')
    parser.add_option('-r', metavar='NUM', choices=['8000','11025','16000','22050','32000', '44100', '48000'], dest='ar', help='sample rate: 8000/11025/22050/32000/44100/48000')
    parser.add_option('-c', metavar='NUM', choices=['1','2'],dest='ch', help='channels: 1/2')
    parser.add_option('-p', metavar='TYPE',choices=['lc', 'he', 'he2', 'ld', 'eld'], default='lc', dest='prof', help='profile: lc/he/he2/ld/eld')
    parser.add_option('-v', metavar='QUAL', choices=['1', '2', '3', '4', '5'], dest='vbr', help='vbr quality: 1/2/3/4/5')
    parser.add_option('-s', action='store_true', dest='sbr', help='use SBR for ELD')
    parser.add_option('-d', action='store_true', dest='delete',help='delete source after converting')
    opts,  args = parser.parse_args()
    for f in args:
        if ffaac(f, opts) == 0 and opts.delete :
            try:
                os.remove(f)
            except OSError:
                pass

Le message d'aide en ligne de commande:

Usage: /Users/leon/bin/ffaac.py [OPTIONS] FILE ...

Options:
  -h, --help  show this help message and exit
  -b NUM      bitrate
  -r NUM      sample rate: 8000/11025/22050/32000/44100/48000
  -c NUM      channels: 1/2
  -p TYPE     profile: lc/he/he2/ld/eld
  -v QUAL     vbr quality: 1/2/3/4/5
  -s          use SBR for ELD
  -d          delete source after converting
Miaou
la source
1

Réponse supplémentaire (à la réponse d'Evilsoup)

Gérer

  • Tous les fichiers dans les sous-répertoires
  • Espaces dans les noms de fichiers ( find's -print0+ xarg' s -0)
  • Conserver les fichiers m4a nouvellement créés dans le même répertoire que leurs fichiers flac source (à $1partir sh -cde l'argument positionnel --FILEdéfini par xarg's -I)

Bon mot

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
Jonathan Komar
la source