ffmpeg avançado: Usando filtros

Além de copiar streams de vídeo, áudio e legendas, mudar características desses streams (bitrate, framerate, tamanho), podemos fazer algumas estripulias com o ffmpeg usando um ou mais arquivos de vídeos e imagens. Isso graças aos filtros. Existem filtros de vídeo e de áudio . A forma de usá-los é montando um diagrama de associações desses filtros (um “grafo”). Por exemplo: Suponha que eu queira colocar um segundo vídeo do lado superior direito do vídeo original, mas com tamanho menor (coisa conhecida por ai como “Picture in Picture”, ou PIP)…

A maneira mais simples de fazer é mudar a escala do segundo vídeo usando o filtro scale e adicionar este vídeo como um “overlay” ao primeiro, especificando a posição onde ele aparecerá. O grafo é este:

ffmpeg-filter

Onde master.mpg é o vídeo principal (o grandão) e pip.mpg é o vídeo que ficará pequeno, sobre o master. O filtro overlay aceita duas entradas: Uma “mestre” e a do “overlayed” e fornece uma saída que, no nosso caso, será o arquivo output.mpg. A maneira de especificar isso no ffmpeg é:

$ ffmpeg -i master.mpg -i pip.mpg \
         -filter_complex "[1] scale=320:240 [pip]; [0][pip] overlay=10:10" \
         output.mpg

Repare: Cada “caixinha” tem um conjunto de especificações de entrada ([1], no caso de scale, e [0][pip], no caso de overlay). A saída do filtro scale, neste caso, também foi nomeada para [pip] (poderia ser qualquer nome) e usada como entrada no filtro overlay.

Já que existem dois vídeos de entrada, temos que usar a opção -filter_complex. Note que o primeiro filtro (scale) muda o tamanho do vídeo cuja fonte é 1 (o segundo vídeo), enquanto o filtro overlay usa a fonte 0 (o primeiro vídeo) e a saída de scale. O filtro scale aceita dois parâmetros, relativos ao tamanho para o qual a fonte será escalonada… Se quiséssemos mudar a escala do vídeo pip.mpg em termos do seu tamanho original, poderíamos usar os argumentos iw e ih para “input width” e “input height”, e realizar alguma operação aritmética como em “[1] scale=0.8*iw:0.8*ih [pip]”, ao invés de usar valores absolutos…

Aliás, a opção -filter_complex pode ser abolida, e usarmos apenas a versão -vf, desde que o segundo filme seja informado na forma de um filtro:

$ ffmpeg -i master.mpg \
         -vf "movie='pip.mpg', scale=320:240 [pip]; [in][pip] overlay=10:10" \
         out.mpg

Prefiro a primeira sintaxe… Nesta, a especificação [in] refere-se ao vídeo de entrada (único!) e o filtro “movie” informa o segundo “vídeo”, que pode ser, inclusive, um arquivo gráfico… Por exemplo, um PNG com fundo transparente! Mas, isso também pode ser feito usando “filtros complexos”… Note também que os filtros moviescale fazem parte da mesma “cadeia” de filtros (scale está ligado ao filtro movie), por isso só precisamos especificar a saída [pip], nessa cadeia e usá-la como entrada para a próxima.

Da mesma maneira que o filtro scale, overlay também aceita dois parâmetros contendo a posição onde a segunda entrada será colocada “sobre” a entrada “master”. No caso, estamos colocando na posição x=10, y=10 (repare bem: argumentos são separados por ‘:’!), mas poderíamos colocar no canto inferior direito facilmente, usando: “[0][pip] overlay=main_w-overlay_w-10:main_h-overlay_h-10”. Aqui, “main_w”, “main_h”, “overlay_w” e “overlay_h” têm significado óbvio.

Para obter uma lista dos filtros disponíveis, use:

$ ffmpeg -filters | less

Você vai ver uma listagem de filtros para vídeo e áudio, misturados… Existem, ainda, “bitstream filters” que são um pouco diferentes (e permitem lidar com filtragens com legendas e fazer certos tweaks com os codecs de vídeo).

E, por falar em “misturados”, note que se ambos os vídeos têm áudio, pode ser interessante criar filtros para eles ou usar as opções -map, para selecionar apenas o áudio de um dos vídeos especificados…

Uma referência mais completa sobre filtros pode ser lida aqui.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s