Extrair frames de um vĂ­deo

O comando para dividir um gif em arquivos diferentes, um png para cada frame:

ffmpeg -i arquivo_para_ser_dividido.gif -vsync 0 arquivos_separados_%d.png

Extrair sĂł um frame de um vĂ­deo:

ffmpeg -ss 01:23:45 -i input -frames:v 1 -q:v 2 output.jpg

Outra opção, aparentemente menos råpida, segundo a internet:

ffmpeg -i input.mov -ss 00:00:14.435 -vframes 1 out.png

E se eu quiser fazer o caminho contrĂĄrio? Se eu tiver um conjunto de frames nomeados de acordo com o modelo Frame-0001, Frame-0002, Frame-0003 etc que eu quero juntar em um vĂ­deo, posso usar o comando:

ffmpeg -framerate 30 -i Frame-%04d.png -c:v libx264 -crf 23 -preset slow -pix_fmt yuv420p output.mp4`

Redimensionar vĂ­deos

ffmpeg -i input.mp4 -vf scale=$w:$h <encoding-parameters> output.mp4

O parĂąmetro -vf neste caso se refere a video-filter. A ideia Ă© basicamente aplicar um filtro de redimensionamento ao vĂ­deo. É possĂ­vel ainda usar -1 como um parĂąmetro para especificar sĂł uma das dimensĂ”es:

ffmpeg -i input.mp4 -vf scale=-1:540 <encoding-parameters> output.mp4

Controlando qualidade de vĂ­deos

Caso a qualidade final do arquivo nĂŁo seja satisfatĂłria, pode tentar algo como:

ffmpeg -i input.mp4 -tune film -preset slow -crf 18 output.mp4

O parĂąmetro crf significa Constant Rate Factor e neste caso basicamente significa a qualidade do arquivo. O valor padrĂŁo Ă© 23, e vai de 0 a 51, sendo que quanto mais baixo, melhor a qualidade, porĂ©m maior o tamanho do arquivo. O parĂąmetro -preset slow basicamente diz para o encoder dar mais atenção ao processo. NĂŁo mudarĂĄ a qualidade final do arquivo, sĂł vai indicar para passar mais tempo fazendo o encoding gerando assim um arquivo de qualidade igual, porĂ©m menor tamanho. Valor padrĂŁo Ă© “medium”, mas outras opçÔes sĂŁo faster, fast, medium, slow, slower. Adicionando o parĂąmetro -c:a copy faz com que o ĂĄudio basicamente nĂŁo sofra compressĂŁo, serĂĄ uma cĂłpia do original.

Outras referĂȘncias de enconding podem ser vistas em: Encode/H.264 – FFmpeg

Converter mĂșltiplos arquivos de vĂ­deo

Basicamente um script de bash em uma linha sĂł:

for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done

Áudio

Adicionar outras tracks de ĂĄudio em um arquivo de vĂ­deo:

ffmpeg -i video1.mp4 -i english.mp3 -i italian.mp3 -i spanish.mp3 -c:v copy -map 0:v -map 1:a:0 -map 2:a:0 -map 3:a:0 -y output.mp4

ReferĂȘncia de outras operaçÔes aqui: FFMPEG: How to add audio to video

Quase tudo aqui vai usar o recurso -map que Ă© poderosĂ­ssimo e basicamente ordena faixas de vĂ­deo e ĂĄudio de inputs para o resultado final.

Extrair faixa de ĂĄudio de um vĂ­deo, basicamente mapeando o ĂĄudio do primeiro input para o output:

ffmpeg -i input.mov -map 0:a -c copy output.m4a

Comando para tirar ĂĄudio de vĂĄrios arquivos no Windows:

for %i in (*.mkv) do ffmpeg -i "%i" -vn -acodec copy "%~ni.aac"

Extrair faixa de ĂĄudio de mĂșltiplos vĂ­deos com Bash

for file in *.mp4; do ffmpeg -i "$file" -map 0:a -c copy "${file%.mp4}".m4a; done

O comando mais insano do mundo, aonde junto o audio em portuguĂȘs a um arquivo e coloco metadados da linguagem e tĂ­tulo para cada faixa

ffmpeg -i "input.mkv" -i S01E01.aac -map 0:v -map 0:a -map 1:a -metadata:s:a:0 title="English" -metadata:s:a:0 language=eng -metadata:s:a:1 title="PortuguĂȘs" -metadata:s:a:1 language=por -disposition:a:0 0 -disposition:a:1 default -c:v copy -shortest "output.mkv"

O mesmo comando, mas aplicado a toda uma pasta:

for i in *.mp4; do ffmpeg -i "$i" -map 0:v -map 0:a -metadata:s:a:0 title="English" -metadata:s:a:0 language=eng -metadata:s:a:1 title="PortuguĂȘs" -metadata:s:a:1 language=por -disposition:a:0 0 -disposition:a:1 default -c:v libx264 -preset slower -tune animation -crf 22 "${i%.*}.mkv"; done