Der neue AAC-Encoder in FFmpeg 9.1
(hydrogenaudio.org)- Der native AAC-Encoder von FFmpeg wurde umfassend neu geschrieben, einschließlich Rate Control, RDO sowie PNS, TNS, I/S und M/S. Ziel ist eine Qualität, die sich direkt mit externen AAC-Encodern vergleichen lässt.
- Die neue Implementierung verhält sich nahezu wie striktes CBR; ein echtes VBR-Verfahren auf Basis von
-q:awird nicht empfohlen. - In Vergleichen mit Zimtohrli und ViSQOL erzielte der neue
nmr-Encoder im Bereich von 64 bis 256 kbps meist bessere Ergebnisse als fdk-aac und Apple AAC; Opus bleibt in einem separaten Vergleich jedoch weiterhin überlegen. - PNS, TNS, I/S und M/S werden innerhalb der RDO-Schleife ausgewählt. Wenn ein Downmix zu erwarten ist, wird zur Wahrung der Phase die Nutzung von
-aac_is 0 -aac_pns 0empfohlen. - Ab 128 kbps gab es viele positive Bewertungen, doch 64-kbps-Stereo, einige TNS-Samples und Sprachinhalte bleiben Bereiche, die weitere Prüfung benötigen.
Umfassende Neufassung des FFmpeg-AAC-Encoders
- Der AAC-Encoder von FFmpeg wurde einschließlich Rate Control, RDO, PNS, TNS, I/S und M/S umfassend neu geschrieben.
- Der Rewrite-PR wurde als Kandidat für das Merging geteilt; später wurde im Thread das tatsächliche Merging bestätigt.
- Tests sind nach einem Build aus dem Quellcode oder nach einem Update der BtbN Nightly Builds möglich.
- Der neue Encoder kann über den Codec
aacgenutzt werden.ffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a- I/S deaktivieren:
-aac_is 0 - PNS deaktivieren:
-aac_pns 0
Qualitätsmetriken und Vergleichsziele
- Für den Vergleich wurden Googles Zimtohrli, ViSQOL sowie Hörtests verwendet.
- Bei Zimtohrli ist niedriger besser.
- Bei ViSQOL ist höher besser.
- In der Tabelle wurde der neue Encoder als
nmrbezeichnet und mit den bisherigen FFmpeg-8.1-Modifastundtwoloop, fdk-aac, Apple AAC sowie libopus verglichen. - Repräsentative Ergebnisse:
- 64 kbps:
nmr0.00309 / 3.83, fdk-aac 0.00322 / 3.69, Apple 0.00612 / 3.29, libopus 0.00100 / 4.59 - 128 kbps:
nmr0.00072 / 4.47, fdk-aac 0.00143 / 4.27, Apple 0.00081 / 4.44, libopus 0.00020 / 4.68 - 256 kbps:
nmr0.00031 / 4.61, fdk-aac 0.00103 / 4.45, Apple 0.00067 / 4.63, libopus 0.00002 / 4.73
- 64 kbps:
- Bei hohen Bitraten sättigt Zimtohrli, daher wurde ViSQOL als Tiebreaker verwendet; nach diesem Kriterium liegt der neue Encoder in den Vergleichen vor allen außer Opus.
CBR-orientiertes Design und Coding-Tools
- Der neue Encoder ist nahezu ausschließlich auf CBR ausgelegt, mit sehr geringen Bitratenschwankungen.
- Das Bitbudget-Ziel hilft der Kodierqualität.
- Ein echtes VBR-Verfahren auf Basis von
-q:awird nicht empfohlen.
- Im Vergleich zeigte sich, dass andere Encoder außer TNS kaum Coding-Tools verwenden. Der neue Encoder wurde zunächst nur mit TNS verglichen, danach wurden PNS, I/S und M/S neu implementiert.
- Laut Reverse Engineering nutzt qaac keine perzeptive Optimierung, sondern eine Bitzuweisungskurve und Bandenergien mit Präferenz für hohe Frequenzen.
- Der neue Encoder verwendet für RDO eine ähnliche Kurve mit masked band energy.
- Alle Coding-Tools – PNS, TNS, I/S und M/S – werden innerhalb der RDO-Schleife ausgewählt.
- Es werden keine festen Heuristiken oder willkürlichen Bitraten-Cutoffs verwendet.
- Verfügbare Tools werden abhängig von der RDO-Entscheidung angewandt.
- Bei hohen Bitraten schalten sich Tools wie I/S und PNS selbst ab, wenn der Encoder alleine gut genug arbeitet, um die Bitrate zu halten.
Decoder-Kompatibilität und Hinweise zu Downmixes
- Der AAC-Decoder von FFmpeg hat ein Problem bei der Verarbeitung von Stereo-PNS; derselbe Bug könnte auch in anderen AAC-Decodern existieren, weshalb der Encoder ihn umgeht.
- Da bisherige Encoder PNS nicht verwendet haben, ist dieses Problem bislang nicht aufgefallen.
- Wenn ein Downmix vorgesehen ist oder die Ausgabe möglicherweise downmixed wird, wird die Verwendung von
-aac_is 0 -aac_pns 0empfohlen.- Ziel ist es, die Phase des ursprünglichen Signals zu erhalten.
- Dass im Spektrogramm viele Lücken sichtbar sind, ist beabsichtigtes Verhalten.
- Maskierte Bänder werden auf 0 gesetzt oder per PNS verarbeitet.
- Wenn benachbarte Bänder groß genug sind, sodass das fehlende Band schwer wahrnehmbar ist, wird bevorzugt, die hörbaren Bänder besser zu kodieren, statt alle Bänder schlecht zu kodieren.
Samplerate und Cutoff-Strategie
- Der Encoder ist vor allem für 48-kHz-Audio optimiert.
- 44,1 kHz und 96 kHz funktionieren ebenfalls.
- Für die höchste Qualität wird die Nutzung von 48 kHz empfohlen.
- Die veröffentlichten Benchmarks wurden hauptsächlich bei 44,1 kHz durchgeführt, während die per Gehör getunten Daten bei 48 kHz lagen.
- Ein Teil der Windowing-/Transient-Logik ist an 48 kHz gebunden.
- Da sich das Timing bei 44,1 kHz nicht stark unterscheidet, wurde dies unverändert beibehalten.
- Später wurde die Bandbreitenstrategie angepasst.
- 128 kbps werden auf 16 kHz begrenzt.
- 160 kbps und mehr werden auf 18 kHz begrenzt.
- Bei 192 kbps pro Kanal wurde die Änderung vorgenommen, das gesamte Spektrum ab 20 kHz zu kodieren.
- Bei 64-kbps-Stereo gibt es nicht viel Spielraum; ein stärkerer Einsatz von PNS kann das Stereobild beschädigen.
- Bei 64 kbps könnten auch 15 kHz zu hoch sein, daher wurde ein erneuter Test mit 12-kHz-Cutoff erbeten.
- Bei Mono ist kein Workaround für den Decoder-Bug nötig, sodass PNS deutlich stärker genutzt werden kann.
Testumfang und Debug-Statistiken
- Die Entwicklerseite testete mit einer Musiksammlung von 3000 Tracks.
- Sprachinhalte wurden nur sehr begrenzt getestet und könnten weitere Optimierung benötigen.
- Beim Beenden gibt der Encoder zusätzliche Statistiken aus.
- Beispiel:
Qavg: 207.975 Tr: 5.3% TNS(L): 4.8% TNS(S): 36.9% M/S: 3.9% I/S: 10.0% PNS: 5.1%
- Beispiel:
- Bedeutung der Statistiken:
Qavg: durchschnittlicher Lambda-Wert; je höher, desto schwieriger ist es, die Rate zu halten.Tr: Short BlocksTNS(L): TNS-Nutzungsrate in Long FramesTNS(S): TNS-Nutzungsrate in Short FramesM/S: Nutzungsrate von Mid/Side CodingI/S: Nutzungsrate von Intensity Stereo CodingPNS: Nutzungsrate von Perceptual Noise Substitution
- Wer störende Artefakte entdeckt, kann zur Analyse das ursprüngliche Eingangssample zusammen mit dieser Statistikzeile bereitstellen.
Erste Nutzertests und verbleibende Probleme
- Ein Nutzer testete mit einem einzelnen Stück,
Burn the Boats, bei 64 kbps, 134 kbps und 200 kbps.- 64 kbps seien gut, hätten aber leichte Artefakte.
- 134 kbps und 200 kbps klängen sehr gut.
- In einem anderen Test gab es zum 64-kbps-Sample
The Towerdas Feedback, dass der neuenmr-Encoder im Vergleich zum bisherigentwoloopstärker smeary und metallic wirke.- Auch der bisherige
twoloophabe Probleme mit einem Collapse am Anfang sowie allgemeinem Noise und Roughness.
- Auch der bisherige
- Beim Sample
fatboy_30secwar bei 192 kbps bei 6,836 s und 10,480 s ein Ticking Sound zu hören; nach Resampling auf 48 kHz kam ein Tick bei 14,125 s hinzu.- Wird TNS mit
-aac_tns 0abgeschaltet, verschwindet das Ticking. - Es folgte die Bitte, die Werte von
TNS_PG_C1_SHORTinlibavcodec/aacenc_tns.cauf 3.2, 4.2 und 5.0 zu erhöhen und dies zu prüfen.
- Wird TNS mit
- Ein Nutzer bewertete Fraunhofer AAC bei 64 kbps und 16-kHz-Cutoff als besser klingend; der neue Encoder habe metallic geklungen.
- Derselbe Nutzer bewertete den neuen Encoder bei höheren Bitraten über 128 kbps als gut funktionierend.
- Zugleich wurde geäußert, dass ein breit zugänglicher AAC-Encoder innerhalb des nativen FFmpeg nun ausreichend brauchbar geworden sei.
1 Kommentare
Meinungen auf Hacker News
Ein Beispiel dafür, wie stark Opus ist
Diese Arbeit an sich ist wertvoll, und bessere Encoder für alte Codecs sind eindeutig ein Gewinn, aber wenn man sich in diesem Benchmark die Opus-Werte ansieht, übertrifft es selbst bei 64 kbps alle AAC-Encoder
Fast 20 Jahre lang war RTMP mit H.264-Video und AAC-Audio de facto der Standard für Live-Streaming-Video, mit kaum Unterstützung für andere Codecs
Wenn man einen Stream an YouTube oder Twitch sendet, sendet man am Ende H.264 und AAC; auch OBS erlaubt im Streaming-Modus gar keine Auswahl anderer Video- oder Audio-Codecs und geht davon aus, dass Streamer H.264 und AAC verwenden
Man nimmt einfach Opus, und wenn man Opus aus irgendeinem Grund nicht nutzen kann, nimmt man aus Kompatibilitätsgründen AAC mit sehr hoher Bitrate
Man muss nicht recherchieren, welchen Encoder und Modus man wählen sollte, um gute Qualität zu bekommen
Trotzdem ist es großartig, dass es einen hochwertigen Standard-AAC-Encoder gibt, aber ich verstehe nicht so recht, warum er hauptsächlich auf konstante Bitrate ausgelegt ist
Dadurch wird Opus in Spielen oder Store-Distributionen, bei denen bestimmte Lizenzprobleme auftreten können, kaum verwendet
Ich bin gespannt, wie die tatsächliche Leistung sein wird
Der bisherige AAC-Encoder von FFmpeg hatte eine schlechte Ausgabequalität und oft störende zwitschernde Artefakte, sodass man auf jedem Rechner für Videoaufnahmen den Apple-Core-Audio-Encoder installieren musste, um brauchbaren Klang zu bekommen
In A/B/X-Vergleichen war eine 320-kbps-MP3 besser als eine mit FFmpeg encodierte 320-kbps-AAC und etwa vergleichbar mit einer per Core Audio encodierten 256-kbps-AAC
Wenn die Installation von Core Audio nun nicht mehr nötig ist, ist das eine große Verbesserung, und Leute, die mit Tools wie OBS Bildschirmaufnahmen oder Streaming machen, könnten beim nächsten Update eine deutlich bessere Audioqualität bekommen
Es wrappet die iTunes-Windows-DLLs zu einem eigenständigen Encoding-Tool mit CLI und funktioniert meines Wissens auch unter Wine auf Linux: https://web.archive.org/web/20250814194428/https://www.andre...
Für hochwertiges AAC-Encoding braucht man nicht unbedingt einen Mac oder eine vollständige iTunes-Installation
Als ich früher FDK AAC und Apple AAC bei 192 kbps verglichen habe, konnte ich keinen Unterschied hören, aber der bisherige FFmpeg-AAC-Encoder brach bei dieser Bitrate ein
Allerdings auf Basis konstanter Bitrate
Core Audio hat mit TVBR auch einen variablen Bitraten-Modus, den der neue Encoder nicht hat
Wenn TVBR nutzbar ist, könnte Core Audio daher weiterhin die Spitze bleiben, aber ich erwarte, dass der neue FFmpeg-Encoder ebenfalls ausreichend gut wird, wenn mehr Leute Problemsamples finden, beitragen und so beim Tuning helfen
Oder man nimmt einfach Opus; das ist auch für Sprache gut und funktioniert heutzutage fast überall
Wenn Apple H.265 nicht übernommen hätte, würden wir vielleicht in einer AV1-Utopie leben
Interessant ist die Stelle: „FFmpegs AAC-Decoder hat einen Bug bei der Verarbeitung von Stereo-PNS, und andere AAC-Decoder könnten ihn ebenfalls haben, daher wird er im Encoder umgangen. Andere Encoder haben PNS nicht verwendet, deshalb wurde das bisher nicht entdeckt“
Ich weiß nicht, was PNS ist, aber es dürfte irgendeinen sehr speziellen Use Case von jemandem 20 Jahre lang geplagt haben
Das eine: Wenn man TNS über PNS verwendet, wird das eingefügte Rauschen durch TNS geformt, aber derjenige, der das Rauschen erzeugt, ist nicht der Encoder, sondern der Decoder, was keinen Sinn ergibt
Dadurch ging PNS kaputt; das größere Problem war jedoch, dass bei Verwendung von PNS zusammen mit bestimmten Stereo-Tools das Rauschen identisch in beide Kanäle durchsickerte und das Stereo-Imaging ruinierte
Deshalb ist es am besten, PNS nur dann zu aktivieren, wenn die betreffenden Bänder in beiden Kanälen vollständig aus Rauschen bestehen oder ausreichend untonal sind und maskiert werden
Ein hervorragendes Update, bei dem die Details gut aufbereitet sind
Opus ist großartig und hat seinen Platz, aber AAC wird nicht verschwinden
Es gibt die Passage: „Der Encoder ist hauptsächlich für 48-kHz-Audio optimiert. Akzeptiert es. Wir haben 2026, Resampling ist kostenlos und 48 kHz ist der Standard. 44,1 kHz funktioniert auch, 96 kHz funktioniert auch, aber wenn ihr die beste Qualität wollt, nutzt 48 kHz.“ Ist 48 kHz heutzutage wirklich der Standard?
Im Abstract wird für Produktion, Verarbeitung und Austausch von Audioprogrammen mit PCM eine Samplingfrequenz von 48 kHz empfohlen; außerdem werden 44,1 kHz für einige digitale Consumer-Anwendungen, 32 kHz für übertragungsbezogene Anwendungen und 96 kHz für Anwendungen mit höherer Bandbreite oder weniger strengen Anti-Aliasing-Filtern anerkannt
Persönlich fühlt sich 44,1 kHz für mich wie ein kleines, lästiges Erbe an
Da sich 20-ms- und 60-ms-Fenster für das menschliche Ohr sehr unterschiedlich anhören, müssen sämtliche psychoakustischen Parameter des Encoders für jede Samplingrate vollständig neu optimiert werden
Bei Opus ist dieses Problem natürlich gelöst
Zum Beispiel wird nach dem Schnitt die Lippensynchronisation leichter
Ein besserer neuer FFmpeg-AAC-Encoder ist willkommen, aber in den Details gibt es zwei ziemlich große Einschränkungen
Er unterstützt nur konstante Bitrate und ist nur für 48-kHz-Sampling optimiert
Dass kein qualitätsbasiertes Encoding mit variabler Bitrate möglich ist, ist eine große Lücke, und wenn man bedenkt, dass CD-Audio weltweit 44,1 kHz hat, wirkt auch das wie ein großes Versäumnis
Audio mit variabler Bitrate klingt furchtbar und spart auch nicht besonders viel Bitrate
-q:akann man „echte“ variable Bitrate verwenden, aber die Metriken liegen ein paar Prozent niedrigerTrotzdem ist das schwer wahrzunehmen, und meiner Meinung nach gewinnt es weiterhin
Die Benchmarks wurden hauptsächlich bei 44,1 kHz durchgeführt, während die per Gehör getunten Daten 48 kHz hatten, weshalb ein Teil der Windowing- und Transienten-Logik an 48 kHz gebunden ist
Sie wurde aber auch auf 44,1 kHz ausreichend gut übertragen, und die Timing-Unterschiede sind nicht groß, deshalb wurde es so belassen
Interessant ist, wie viel davon vom Gehör des Entwicklers selbst abhängt
Das ist zugleich beunruhigend und ziemlich cool, denn die Beurteilung von Audioqualität ist so subjektiv
Musepack war eine Zeit lang auch in einer Nische beliebt; es war ein einfacher, aber sehr gut getunter Codec
Bei Lautsprechern und Kopfhörern ist es genauso: Die Leute denken, es gehe um die Qualität der Bauteile, tatsächlich entscheiden aber vor allem das allgemeine Verständnis der Audiophysik und die Fähigkeit zum guten Tuning
Eine sehr erfreuliche Ergänzung
Hoffentlich kann er jetzt fdk-aac ersetzen
Jemand hat den vielleicht besten AAC-Encoder aller Zeiten gebaut, und die erste Reaktion ist, dass ein Maintainer darüber streitet, ob es 48 kHz oder 44 kHz sind – das ist wirklich Old Internet
Der Autor hat nicht mit der tatsächlich am häufigsten verwendeten Samplingrate getestet, daher wäre es für jedes ernsthafte Projekt absurd, eine jahrzehntealte funktionierende Pipeline komplett umzustellen
Es ist völlig nachvollziehbar, zu warten, bis ausreichend validiert wurde
Als ich früher mit ffmpeg Songs für den iPod nano encodiert habe, waren die Dateien kaputt
Während der Wiedergabe kamen alle paar Sekunden Pops und Klicks dazwischen; ich frage mich, ob das jetzt behoben ist