domingo, 24 de maio de 2015

Unindo vídeos com o FFMPEG

Nas versões mais recente do ffmpeg esta é a nova forma de unir os vídeos onde todos deve ter o mesmo tamanho de tela, mas os codecs de vídeo e áudio podem ser diferente entre os arquivos envolvidos.

Para unir dois vídeos

$ ffmpeg -i sei.mp4 -i aviao.mp4 -filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [a] [v] ' -map '[a]' -map '[v]' -strict -2 unidos.mp4 

Para unir três vídeos

$ ffmpeg -i sei.mp4 -i aviao.mp4 -i cenas.mp4 -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [a] [v] ' -map '[a]' -map '[v]' -strict -2 unidos3.mp4 


Parte da saída final do processo de conversão:
 Metadata: 
    major_brand     : isom 
    minor_version   : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder         : Lavf55.19.104 
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 480x360, q=-1--1, 30k tbn, 29.97 tbc (default) 
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default) 
Stream mapping: 
  Stream #0:0 (h264) -> concat:in0:v0 
  Stream #0:1 (aac) -> concat:in0:a0 
  Stream #1:0 (h264) -> concat:in1:v0 
  Stream #1:1 (aac) -> concat:in1:a0 
  Stream #2:0 (h264) -> concat:in2:v0 
  Stream #2:1 (aac) -> concat:in2:a0 
  concat:out:v0 -> Stream #0:0 (libx264) 
  concat:out:a0 -> Stream #0:1 (aac)

Os arquivos são unidos na ordem especificada e as três linhas em vermelho representa cada um dos vídeos especificados na parte do codec de vídeo e abaixo da mesma o codec de áudio do vídeo correspondente e as duas últimas linhas concat são o codec de vídeo e áudio do arquivo de saída que contém os 3 vídeos unidos. 

Onde na linha final de comando a opção  -strict -2 é para a parte do codec de áudio aac do formato mp4 pois em algumas versões do ffmpeg o mesmo é experimental, e sem esta opção não funciona para criar no formato mp4 padrão com áudio aac.

Caso deseja ver um log do ffmpeg sob a conversão coloque a opção -report antes do nome do arquivo de saída, onde será criado um arquivo de log no mesmo diretório da execução do comando ffmpeg.

Precedimento realizado com  ffmpeg version 2.1.5

Criando um script para facilitar o uso

Para unir dois arquivos coloque a seguinte linha abaixo sendo o nome do script juntar2 com permissão 755 salvo em /usr/local/bin.

ffmpeg -i $1 -i $2 -filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [a] [v] ' -map '[a]' -map '[v]' -strict -2 unidos.mp4 

Forma de uso:
$ juntar2 video1 video2

Nota:
Para unir três arquivos você deve criar outro script utilizando a linha de comando do ffmpeg para 3 arquivos neste caso.



3 comentários:

  1. Obrigado amigo, sua dica funcionou comigo e me ajudou bastante. Abraço!

    ResponderExcluir
  2. Aqui deu Input link in1:v0 parameters (size 352x640, SAR 0:1) do not match the corresponding output link in0:v0 parameters (640x352, SAR 0:1) mas os dois videos tem a mesma resolucao, 640x352. Alguma sugestao?

    ResponderExcluir