Concatena vários arquivos WAV usando um único comando, sem arquivo extra

19

Eu quero concatenar vários arquivos WAV em um único arquivo WAV usando o FFMPEG.

Eu usei o seguinte comando e ele gera o arquivo necessário.

Comando:

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

Arquivo:

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

Mas, como você pode ver, o problema é que preciso criar um arquivo de texto para especificar a lista de arquivos WAV a serem concatenados.

Eu posso fazer todas essas tarefas, mas eu preferiria um único comando que parecesse

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

ou

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

Eu tentei esses dois comandos simples, mas eles retornam apenas a voz de 1.wav Por favor me ajude a escrever um único comando (ou corrija os 2 comandos acima) que alcancem o resultado desejado.

Por favor, não sugira outros Encoders / Editores de Mídia, eu quero usar apenas o FFMPEG, já que ele já está instalado e usado em outros lugares.

    
por Manu 24.04.2013 / 10:09

6 respostas

25

Você pode tentar usar a concat filtro ; requer recodificação e, portanto, terá mais recursos do sistema (uma quantidade muito pequena em qualquer computador vagamente moderno, neste caso específico), mas PCM - > O áudio PCM deve ser matematicamente sem perdas. No seu caso, você usaria 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

Se você tiver cinco arquivos de entrada, use n=5 .

    
por 25.04.2013 / 14:19
10

Acho que a melhor opção é usar sox, não ffmpeg:

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

A solução vem de Como eu adiciono um monte de arquivos .wav mantendo a ordem numérica (não-zero-preenchida)?

    
por 08.01.2017 / 11:56
7

O wiki do FFmpeg menciona O uso do protocolo concat não é possível com todos os tipos de arquivo. Ele funciona bem com a maioria dos contêineres e fluxos de bits MPEG, mas obviamente não são arquivos WAV com áudio PCM.

Você não precisa necessariamente criar um arquivo temporário e usá-lo. Com Bash (ou outros shells que suportam substituição de processos ), você pode fazer tudo em um único comando :

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

A substituição de processo <( ) cria um arquivo - ou, para ser preciso, um descritor de arquivo - em tempo real, que ffmpeg pode ler. Este arquivo conterá o caminho para cada arquivo .wav no diretório atual. Temos que prefixar com $(pwd) para obter o caminho correto relativo ao seu diretório atual, e não em relação ao descritor de arquivo.

É claro que o comando dentro da substituição pode ser alterado para outra coisa.

    
por 24.04.2013 / 18:07
1

No script Cmd.EXE .BAT do 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

Dessa forma, você não se incomoda com os nomes dos arquivos de origem ou com o parâmetro concat-count.

    
por 28.10.2015 / 03:17
0

Outra opção é usar concat

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

    
por 24.03.2018 / 06:20
-1

Você pode usar shntool para arquivos wav.

shnjoin -r none 01.wav 02.wav ...
    
por 24.11.2013 / 23:16