Wie kann ich die Stille (0dB) von MP3 automatisch abschalten, ohne erneut kodieren zu müssen?

341
Vitaly Zdanevich

Während ich Silenceremove lese, wird die Datei reencode.

Normalerweise mache ich das manuelle Erstellen von Dateien wie:

file 'file.mp3' inpoint 0 outpoint 01:55:00.0  file 'file.mp3' inpoint 02:03:50.0 

und diesen Befehl ausführen:

ffmpeg -f concat -safe 0 -i list.txt -c copy file.mp3 

Vielleicht kann ich Silencedetect verwenden, um dieselbe Datei zu erstellen ...

0
Da es sich bei MP3 um ein komprimiertes Format handelt, können die Stille nur durch Dekomprimieren identifiziert werden, sodass nach dem Entfernen eine erneute Komprimierung erforderlich ist. Um Stille ohne weitere Beeinträchtigung zu entfernen, müssen Sie vor der MP3-Kodierung die Originaldatei bearbeiten. Wenn dies nicht möglich ist, können Sie am besten dekomprimieren, die Stille entfernen und mit einem verlustfreien Encoder speichern. Sie haben jedoch im Vergleich zu MP3 eine viel schlechtere Komprimierung. AFH vor 6 Jahren 1
Mit ffmpeg können wir jedoch bereits Teile von MP3 schneiden, ohne die Bereiche manuell neu zu kodieren. Vitaly Zdanevich vor 6 Jahren 0
Ich habe das nicht erwartet, aber nach einem Blick auf die MP3-Spezifikation scheint es, dass jeder Datenblock unabhängig komprimiert werden kann. Sie sollten in der Lage sein, eine Editierliste aus "Silencedetect" zu erstellen, aber es lohnt sich wahrscheinlich zu prüfen, ob Sie der Befehlszeichenfolge "Silenceremove" die Option -c copy hinzufügen können. Leider habe ich diese Optionen nicht in meiner Kopie von ffmpeg (3.4.4), daher kann ich nicht testen, ob es funktioniert. AFH vor 6 Jahren 0
@AFH [Aus einer anderen Antwort] (https://stackoverflow.com/a/29411973/1879101): `Sie können -acodec nicht verwenden, um die Originalqualität zu erhalten." Vitaly Zdanevich vor 6 Jahren 0
Ich habe mir @ harrymcs Antwort und Links angesehen: Ich habe festgestellt, dass _do_ `Silenceremove` als Filter hat, aber als ich versuchte, es mit` -c copy` zu kombinieren, bekam ich `Filtergraph 'Silenceremove = 0.5: -50dB' Für Audioausgabestrom 0: 0 definiert, aber die Codec-Kopie wurde ausgewählt. `/` Filtering und Streamcopy können nicht zusammen verwendet werden. `Ich denke, das muss Ihre Antwort sein, obwohl eine Bearbeitungsliste immer noch eine Antwort ohne erneute Codierung zulässt. AFH vor 6 Jahren 0

1 Antwort auf die Frage

0
harrymc

Dies wird im Stack Overflow-Beitrag unter Verwendung von FFMPEG mit Silencedetect beantwortet , um die Stille von Audio zu entfernen .

Die erste Bemerkung ist, dass Silencedectect die Stille nur erkennt, nicht aber entfernt. Sie sollten stattdessen den Schalldämpferfilter verwenden.

So stellen Sie fest, ob in Ihrer Version von ffmpeg dieser Filter ausgeführt wird:

ffmpeg -hide_banner -filters | grep silenceremove 

Die Ausgabe sollte folgendermaßen aussehen:

silenceremove A->A Remove silence 

Der Befehl zum Entfernen stiller Teile kann folgendermaßen aussehen:

ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3 

Wenn der Parameter "Silenceremove" wie folgt entfernt wird:

  • am Anfang (durch das erste Argument angegeben 1)
  • mit minimaler Länge Null (durch das zweite Argument angegeben 0)
  • Schweigen wird als alles unter -50 Dezibel eingestuft (angezeigt durch -50dB)

Referenz: FFMPEG Silence Filter entfernen .

Um den richtigen Wert für die Stille zu finden, normalisieren Sie zunächst die Eingangslautstärke auf 0dB, wie in dieser Antwort beschrieben .

Kommentar unter dem ersten Link: `Bitte beachten Sie, dass -af Silenceremove ** Ihre Audiodateien neu codiert.` Vitaly Zdanevich vor 6 Jahren 0
Dies wäre tatsächlich erforderlich, da das Codierschema möglicherweise das Audio unmittelbar vor oder nach dem ausgeschalteten geräuscharmen Teil neu codieren muss. harrymc vor 6 Jahren 0
Mit ffmpeg können Sie jedoch Teile der MP3-Datei manuell schneiden, ohne sie neu codieren zu müssen. Vitaly Zdanevich vor 6 Jahren 0
Ich habe keine Kenntnis darüber, wie dieser Filter programmiert wurde. harrymc vor 6 Jahren 0
@VitalyZdanevich Filtering erfordert eine erneute Codierung. Die Eingabe wird [decodiert, dem Filter zugeführt und dann codiert] (https://ffmpeg.org/ffmpeg.html#Simple-filtergraphs) in Ihrem Ausgabeformat. Sie können also beim Filtern keine [Stream-Kopie] (https://ffmpeg.org/ffmpeg.html#Stream-copy) durchführen. "Manuelles Ausschneiden von Teilen der MP3-Datei" mit Streamkopie lässt Dekodierung / Kodierung weg und re-muxet nur. LordNeckbeard vor 6 Jahren 1