Fügen Sie dem Ende einer MP3-Datei Stille hinzu

12

Kennt jemand von euch eine Möglichkeit, dem Ende einer MP3-Datei unter Linux eine Stille von fester Dauer hinzuzufügen? Zum Beispiel mit MEncoder, FFmpeg usw.?

Es muss eine Befehlszeile sein, da es mit Skripten versehen und auf unserem Server ausgeführt wird.

Ich habe das gegoogelt und das Beste, was ich tun kann, ist die Verwendung der padFunktion in SoX , aber das funktioniert nicht mit MP3s.

Ich könnte es in WAV konvertieren, SoX verwenden, es dann wieder in MP3 konvertieren und die Metadaten (abzüglich der Dauer) vom Original in das neue MP3 kopieren. Aber bevor ich ein Skript dafür schreibe, dachte ich, ich würde sehen, ob es eine One-Hit-Lösung gibt.

Max Williams
quelle
2
Ich denke, Sie können so etwas mit mp3DirectCut erreichen (nur Windows, aber sie sagen, dass es mit Linux unter Wine kompatibel ist), wodurch eine erneute Komprimierung der Sounddaten vermieden wird. Wenn Sie MP3 -> WAV -> MP3 wählen würden, würden Sie den bereits MP3-komprimierten Datenstrom erneut komprimieren und dabei viel Qualität verlieren.
Durchbruch
Vielen Dank. Können Sie Windows-Software über Wine über die Befehlszeile ausführen? Ich würde es vorziehen, Wine-Lösungen nach Möglichkeit zu vermeiden, da ich Wine nur ungern auf unserem Server installieren möchte.
Max Williams
Hmm, vielleicht möchten Sie die Weinroute meiden, wenn Sie sie noch nicht haben. Wine selbst ist ein ziemlich großer Download, weit über ein oder zwei Megabyte für ein einfaches MP3-Tool zum Ausschneiden / Zusammenführen. Ich bin sicher, es gibt eine gleichwertige, Linux-native Lösung. Wenn ich zusätzliche Tools finde, werde ich Sie sicher informieren.
Durchbruch

Antworten:

9

Mit dem padArgument von SoX und der folgenden Syntax können Sie dies ganz einfach tun :

sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>

Beispiel:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Diese Stille ist in Sekunden. (Andere Verwendungen sind mit einer anderen Syntax möglich, um diese Stille an bestimmten Positionen einzufügen. Weitere Informationen finden Sie in der SoX-Dokumentation.)

Fabien Snauwaert
quelle
Ich sollte beachten, dass ich es mit MP3-Dateien (mit libmad-0.dll und libmp3lame-0.dll zum Dekodieren und Codieren von MP3s) in Ordnung getestet habe. Soweit möglich würde ich empfehlen, mit einem verlustfreien Format zu arbeiten und nur in zu konvertieren MP3 nur am Ende.
Fabien Snauwaert
das ist echt cool - danke Fabien!
Max Williams
Ist das verlustfrei?
Geremia
Update: Ich habe in der Sox-Manpage gelesen, dass es in ein internes Format konvertiert und dann neu codiert wird…
Geremia
MP3 ist ein verlustbehaftetes Format. Durch das Codieren und Neucodieren in ein verlustbehaftetes Format wird die Audioqualität zunehmend beeinträchtigt (unabhängig davon, ob Sie es hören oder nicht). Daher ist es am besten, mit verlustfreien Formaten zu arbeiten und am Ende nur einmal in ein verlustbehaftetes Format zu codieren. Für eine Liste verlustbehafteter Audio-Codecs: en.wikipedia.org/wiki/Lossy_compression#Audio und für eine Liste verlustfreier Audio-Codecs en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert
15

Mit ffmpeg können Sie den aevalsrc-Filter verwenden, um Stille zu erzeugen, und dann in einem zweiten Befehl das concat-Protokoll verwenden, um sie verlustfrei zu kombinieren:

ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3

Sie können die Dauer der Stille steuern, indem Sie die -t 10gewünschte Zeit in Sekunden festlegen. Natürlich müssen Sie die Stille nur einmal erzeugen, dann können Sie die Datei behalten und damit jede der gewünschten Dateien auffüllen. Möglicherweise möchten Sie auch den Concat-Demuxer nachschlagen - er ist etwas prozessorintensiver, aber es fällt Ihnen möglicherweise leichter, in ein Shell-Skript zu wechseln .

Wenn Sie dies mit einem einzigen Befehl tun möchten, können Sie den Concat-Filter verwenden. Dazu müssen Sie Ihr Audio neu codieren (da Filtergraphen nicht kompatibel sind -codec copy). Daher ist die obige Option wahrscheinlich die beste für Sie. Dies kann jedoch für alle nützlich sein, die mit rohem PCM arbeiten und vor dem Codieren des Audios am Ende Stille hinzufügen möchten:

ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3

Steuern Sie die Länge der Stille, indem d=10Sie auf die gewünschte Zeit (in Sekunden) wechseln . Wenn Sie diese Methode verwenden, ist diese FFmpeg MP3-Codierungsanleitung möglicherweise hilfreich.

Übelsuppe
quelle
danke @evilsoup. Ich habe es gerade versucht und folgendes bekommen - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4.61 Schweigen.mp3ffmpeg version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:33 with gcc 4.6.3 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Unrecognized option 'filter_complex' Failed to set value 'aevalsrc=0' for option 'filter_complex'
Max Williams
@max Zunächst einmal verwenden Sie tatsächlich avconv aus dem libav-Projekt - sie sind eine Abzweigung von FFmpeg, die Debian & Ubuntu anstelle des Hauptprojekts verwenden, und sie bieten eine verkrüppelte Version von ffmpeg. Versuchen Sie es mit avconvstatt - die Syntax gleich sein sollte, ersetzen Sie einfach ffmpegmit avconv.
Evilsoup
Wenn dies nicht funktioniert, versuchen Sie, ein Upgrade auf eine neuere Version von ffmpeg durchzuführen. Da Sie unter Ubuntu arbeiten, sollten Sie in der Lage sein, diese PPA zu verwenden , oder für die neueste Version können Sie sie aus dem Quellcode kompilieren .
Evilsoup
1
@MaxWilliams Oder Sie können einen statischen Build herunterladen , den Sie nicht zuerst kompilieren müssen. Einfach herunterladen, extrahieren, verwenden.
Slhck
1
Zum späteren Nachschlagen: Wenn Sie wie ich auf Fehler stoßen, versuchen Sie, einfache Anführungszeichen durch doppelte Anführungszeichen zu ersetzen
SZT