Wie konvertiere ich FLAC-Dateien in AAC (vorzugsweise VBR 320k +)?


12

Ich sichere meine CDs auf FLAC und transkodiere sie dann in AAC-Dateien (.m4a), um sie auf meinem Android-Handy und dem iPhone der Frau zu portieren. Ich habe XLD auf einem Mac verwendet und es macht einen tollen Job, aber ich würde lieber nicht ihren Mac stehlen, um dies zu tun und es auf meiner eigenen Debian-Box tun zu können. Folgendes funktioniert:

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

Aber das Folgende nicht (nun ja, aber ignoriert den 320 für Audioqualität und Ergebnisse wie oben):

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

Ich hatte andere Befehle online gefunden, wie "ffmpeg", aber anscheinend werden die meisten oder alle zugunsten der oben genannten avconv-Methode abgeschrieben. Jede Hilfe wäre sehr dankbar! Ich könnte mit 320 Kbit / s leben, wenn nicht echte VBR, aber LC VBR von mindestens 320 wäre am besten.


Ich sollte darauf hinweisen, dass ich ohne Angabe eine Datei mit einer Qualität von etwa 192 KB erhalte, und obwohl die Manpage für avconv besagt, dass Sie die Audioqualität mit -aq angeben können, gibt es keinen Unterschied in der resultierenden Datei. Ich erhalte einen Segmentierungsfehler, wenn ich dem 320 ein 'k' hinzufüge.
statisch

Wenn 320k + für Sie in Ordnung ist, sind Sie mit WavPack (Hybridmodus) möglicherweise sicherer (es kann auf Android in Software von Drittanbietern gespielt werden, z. B. in Deadbeef). Es wird eine völlig andere Komprimierungsmethode verwendet, für die keine obligatorischen verlustbehafteten Transformationen erforderlich sind. Der einzige Kompromiss besteht in der Menge des Quantisierungsrauschens gegenüber der Bitrate. Lustige Artefakte sind unmöglich. Ich würde vorschlagen, es zumindest zu versuchen. Das iPhone kann hier jedoch das Problem sein: /
Anzeigename

Antworten:


16

Zunächst einmal -aqsetzt eine qualitätsbezogene variable Bitrate - ich glaube , Sie suchen -ab(beachten Sie, dass ich ein ffmpeg Benutzer bin, so mein Wissen über avconv Syntax beschränkt ist - habe ich keine Ahnung , wie weit es ist , da die driftete Gabel).

Unabhängig davon ist der eingebaute avconv / ffmpeg AAC-Encoder ziemlich schlecht.

fdk_aac

Der einzige wirklich gute AAC-Encoder für avconv / ffmpeg ist libfdk_aac - aber die Lizenz dafür ist nicht mit der GPL kompatibel. Um darauf zugreifen zu können, müssen Sie dies tun Ihren eigenen kompilieren (das ist ein ffmpeg-Kompilierungshandbuch, da ich nicht Ich kenne keine für avconv - die Ubuntu-Anleitung sollte für Debian in Ordnung sein, da ich glaube, dass dort nichts Ubuntu-spezifisches ist.

Befolgen Sie anschließend die AAC-Codierungsanleitung . Ich empfehle dringend, fdk_aac's auszuprobieren-vbr Option - eine Einstellung von 3 klingt für mich in allen Dateien, die ich ausprobiert habe, transparent. Wenn Sie ein Placebo mit einer höheren Bitrate wünschen oder Tontechniker sind, können Sie eine Einstellung von ausprobieren 5.

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

Kein Bedarf für -map_metadata , da ffmpeg automatisch Metadaten überträgt (und ich bin mir ziemlich sicher, dass avconv dies auch tun wird).

Bei einer festen Bitrate von 320 kbit / s (im Ernst, das ist es nicht wert, erreicht AAC Audiotransparenz im Vergleich zu Original-CD-Audio bei etwa 128 kbit / s):

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

neroAacEnc

Der AAC-Encoder von Nero sollte mit fdk_aac und qaac (Quicktime AAC) gleichgesetzt werden. Unterschiedliche Personen geben unterschiedliche Meinungen darüber ab, welche besser ist, aber Sie werden Unterschiede nur bei sehr niedrigen Bitraten feststellen, und alle sind sich einig, dass sie alle von sehr hoher Qualität sind.

neroAacEncist auf der Nero-Website verfügbar . Entpacke es und lege es irgendwo in deinen $ PATH.

Leider neroAacEnckann nur WAV-Audio als Eingabe verwendet werden. Sie können dies umgehen, indem Sie avconv oder ffmpeg als Decoder verwenden:

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

Leider werden dadurch Metadaten entfernt. Um dies zu übertragen, verwenden Sie avprobe / ffprobe (with -show_format) zum Extrahieren und neroAacTag zum Einfügen. Ein Bash-Skript wäre wahrscheinlich in Ordnung.

Siehe die HydrogenAudio- Seite auf neroAacEnc : Aus dem Speicher heraus -qklang eine Einstellung von 0,4 für mich großartig. Sie können eine Bitrate mit -br(wieder denke ich, das wäre viel übertrieben) anstreben:

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

BEARBEITEN: Hier ist ein Skript zum Konvertieren von Audiodateien in m4a mit neroAacEnc und anschließendes Markieren mit ffprobe und neroAacTag (alle müssen sich in einem Verzeichnis in Ihrem $ PATH befinden). Es können mehrere Eingabedateien verwendet werden. Wenn Sie es also unter speichern convert-to-m4a, können Sie jede FLAC-Datei in ein Verzeichnis mit konvertieren

convert-to-m4a *.flac

Es ist nicht nur auf FLAC-Dateien beschränkt. Jedes Audioformat, das Ihr ffmpeg / avconv dekodieren kann, funktioniert. Möglicherweise möchten Sie ffprobe und ffmpeg in avprobe und avconv ändern:

#!/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

Ich freue mich über Ihre Antwort und werde es so schnell wie möglich versuchen und Sie wissen lassen, wie es geht. Ich würde die erste / ffmpeg-Option bevorzugen, aber ffmpeg hat mir gesagt, dass ich avconv verwenden soll, weil es die neue / bevorzugte Methode ist, denke ich. (FYI)
statisch

1
@static Eigentlich sind sowohl ffmpeg als auch avconv aktiv entwickelte Projekte. Das 'ffmpeg' in den Debian / Ubuntu-Repositories ist nicht das echte ffmpeg, sondern ein gefälschtes, das von den avconv-Entwicklern bereitgestellt wurde, und diese Nachricht hat viel Verwirrung gestiftet. Siehe "Wer kann mir den Unterschied und die Beziehung zwischen ffmpeg, libav und avconv erklären?" und 'Die FFmpeg / Libav-Situation' .
Evilsoup

Beachten Sie auch, dass das Skript hier nicht ausgiebig getestet wurde, es kann durchaus mit einigen Metadaten brechen
evilsoup

2
"Sie müssen Ihre eigenen kompilieren": Da @static einen Mac erwähnte, hielt ich es für ratsam zu sagen, dass ich ffmpeg mit libfdk_aac einfach mit homebrew installiert habe. brew install ffmpeg --with-fdk-aac. Sie können eine Liste der Optionen mit erhalten brew info ffmpeg. Aber gute Idee, den Mac Ihrer Frau nicht zu stehlen :)
Jonathan Komar

@ macmadness86 Das ist interessant, aber ich denke (ich bin offensichtlich kein Anwalt), dass es illegal ist, eine Version von ffmpeg mit installiertem FDK-AAC zu vertreiben, da FDK-AAC nicht mit der von ffmpeg verwendeten GPL-Lizenz kompatibel ist. Wer das über Homebrew macht, könnte sich möglicherweise in Schwierigkeiten bringen.
Evilsoup

6

Ich schlage vor, FFmpeg zu verwenden, um von FLAC zu AAC zu konvertieren. FFmpeg kann einfach auf einem Mac OS X-Computer mit Brew installiert werden:

brew install ffmpeg

Führen Sie dann den folgenden Befehl aus, um alle FLAC-Dateien im aktuellen Verzeichnis in AAC zu konvertieren:

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

Und um sie in MP3 umzuwandeln:

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

2
Mit flac 3.1.4 musste ich Folgendes für die AAC-Konvertierung verwenden: 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

Dies ist mein Skript, das ffmpeg umschließt, um jedes unterstützte Audioformat in AAC zu konvertieren (unter Verwendung des libfdk-aac-Encoders, der vom ffmpeg-Wiki empfohlenen aac-Encoder ist).

#!/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

Die Befehlszeilen-Hilfemeldung:

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

1

Ergänzende Antwort (zur Antwort von evilsoup)

Zu handhaben

  • Alle Dateien in Unterverzeichnissen
  • Leerzeichen in Dateinamen ( find's -print0+ xarg' s -0)
  • Halten Sie neu erstellen m4a - Dateien in demselben Verzeichnis als Quelle FLAC - Dateien ( $1aus sh -c‚s Positions Argumente --FILESet von xarg‘ s -I)

Einzeiler

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.