ffmpeg une dois arquivos mp4 com o ffmpeg na linha de comando

13

Eu posso juntar vários arquivos usando o seguinte comando:

ffmpeg -f concat -i input.txt -codec copy output.mp4

O único problema com este comando é que você precisa ler os caminhos de arquivo a partir do arquivo de texto chamado input.txt com o seguinte conteúdo:

file 'C:\Users\fabio\Downloads\Super\Sharks.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks.mp4'

Existe uma maneira de atingir o mesmo objetivo sem ter que ler os caminhos de arquivo de um arquivo? Eu tentei o seguinte sem sorte:

ffmpeg -f concat -i file "C:\a\b.mp4" file "C:\a\b.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b.mp4" "C:\a\b.mp4" -codec copy output.mp4

Eu tenho que usar um comando diferente?

    
por Fabio Delarias 30.03.2016 / 18:05

3 respostas

21

Você deve ser capaz de usar o método protocolo de concat para combinar os arquivos:

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

Além disso, o manual do FFmpeg discute um método especificamente para arquivos MP4, a fim de concatená-los sem perdas, mas requer que você crie arquivos temporários (ou pipes nomeados):

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
    
por 30.03.2016 / 18:36
1

Não, parece não haver nenhuma maneira de usar o demuxer de concat do ffmpeg em uma única linha de comando sem algum hack. Você precisa criar o arquivo de texto de entrada com a lista de arquivos. Eu mesmo achei isso estranho, talvez alguém adicione isso também FFMpeg em uma data posterior.

A resposta aceita para esta pergunta usa o protocolo concat, não o demuxer concat, que é o que o OP pediu.

    
por 16.09.2016 / 02:47
-1

Você ainda pode fazer isso em um script sem alterar o comando. Algo como:

echo "file fname1" >$$.tmp    #single redirect creates or truncates file
echo "file fname2" >>$$.tmp   # double redirect appends
echo "file fname3" >>$$.tmp   # do as many as you want.

ffmpeg -f concat -i $$.tmp -codec copy output.mp4

rm $$.tmp  # just to clean up the temp file. 
           # For debugging, I usually leave this out.

O $$ se expande para o pid do shell executando o comando, então o nome do arquivo será diferente toda vez que você o executar. então você pode usar $$. txt se preferir. Ou algo mais ...

Além disso, você pode usar aqui os arquivos para adicionar um monte de dados ao arquivo:

cat <<EOF >$$.tmp
file fname1
file fname2
file fname3
EOF

bash A substituição de variáveis funciona, então você pode determinar programaticamente o conteúdo do arquivo, ele não precisa ser corrigido. Eu insiro esse tipo de coisa em loops o tempo todo. Por fim, o redirecionamento funciona da mesma forma acima, portanto, > $$. Tmp trunca, em seguida, escreve, > > $$. Tmp acrescenta.

    
por 31.01.2017 / 18:38