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.pngExtrair sĂł um frame de um vĂdeo:
ffmpeg -ss 01:23:45 -i input -frames:v 1 -q:v 2 output.jpgOutra opção, aparentemente menos råpida, segundo a internet:
ffmpeg -i input.mov -ss 00:00:14.435 -vframes 1 out.pngE 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.mp4O 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.mp4Controlando 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.mp4O 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.mp4ReferĂȘ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.m4aComando 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; doneO 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