Concatene múltiples archivos WAV con un solo comando, sin archivo adicional

32

Quiero concatenar múltiples archivos WAV en un solo archivo WAV usando FFMPEG.

He usado el siguiente comando y genera el archivo requerido.

Mando:

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

Archivo :

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

Pero como puede ver, el problema es que tengo que crear un archivo de texto para especificar la lista de archivos WAV para concatenar.

Puedo hacer todas estas tareas, pero preferiría un solo comando, algo que se parezca

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

He probado estos dos comandos simples pero devuelven solo la voz de 1.wav Por favor, ayúdame a escribir un solo comando (o corregir los 2 comandos anteriores) que logre el resultado deseado.

No sugiera otros codificadores / editores de medios, solo quiero usar FFMPEG, ya que ya está instalado y utilizado en otros lugares.

Manu
fuente

Respuestas:

34

Podría intentar usar el filtro concat ; requiere una nueva codificación, por lo que tomará más recursos del sistema (una cantidad bastante pequeña en cualquier computadora vagamente moderna en este caso particular), pero PCM -> el audio PCM debería ser matemáticamente sin pérdidas. En su caso, usaría algo como:

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

Si tiene cinco archivos de entrada, use n=5.

maldad
fuente
44
Nota: No personalice [0:0][1:0][2:0][3:0]para que coincida con la cantidad de archivos. Use eso exactamente como dice. Lo único que debe cambiar son los archivos de entrada y n=4.
Keavon
8
@Keavon: ¿estás seguro? Aquí ffmpeg (versión N-49352-gc46943e x64) se queja Too many inputs specified for the "concat" filter.cuando intento procesar solo 2 entradas con el código original. Sin embargo, funciona cuando elimino [2:0][3:0]... lo que tiene sentido para mí, ya que en este caso no hay cosas como transmisiones 2:0y 3:0...
Bigue Nique
Estoy de acuerdo con @BigueNique. También me encontré con el mismo error y, aunque se siente un poco tonto, escribí un código para generar la secuencia adecuada n.
Ryan DuVal
19

Creo que la mejor opción es usar sox, no ffmpeg:

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

La solución proviene de ¿Cómo agrego un montón de archivos .wav mientras mantengo el orden numérico (sin relleno de cero)?

Héctor M. Monacci
fuente
1
Esto puede funcionar .wav, pero soxno parece ser compatible .mp3.
Aaron Franke
1
La pregunta era precisamente sobre.wav
Héctor M. Monacci
1
Lo sé, solo estoy agregando una nota para cualquiera que intente usar este método con archivos que no sean wav.
Aaron Franke
¡La pregunta decía explícitamente que se requiere una solución usando solo ffmpeg!
Manu
Sox también puede soportar archivos .mp3
Benjamin
9

La wiki de FFmpeg menciona que usar el concatprotocolo no es posible con todos los tipos de archivos. Funciona bien con la mayoría de los contenedores y flujos de bits MPEG, pero obviamente no con archivos WAV con audio PCM.

No necesariamente tiene que crear un archivo temporal y usarlo. Con Bash (u otros shells que admiten la sustitución de procesos ), puede hacer todo en un solo comando:

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

La sustitución del proceso <( )crea un archivo (o, para ser precisos, un descriptor de archivo) sobre la marcha, que ffmpegpuede leerse. Este archivo contendrá la ruta a cada .wavarchivo en el directorio actual. Tenemos que ponerle el prefijo $(pwd)para obtener la ruta correcta en relación con su directorio actual, y no en relación con el descriptor de archivo.

Por supuesto, el comando dentro de la sustitución se puede cambiar a otra cosa.

slhck
fuente
2
Si obtiene un Unsafe file nameerror, necesitaría la -safe 0opción antes -i. árbitro. stackoverflow.com/q/38996925/297679
Nobu
3

Otra opción es usar concat

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

Ivan Malyshev
fuente
1
Bienvenido al superusuario: si bien esto puede o no responder a la pregunta, (se ha aceptado una respuesta), sería una mejor respuesta si pudiera proporcionar una explicación de por qué su solución funciona con detalles y unas instrucciones fáciles de seguir. Si cree que su respuesta es correcta, haga estas cosas y vuelva a editar. Por favor tome un par de minutos y leer: - superuser.com/help .Answering: superuser.com/help/how-to-answer , de nuevo la bienvenida a superuser.Thankyou
mic84
Probé esto y no parece funcionar
Nick Long
1

En la secuencia de comandos Cmd.EXE .BAT de 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

De esta manera, no se molesta con los nombres de los archivos de origen ni con el parámetro concat-count.

Bilbo
fuente
-1

Podrías usar shntoolpara archivos wav.

shnjoin -r none 01.wav 02.wav ...
Patrik Wallander
fuente