Welche Audio-Encoder in FFmpeg unterstützen 8 kHz?

Welche Audio-Encoder in FFmpeg unterstützen 8 kHz?

Ich habe ein altes Video (aufgenommen mit einer Casio Exilim EX-Z40, falls das wichtig ist), dessen Audiostream ffprobeals gemeldet wird pcm_u8, 8000 Hz, mono, u8.

Ich möchte es in etwas Modernes transkodieren.

Die Transkodierung mit FFmpeg-Standards schlägt fehl:

libfaac unterstützt dieses Ausgabeformat nicht!

Vermutlich unterstützt libfaac 8 kHz nicht, weil -c:a copyes funktioniert.

Welche Encoder unterstützen eine Abtastrate von 8 kHz?Liste hier zu findenerwähnt die Abtastrate kaum.

Kann ich ein Skript schreiben, das alle installierten Codecs ausprobiert, von …

ffmpeg -codecs | grep EA`

…um direkt zu sehen, welche funktionieren?

Antwort1

Der native FFmpeg AAC-Encoder ( -c:a aac) unterstützt eine Abtastrate von 8000 Hz:

ffmpeg -h encoder=aac
...
Supported sample rates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000 7350

Es wird automatisch die Abtastrate gewählt, die der Eingabe am nächsten kommt, Sie müssen also Folgendes nicht angeben -ar:

ffmpeg -i input.mov -c:a aac output.m4a

Welche Audio-Encoder in FFmpeg unterstützen 8 kHz?

aac, aptx, aptx_hd, dca, flac, g723_1, libfdk_aac, libmp3lame, libopus, libspeex, libvorbis, real_144, wavpack, viele pcm-Varianten.

Es gibt wahrscheinlich noch weitere, aber die Berichterstattung darüber supported_sampleratesist inkonsistent.

Ich möchte es in etwas Modernes transkodieren.

libfaac wurde vor Jahren aus FFmpeg entfernt und gilt nicht als moderner AAC-Encoder. Ihr ffmpegmuss uralt sein. Aktualisieren Sie und verwenden Sie den nativen FFmpeg-AAC-Encoder, oder kompilieren Sie und verwenden Sie libfdk_aac.

Wenn Sie modernste Nutzung wünschen libopus.

Aber als ich [aac] ausprobiert habe, war die Dateigröße im Vergleich zum Original größer und einige hohe Frequenzen wurden gedämpft.

Da Ihr Gerät vermutlich ffmpegsehr alt ist, fehlen Ihnen wahrscheinlich die wichtigsten Qualitätsupdates für den Encoder aac. Durch ein Upgrade werden sich die Qualität wahrscheinlich verbessern.

Antwort2

Samplingrate und Codec sind unterschiedliche Parameter. Wahrscheinlich möchten Sie etwas in der Art von

-ar 48000 -c:a aac

Zum Upsampling von 8KHz auf 48KHz und zur Komprimierung auf AAC

Antwort3

8 KHz ist für Sprache ziemlich normal und wird als „Schmalband“ bezeichnet. Wenn es sich um Sprache handelt, sollten Sie viele Optionen haben, obwohl nicht viele von FFmpeg standardmäßig unterstützt werden. Die wahrscheinlich besten Optionen sind

Allerdings ist 8-kHz-8-Bit-PCM ohnehin keine besonders gute Quelle: Die meisten Encoder erwarten/hoffen auf bessere Eingaben, z. B. 8-Bit-G.711-Mu-Law, was effektiv 12-Bit-Daten sind, die als 8-Bit-Gleitkomma codiert sind. Mit reinen 8-Bit-PCM-Eingaben kommen sie möglicherweise nicht gut zurecht, da diese möglicherweise nicht zu den Sprachmustern passen, für die sie modelliert wurden.

Es ist außerdem bereits eine ziemlich kleine Datei und es ist möglich, dass Ihr Videocontainer kompliziertere Codecs nicht unterstützt. Ich denke also, dass das mehr Ärger macht, als es wert ist, und ich würde den Ton so lassen, wie er ist.

Antwort4

Opuswird allgemein als der beste verfügbare Codec mit niedriger Bitrate angesehen undhat keine Problememit einer Eingangsabtastrate von 8 kHz. Der resultierende Opus-Stream kann immer noch mit der für den Decoder geeigneten Abtastrate dekodiert werden. (Wie andere verlustbehaftete Codecs komprimiert er nach einer FFT basierend auf Frequenzbändern. Einige andere Codecs möchten jedoch anscheinend nur mit der gleichen Abtastrate wie die Eingabe dekodieren. Wie andere Antworten zeigen, müssen SiedürfenLassen Sie FFmpeg die Eingabe neu abtasten, bevor Sie sie an den Codec weitergeben. Für Opus ist das jedoch nicht erforderlich.

Versuchenffmpeg -c:a libopus -b:a 24k -frame_duration 120für 24 kbit/s Opus.

Vielleicht einen Versuch wert: -application voipstatt des Standardprofils auf „verbesserte Sprachverständlichkeit“ einzustellen audio.

Ich denke, die Einstellung -frame_durationauf den höchsten Wert reduziert den Overhead. Die Latenz des Encoders/Decoders ist Ihnen egal, da Sie nur Dateien haben und keinen Echtzeit-Zweiwege-Voice-Chat. Sie können also 120 ms Audio puffern lassen und mehrere CELT- oder SILK-Frames zusammenpacken, um die Redundanz der Frame-Header zu reduzieren.


Der beste verfügbare Opus-Encoder ist der kostenlose Open Source libopus(https://opus-codec.org), sodass FFmpeg es einfach verwenden kann, anders als bei AAC, wo die besten Encoder Closed Source sind.

Opus verfügt über spezielle Modi für Sprache mit sehr niedriger Bitrate (z. B. 16 kb/s), erkennt Sprache und schaltet bei niedrigen Bitraten sogar auf einen sprachspezifischen Encoder (SILK) um.

Die Low-Bitrate-Codierungstools von Opus ähneln denen von HE-AACv2, sieheder Wikipedia-Artikel.


Aber als ich es ausprobiert habe, hat sich die Dateigröße im Vergleich zum Original vergrößert ...

Ein Teil des Sinns der verlustbehafteten Komprimierung besteht darin, dass Siewählendie Ausgabebitrate, ein Kompromiss zu Lasten der QualitätDie meisten Codecs können -b:a 32kbeispielsweise eine Audio-Bitrate von 32 kbit/s wählen.

(Bei Videos können Sie auch die für die Kodierung aufgewendete CPU-Zeit abwägen, z. B. -preset veryslow vs. -preset medium. Die Komprimierung von Audio ist jedoch so günstig, dass die meisten Codecs nicht viele Möglichkeiten bieten, mehr CPU-Zeit aufzuwenden, um das Verhältnis zwischen Bitrate und Qualität zu verbessern.)

Mono 8-Bit 8 kHz PCM hat eine Bitrate von 64 kbit/s = 8 * 8000, Sie sollten also weniger als das anstreben, sonst können Sie Ihre Originaldateien auch behalten. PCM besteht nur aus Rohproben, die Bitrate ist also nur ein Produkt aus Abtastrate und Abtastbreite. Wie das Audioäquivalent eines .bmpBitmap-Bildes. Das ist höchst ineffizient und der Grund, warum bessere Codecs erfunden wurden. (Und wie Sie aus Erfahrung wissen, geht das Einsparen von Bitrate für PCM auf Kosten von Qualität und Frequenz.Reichweiteweil die Bitrate 1:1 an die Abtastrate gebunden ist. Das ist nicht der Fall, wenn Sie mit einem verlustbehafteten Codec im Frequenzbereich quantisieren.)


und einige hohe Frequenzen wurden gedämpft. Also schlimmer als-c:a copy

Der native AAC-Encoder von FFmpeg -c:a aacwar früher ziemlich schlecht und Sie haben ein altes FFmpeg verwendet. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudiosagt, dass es ab 2017 aacmanchmal besser ist als libfdk_aacfür AAC-LC (Low-Complexity High Bitrate). HE-AAC wird jedoch nicht erwähnt, und das ist, was Sie für AAC mit niedriger Bitrate wollen.

libfdk_aac war früher der beste verfügbare Open-Source-AAC-Encoder und ist es für HE-AAC vielleicht immer noch. Soweit ich weiß, ist jedoch keiner von beiden so gut wie die besten nicht-freien AAC-Encoder.

Für AAC mit niedriger Bitrate benötigen Sie HE-AAC, das weitere Codierungstools hinzufügthttps://en.wikipedia.org/wiki/High-Efficiency_Advanced_Audio_Coding. Ich bin nicht sicher, ob -c:a aacich das kann.

https://trac.ffmpeg.org/wiki/Encode/HighQualityAudiolistet einige empfohlene Einstellungen und Bereiche nützlicher Bitraten für verschiedene Encoder auf.

Aber Sie wollen wahrscheinlich Opus oder möglicherweise AMR-NB (Schmalband) für Bitraten wie 4 kbit/s. Ich weiß nicht, wie altdas Diagramm Qualität vs. Bitrate im Opus-Wiki-Artikelist, aber es zeigt AMR-NB in ​​höherer Qualität als Opus unter 8 kb/s.

Mit diesen wenigen Bits können Sie vielleicht Sprache verstehen, aber sie klingt nichtHübschEs ist nur die Frage, welcher Codec am wenigsten schlimm ist.

verwandte Informationen