Audiokonvertierung mit ffmpeg und Filtern

LowPowerMan

Cadet 1st Year
Registriert
Nov. 2022
Beiträge
12
Irgendwo stehe ich bei ffmpeg auf dem Schlauch was Filter und Konvertierung angeht.

Mein Plan ist folgender:
  • von Youtube ein Hörbuch herunterladen
  • nervigen In/Out Jingle wegschneiden
  • normalisieren
  • Stille vorne und hinten entfernen
  • zu Opus konvertieren

(Ja, ich weis daß ich verlustbehaftet konvertiere, aber so dolle ist mein Gehör nicht mehr, als daß das eine Rolle spielt)

Herunterladen:
Code:
yt-dlp --format "ba" "https://www.youtube.com/watch?v=HXxk0VTDCEk" -o konny.webm

Inspizieren:
Code:
ffprobe -hide_banner konny.webm
  Duration: 00:35:03.88, start: -0.007000, bitrate: 135 kb/s
  Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)

Zuerst in wav, dann zu Opus:
Code:
ffmpeg -hide_banner -i konny.webm -sn -vn -dn -map_metadata -1 -af "atrim=10:2089.912,volume=8.4dB" -r:a 48000 -y konny.wav
ffmpeg -hide_banner -i konny.wav -af "areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB" -c:a libopus -b:a 64k -vbr on -compression_level 1 -y "konny-2pass.opus"

Beide Schritte oben zusammenfassen:
Code:
ffmpeg -hide_banner -i konny.webm -sn -vn -dn -map_metadata -1 -af "atrim=10:2089.912,volume=8.4dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB" -r:a 48000 -c:a libopus -b:a 64k -vbr on -compression_level 1 -y "konny-1pass.opus"

Beide Ausgaben inspizieren:
Code:
ffprobe -hide_banner konny-2pass.opus 
  Duration: 00:34:36.32, start: 0.000000, bitrate: 71 kb/s
  Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp

ffprobe -hide_banner konny-1pass.opus 
  Duration: 00:34:46.32, start: 10.000000, bitrate: 71 kb/s
  Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp

Zum testen den obigen Schritt mit einer mp3 Version:
Code:
ffmpeg -hide_banner -i konny.mp3 -sn -vn -dn -map_metadata -1 -af "atrim=10:2089.912,volume=8.4dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB" -r:a 48000 -c:a libopus -b:a 64k -vbr on -compression_level 1 -y "konny-1passmp3.opus"

Die beiden inspizieren
Code:
ffprobe -hide_banner konny.mp3 
  Duration: 00:35:03.91, start: 0.023021, bitrate: 60 kb/s
  Stream #0:0: Audio: mp3, 48000 Hz, stereo, fltp, 60 kb/s

ffprobe -hide_banner konny-1passmp3.opus 
  Duration: 00:34:46.19, start: 10.000000, bitrate: 79 kb/s
  Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp

Umweg über wav:
Code:
ffmpeg -hide_banner -i konny.mp3 -sn -vn -dn -map_metadata -1 -af "atrim=10:2089.912,volume=8.4dB" -r:a 48000 -y konny.wav
ffmpeg -hide_banner -i konny.wav -af "areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB" -c:a libopus -b:a 64k -vbr on -compression_level 1 -y "konny-2passmp3.opus"

Dateigrößen:
Code:
ll *.opus
-rwxr-xr-x. 1 tester tester 20747530 Jul  5 09:42 konny-1passmp3.opus
-rwxr-xr-x. 1 tester tester 18644747 Jul  5 09:41 konny-1pass.opus
-rwxr-xr-x. 1 tester tester 19486690 Jul  5 10:42 konny-2passmp3.opus
-rwxr-xr-x. 1 tester tester 18627102 Jul  5 09:41 konny-2pass.opus

Die Quelle ist immer die Gleiche, aber warum kommt nicht immer die gleiche Opus Datei heraus?

Die beiden Konvertierungen der webm Quelle unterscheiden sich um 17kB; geschenkt. Aber von der mp3 Quelle ist das Opus im 1pass um 2MB größer. Beim Umweg über wav als 2pass wird das Opus kleiner, aber immer noch fast 1MB größer als vom webm.
Die 1-pass Versionen sind auch 10s länger, aber der Audioplayer springt 10s vor Ende zum nächsten Track, ist also wohl ein Fehler der Metadaten.

(mp3, weil ich auch noch einigen mp3 Kram habe den ich konvertieren will).

Das ganze über eine Pipe:
Code:
ffmpeg -hide_banner -i konny.webm -sn -vn -dn -map_metadata -1 -af "atrim=10:2089.912,volume=8.4dB" -r:a 48000 -f wav - | ffmpeg -hide_banner -f wav -i - -af "areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB,areverse,silenceremove=start_periods=1:start_duration=1:start_threshold=-60dB" -c:a libopus -b:a 64k -vbr on -compression_level 1 -y "konny-piped.opus"
Da kommt das gleiche raus wie beim 2pass, aber ffmpeg spuckt eine Warnung aus mit der ich nichts anzufangen weis:
Code:
[wav @ 0x5587a67dd640] Packet corrupt (stream = 0, dts = NOPTS).
pipe:: corrupt input packet in stream 0
 
ich mach das so:
Firefox mit Addon "VideodownloadHelper" benutzen.
Video starten
klick im Addon auf die 3 Punkte > Audio downloaden
...warten...
Mp3 Datei liegt im Download

Nachtrag: das Addon funktioniert nicht mit der SNAP Version von Firefox.
Aber in meinem Mint geht es...
 
LowPowerMan schrieb:
Die 1-pass Versionen sind auch 10s länger, aber der Audioplayer springt 10s vor Ende zum nächsten Track, ist also wohl ein Fehler der Metadaten.
Das ist richtig. In der Doku zu atrim steht "Also note that this filter does not modify the timestamps." Es werden also die Zeitstempel vom Original übernommen, weswegen sie dann quasi hier um 10 Sekunden verschoben sind. Bei Wave unterstützt ffmpeg keine solchen Zeitstempel, also verschwindet der "Fehler". Auch die Fehlermeldung mit dem korrupten Input bezieht sich darauf.

LowPowerMan schrieb:
Die Quelle ist immer die Gleiche, aber warum kommt nicht immer die gleiche Opus Datei heraus?

Die beiden Konvertierungen der webm Quelle unterscheiden sich um 17kB; geschenkt. Aber von der mp3 Quelle ist das Opus im 1pass um 2MB größer.
Die Quelle ist nicht gleich. Das ist einmal Opus und einmal MP3. Die MP3-Datei hat bei 48 kHz eine extrem niedrige Bitrate von 60 kbit/s. Das führt zu sehr starken Artefakten, die dann anschließend von Opus ebenfalls kodiert werden und entsprechend mehr Bitrate verbrauchen, was zu größeren Dateien führt.
Außerdem trimmst du vermutlich irgendwo doppelt, weil die Zeitstempel dann rund 20 statt 10 Sekunden auseinanderliegen.
 
Amaoto schrieb:
Das ist richtig. In der Doku zu atrim steht "Also note that this filter does not modify the timestamps." Es werden also die Zeitstempel vom Original übernommen, weswegen sie dann quasi hier um 10 Sekunden verschoben sind. Bei Wave unterstützt ffmpeg keine solchen Zeitstempel, also verschwindet der "Fehler". Auch die Fehlermeldung mit dem korrupten Input bezieht sich darauf.
Ah, okay. Danke!
Die Fehlermeldung ist dann bloß ein Hinweis darauf und kann ignoriert werden, weil das Audio an sich nicht korrupt wird?

Amaoto schrieb:
Die Quelle ist nicht gleich. Das ist einmal Opus und einmal MP3. Die MP3-Datei hat bei 48 kHz eine extrem niedrige Bitrate von 60 kbit/s. Das führt zu sehr starken Artefakten, die dann anschließend von Opus ebenfalls kodiert werden und entsprechend mehr Bitrate verbrauchen, was zu größeren Dateien führt.
Außerdem trimmst du vermutlich irgendwo doppelt, weil die Zeitstempel dann rund 20 statt 10 Sekunden auseinanderliegen.
Stimmt, technisch sind es verschiedene Quellen, aber halt mit dem gleichen Inhalt.
Ich hätte aber nicht gedacht, daß das so einen deutlichen Unterschied macht.
Soweit es möglich ist werde ich die Quellen neu herunterladen und davon konvertieren.
Falls was nicht mehr bei YT zu finden ist, gibt es dann einen brauchbaren Filter in ffmpeg, der die Artefakte etwas ausbügelt? Die Filter die ich so sehe sind zumeist für Video.
 
Zurück
Oben