Verketten Sie mehrere WAV-Dateien mit einem einzigen Befehl ohne zusätzliche Datei


32

Ich möchte mit FFMPEG mehrere WAV-Dateien zu einer einzigen WAV-Datei verketten.

Ich habe den folgenden Befehl verwendet und er generiert die erforderliche Datei.

Befehl:

ffmpeg -f concat -i mylist.txt -c copy output.wav

Datei :

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

Aber wie Sie sehen, besteht das Problem darin, dass ich eine Textdatei erstellen muss, um die Liste der zu verkettenden WAV-Dateien anzugeben.

Ich kann all diese Aufgaben erledigen, aber ich würde einen einzelnen Befehl vorziehen, der so aussieht

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

oder

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

Ich habe diese beiden einfachen Befehle ausprobiert, aber sie geben nur die Stimme von zurück. 1.wav Bitte helfen Sie mir, einen einzelnen Befehl zu schreiben (oder die obigen 2 Befehle zu korrigieren), mit dem das gewünschte Ergebnis erzielt wird.

Bitte schlagen Sie keine anderen Media Encoder / Editoren vor, ich möchte nur FFMPEG verwenden, da es bereits installiert ist und an anderen Orten verwendet wird.

Antworten:


34

Sie können versuchen, den Concat- Filter zu verwenden . Es erfordert eine Neucodierung und beansprucht daher mehr Systemressourcen (in diesem speziellen Fall nur eine winzige Menge auf einem vage modernen Computer), aber PCM -> PCM-Audio sollte mathematisch verlustfrei sein. In Ihrem Fall würden Sie Folgendes verwenden:

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

Wenn Sie fünf Eingabedateien haben, verwenden Sie n=5.


4
Hinweis: Passen Sie die Einstellungen nicht [0:0][1:0][2:0][3:0]an die Anzahl der Dateien an. Verwenden Sie das genau so, wie es heißt. Das einzige, was Sie ändern sollten, sind die Eingabedateien und n=4.
Keavon

8
@Keavon: Bist du sicher? Hier beschwert sich ffmpeg (Version N-49352-gc46943e x64), Too many inputs specified for the "concat" filter.wenn ich versuche, nur 2 Eingaben mit dem Originalcode zu verarbeiten. Es funktioniert jedoch, wenn ich entferne [2:0][3:0]... was für mich sinnvoll ist, da in diesem Fall keine Dinge wie Streams 2:0und 3:0...
Bigue Nique

Ich bin mit @BigueNique einverstanden. Auch ich bin auf den gleichen Fehler gestoßen, und obwohl es sich ein wenig albern anfühlt, habe ich Code geschrieben, um die richtige angegebene Sequenz zu generieren n.
Ryan DuVal

19

Ich denke, die beste Option ist es, sox zu verwenden, nicht ffmpeg:

$ sox short1.wav short2.wav short3.wav long.wav

Lösung kommt von Wie hänge ich eine Reihe von .wav-Dateien an, während ich die numerische Reihenfolge (nicht mit Nullen aufgefüllt) behalte?


1
Dies mag funktionieren .wav, soxscheint aber nicht zu stützen .mp3.
Aaron Franke

1
Die Frage war genau über.wav
Héctor M. Monacci

1
Ich weiß, ich füge nur eine Notiz für jeden hinzu, der versucht, diese Methode mit Nicht-WAV-Dateien zu verwenden.
Aaron Franke

die frage lautete ausdrücklich, dass eine lösung nur mit ffmpeg erforderlich ist!
Manu

SoX kann auch MP3-Dateien unterstützen
Benjamin

9

Das im FFmpeg-Wiki erwähnte Verwenden des concatProtokolls ist nicht bei allen Dateitypen möglich. Es funktioniert gut mit den meisten MPEG-Containern und Bitstreams, aber offensichtlich nicht mit WAV-Dateien mit PCM-Audio.

Sie müssen nicht unbedingt eine temporäre Datei erstellen und diese verwenden. Mit Bash (oder anderen Shells, die die Prozessersetzung unterstützen ) können Sie alles in einem einzigen Befehl ausführen:

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

Die Prozessersetzung <( )erstellt eine Datei - oder genauer gesagt einen Dateideskriptor - im laufenden Betrieb, die ffmpeggelesen werden kann. Diese Datei enthält den Pfad zu jeder .wavDatei im aktuellen Verzeichnis. Wir müssen ihm das Präfix voranstellen $(pwd), um den korrekten Pfad relativ zu Ihrem aktuellen Verzeichnis und nicht relativ zum Dateideskriptor zu erhalten.

Natürlich kann der Befehl innerhalb der Ersetzung in etwas anderes geändert werden.


2
Wenn Sie eine Unsafe file nameFehlermeldung erhalten, benötigen Sie zuvor eine -safe 0Option -i. ref. stackoverflow.com/q/38996925/297679
Nobu

3

Eine andere Möglichkeit ist die Verwendung von concat

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodec copy out.mp3


1
Willkommen beim Superuser: Hiermit kann die Frage zwar beantwortet oder nicht beantwortet werden (eine Antwort wurde akzeptiert). Es wäre jedoch eine bessere Antwort, wenn Sie eine Erklärung, warum Ihre Lösung im Detail funktioniert, und eine einfach zu befolgende Anleitung angeben könnten. Wenn Sie der Meinung sind, dass Ihre Antwort korrekt ist, führen Sie diese Schritte aus und bearbeiten Sie sie erneut. Bitte nehmen Sie ein paar Minuten und lesen: - superuser.com/help .Answering: superuser.com/help/how-to-answer , wieder zu superuser.Thankyou begrüßen
mic84

Ich habe das getestet und es scheint nicht zu funktionieren
Nick Long

1

Im Cmd.EXE .BAT-Skript von Win8:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

Auf diese Weise kümmern Sie sich nicht um die Namen der Quelldateien oder den concat-count-Parameter.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.