Problema de mesclagem de vídeo do FFMPEG

2

Eu quero concatenar 2 ou mais vídeos, usando o FFMPG mas depois de participar de vídeos ele tem um problema de sincronização de áudio / vídeo, eu usei o seguinte código para isso

ffmpeg -i input1.flv -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.flv -qscale:v 1 intermediate2.mpg
ffmpeg -i input3.flv -qscale:v 1 intermediate3.mpg
ffmpeg -i input4.flv -qscale:v 1 intermediate4.mpg
cat intermediate1.mpg intermediate2.mpg intermediate3.mpg intermediate4.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

A faixa de áudio no output.avi está precedendo a trilha de vídeo.

    
por Elby 26.12.2012 / 11:21

1 resposta

3

Usar cat como isso pode causar problemas imprevisíveis. Felizmente, existem duas maneiras realmente úteis de concatenar arquivos com o ffmpeg.

Concat demuxer

Se todas as entradas forem do mesmo tipo de arquivo (mesmos codecs, etc.), você poderá usar o demuxer de concat. Esta é provavelmente a resposta mais útil à sua pergunta, já que é compatível com a cópia -c (e, portanto, deve ser sem perdas, e levar um tempo quase que trivialmente curto para ser concluído).

Primeiro, crie um arquivo chamado inputs.txt contendo o seguinte:

file '/path/to/input1.flv'
file '/path/to/input2.flv'
file '/path/to/input3.flv'
file '/path/to/input4.flv'

Em seguida, use o seguinte comando:

ffmpeg -f concat -i inputs.txt -c copy output.flv

Se isso não funcionar ou se você quiser combinar vídeos de diferentes tipos, use o

Concat filtro

ffmpeg -i input1.flv -i input2.flv -i input3.flv -i input4.flv \
-filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] [3:0] [3:1] concat=n=4:v=1:a=1 [v] [a]' \
-map '[v]' -map '[a]' -c:v libx264 -crf 22 -preset veryfast -c:a libfdk_aac -vbr 3 -afterburner 1 output.mp4

Este exemplo usa minhas configurações de codificação preferidas, obviamente, mude a última linha para usar o que você quiser.

Eu desmembrarei a seção -filter_complex, para facilitar o acompanhamento.

'[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] [3:0] [3:1] 

Esse fragmento informa ao ffmpeg quais fluxos devem ser enviados ao filtro de concat. neste caso, os fluxos 0 e 1 da entrada 0 (ffmpeg começa a contar a partir de 0, de modo que é o primeiro e segundo fluxos do primeiro arquivo de entrada, input1.flv neste exemplo) e os fluxos 0 e 1 de cada entrada até o quarto (entrada 3 de acordo com o ffmpeg, que começa a contar a partir de 0).

concat=n=4:v=1:a=1 [v] [a]'

Este é o próprio filtro de concatenação. n = 4 está dizendo ao filtro que existem quatro arquivos de entrada; v = 1 está dizendo que haverá um fluxo de vídeo; a = 1 está dizendo que haverá um fluxo de áudio (eu sei que disse que o ffmpeg começa a contar a partir de 0, mas aparentemente o escritor deste filtro decidiu fazer isso em vez disso).

[v] e [a] são nomes para os fluxos de saída, para permitir que o restante da linha ffmpeg use a saída do filtro de concat. Eu acho que eles podem ter nomes arbitrários; qual é o vídeo e qual é o áudio é provavelmente determinado por suas posições relativas, mas eu não testei isso.

Observe que as aspas simples "em torno de toda a seção de filtro são obrigatórias.

-map '[v]' -map '[a]'

Isso diz ao ffmpeg para usar os resultados do filtro de concat, em vez dos fluxos diretamente dos arquivos de entrada.

Observe que os filtros são incompatíveis com a cópia de fluxo; você não pode usar -c copiar com este método. Eu também acho que ele não pode lidar com legendas suaves, embora eu não tenha testado isso: não há nenhuma dica sobre isso na documentação, mas a documentação do ffmpeg é frequentemente incompleta ou ofuscada, então esse não é um sinal seguro de qualquer forma.

Isso pode concatenar arquivos codificados em diferentes formatos (testei com um h264 / aac MP4 e um vpx / vorbis WEBM, funcionou perfeitamente), embora eles precisem ter o mesmo tamanho de quadro de vídeo e profundidade de áudio (e possivelmente outros coisas).

Veja também aqui .

    
por 05.01.2013 / 02:31