Concatena più file WAV usando un singolo comando, senza file extra


32

Voglio concatenare più file WAV in un singolo file WAV usando FFMPEG.

Ho usato il seguente comando e genera il file richiesto.

Comando:

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

File :

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

Ma come puoi vedere il problema è che devo creare un file di testo per specificare l'elenco di file WAV da concatenare.

Posso fare tutti questi compiti, ma preferirei un singolo comando che assomigli

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

o

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

Ho provato questi due semplici comandi, ma restituiscono solo la voce di 1.wav Please help me, scrivere un singolo comando (o correggere i 2 comandi precedenti) che raggiunge il risultato desiderato.

Per favore, non suggerire altri codificatori / editor multimediali, voglio usare solo FFMPEG, poiché è già installato e utilizzato in altri luoghi.

Risposte:


34

Potresti provare a usare il filtro concat ; richiede una ricodifica, e quindi richiederà più risorse di sistema (una quantità piuttosto piccola su qualsiasi computer vagamente moderno in questo caso particolare), ma l'audio PCM -> PCM dovrebbe essere matematicamente senza perdite. Nel tuo caso, useresti qualcosa del tipo:

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

Se hai cinque file di input, usa n=5.


4
Nota: non personalizzare [0:0][1:0][2:0][3:0]per abbinare il numero di file. Usalo esattamente come dice. L'unica cosa che dovresti cambiare sono i file di input e n=4.
Keavon

8
@Keavon: sei sicuro? Qui ffmpeg (versione N-49352-gc46943e x64) si lamenta Too many inputs specified for the "concat" filter.quando provo a elaborare solo 2 input con il codice originale. Funziona però quando rimuovo [2:0][3:0]... il che ha senso per me poiché in questo caso non ci sono cose come flussi 2:0e 3:0...
Bigue Nique

Sono d'accordo con @BigueNique. Anch'io mi sono imbattuto nello stesso errore e sebbene sembri un po 'sciocco, ho scritto del codice per generare la sequenza corretta indicata n.
Ryan DuVal

19

Penso che l'opzione migliore sia usare sox, non ffmpeg:

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

La soluzione viene da Come posso aggiungere un mucchio di file .wav mantenendo l'ordinamento numerico (senza zero)?


1
Questo potrebbe funzionare .wav, ma soxnon sembra supportare .mp3.
Aaron Franke,

1
La domanda riguardava precisamente.wav
Héctor M. Monacci,

1
Lo so, sto solo aggiungendo una nota per chiunque cerchi di utilizzare questo metodo con file non wav.
Aaron Franke,

la domanda affermava esplicitamente che una soluzione è richiesta usando solo ffmpeg!
Manu,

sox può supportare anche file .mp3
Benjamin,

9

Il wiki FFmpeg menziona l' uso del concatprotocollo non è possibile con tutti i tipi di file. Funziona bene con la maggior parte dei contenitori MPEG e flussi di bit, ma ovviamente non con i file WAV con audio PCM.

Non devi necessariamente creare un file temporaneo e utilizzarlo. Con Bash (o altre shell che supportano la sostituzione dei processi ), puoi fare tutto in un solo comando:

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

La sostituzione del processo <( )crea un file - o, per essere precisi, un descrittore di file - al volo, che ffmpegpuò leggere. Questo file conterrà il percorso di ogni .wavfile nella directory corrente. Dobbiamo prefissarlo con $(pwd)per ottenere il percorso corretto relativo alla directory corrente e non rispetto al descrittore di file.

Naturalmente, il comando all'interno della sostituzione può essere cambiato in qualcos'altro.


2
Se ricevi un Unsafe file nameerrore, avrai bisogno -safe 0dell'opzione prima -i. rif. stackoverflow.com/q/38996925/297679
Nobu

3

Un'altra opzione è utilizzare concat

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


1
Benvenuto in superutente: anche se questo può o meno rispondere alla domanda (è stata accettata una risposta), sarebbe una risposta migliore se potessi fornire una spiegazione del perché la tua soluzione funziona con i dettagli e istruzioni facili da seguire. Se ritieni che la tua risposta sia corretta, fai queste cose e modifica nuovamente. Per favore, prenditi un paio di minuti e leggi: - superuser.com/help .Risposta: superuser.com/help/how-to-answer , di nuovo benvenuto su superuser.Thankyou
mic84

Ho provato questo e sembra non funzionare
Nick Long

1

Nello script .BAT Cmd.EXE di 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

In questo modo, non ti preoccupi dei nomi dei file di origine o del parametro concat-count.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.