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

32

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 eu tenho que criar um arquivo de texto para especificar a lista de arquivos WAV a concatenar.

Eu posso executar todas essas tarefas, mas eu preferiria um único comando, algo que se pareça com

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, ajude-me a escrever um único comando (ou corrija os 2 comandos acima) que alcançam o resultado desejado.

Por favor, não sugira outros codificadores / editores de mídia. Quero usar apenas o FFMPEG, pois ele já está instalado e usado em outros locais.

Manu
fonte

Respostas:

34

Você pode tentar usar o filtro concat ; requer recodificação e, portanto, requer mais recursos do sistema (uma quantidade bastante pequena em qualquer computador vagamente moderno nesse caso específico), mas o áudio PCM -> 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.

evilsoup
fonte
4
Nota: Não personalize [0:0][1:0][2:0][3:0]para corresponder ao número de arquivos. Use isso exatamente como diz. A única coisa que você deve alterar são os arquivos de entrada e n=4.
Keavon
8
@ Keavon: você tem certeza? Aqui, o ffmpeg (versão N-49352-gc46943e x64) reclama Too many inputs specified for the "concat" filter.quando tento processar apenas 2 entradas com o código original. Ele funciona embora quando eu remover [2:0][3:0]... o que faz sentido para mim desde que, neste caso, não existem tais coisas como córregos 2:0e 3:0...
bigue Nique
Eu concordo com @BigueNique. Eu também corri para o mesmo erro e, embora pareça um pouco bobo, escrevi algum código para gerar a sequência correta fornecida n.
Ryan DuVal
19

Eu 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 anexar um monte de arquivos .wav enquanto retendo pedidos numéricos (sem preenchimento de zero)?

Héctor M. Monacci
fonte
1
Isso pode funcionar .wav, mas soxnão parece dar suporte .mp3.
21418 Aaron Franke
1
A pergunta era precisamente sobre.wav
Héctor M. Monacci
1
Eu sei, só estou adicionando uma observação para quem tenta usar esse método com arquivos não-wav.
Aaron Franke
a pergunta afirmou explicitamente que é necessária uma solução usando apenas ffmpeg!
Manu
sox pode suportar arquivos .mp3 também
Benjamin
9

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

Você não precisa necessariamente criar um arquivo temporário e usá-lo. Com o Bash (ou outros shells que oferecem suporte à 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 do processo <( )cria um arquivo - ou, para ser mais preciso, um descritor de arquivo - em tempo real, que ffmpegpode ser lido. Este arquivo conterá o caminho para todos os .wavarquivos no diretório atual. Temos que prefixá-lo $(pwd)para obter o caminho correto em relação ao seu diretório atual, e não em relação ao descritor de arquivo.

Obviamente, o comando dentro da substituição pode ser alterado para outra coisa.

slhck
fonte
2
Se você receber um Unsafe file nameerro, precisará da -safe 0opção antes -i. ref. stackoverflow.com/q/38996925/297679
Nobu
3

Outra opção é usar concat

ffmpeg -i "concat: arquivo1.mp3 | arquivo2.mp3 | arquivo3.mp3" -acodec copiar out.mp3

Ivan Malyshev
fonte
1
Bem-vindo ao superusuário: Embora isso possa ou não responder à pergunta (uma resposta foi aceita), seria uma resposta melhor se você pudesse fornecer uma explicação sobre por que sua solução funciona com detalhes e instruções fáceis de seguir. Se você acha que sua resposta está correta, faça essas coisas e edite-a novamente. Por favor, dedique alguns minutos e leia: - superuser.com/help .Resposta: superuser.com/help/how-to-answer , novamente bem-vindo ao superuser.Thankyou
mic84
Eu testei isso e ele não parece funcionar
Nick Long
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 preocupa com os nomes dos arquivos de origem ou com o parâmetro concat-count.

Bilbo
fonte
-1

Você pode usar shntoolpara arquivos wav.

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