it-swarm.com.de

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

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 1.wav zurück. Bitte helfen Sie mir, einen einzelnen Befehl zu schreiben (oder die obigen 2 Befehle zu korrigieren), der das gewünschte Ergebnis erzielt.

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.

29
Manu

Versuchen Sie es mit dem concat filter ; 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 etwas verwenden wie:

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.

32
evilsoup

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

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

Die Lösung ergibt sich aus Wie hänge ich eine Reihe von .wav-Dateien an, während die numerische Reihenfolge (nicht mit Nullen aufgefüllt) beibehalten wird?

15

Das FFmpeg-Wiki erwähnt , dass das concat-Protokoll verwendet, 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 im laufenden Betrieb eine Datei - oder genauer gesagt einen Dateideskriptor -, die ffmpeg lesen kann. Diese Datei enthält den Pfad zu jeder .wav-Datei im aktuellen Verzeichnis. Wir müssen $(pwd) voranstellen, 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.

9
slhck

Eine andere Möglichkeit ist die Verwendung von concat

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

3
Ivan Malyshev

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.

1
Bilbo