-pattern_type glob
Essa ótima opção facilita a seleção das imagens em muitos casos.
Vídeo de apresentação de slides com uma imagem por segundo
ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
-c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Adicione um pouco de música, corte quando o áudio presumivelmente mais longo quando as imagens terminarem:
ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
-c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Aqui estão duas demos no YouTube:
Seja um hippie e use o formato de vídeo livre de patente Theora :
ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
-c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg
Suas imagens devem, obviamente, ser classificadas em ordem alfabética, geralmente como:
0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg
e assim por diante.
Eu também garantiria primeiro que todas as imagens a serem usadas tenham a mesma proporção, possivelmente cortando-as com imagemagick
ou nomacs de antemão, para que o ffmpeg não precise tomar decisões difíceis. Em particular, a largura deve ser divisível por 2; caso contrário, a conversão falha com: "largura não divisível por 2".
Vídeo em velocidade normal com uma imagem por quadro a 30 FPS
ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
-c:v libx264 -pix_fmt yuv420p out.mp4
Aqui está o que parece:
GIF gerado com: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574
Adicione um pouco de áudio a ele:
ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
-i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4
Resultado: https://www.youtube.com/watch?v=HG7c7lldhM4
Estes são os meios de teste que eu usei:
wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
Imagens geradas com: Como usar o GLUT / OpenGL para renderizar em um arquivo?
É legal observar o quanto o vídeo compacta a sequência de imagens muito melhor do que o ZIP, pois é capaz de comprimir quadros através de algoritmos especializados:
opengl-rotating-triangle.mp4
: 340K
opengl-rotating-triangle.zip
: 7.3M
Converta um arquivo de música em um vídeo com uma imagem fixa para upload do YouTube
Respondida em: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572
Configuração de estudo de caso de apresentação de slides totalmente realista passo a passo
Há um pouco mais para criar apresentações de slides do que executar um único comando ffmpeg, então aqui vai um exemplo detalhado mais interessante, inspirado nessa linha do tempo .
Obtenha a mídia de entrada:
mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..
# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png
Agora, examinamos rapidamente todos os tamanhos de imagem para decidir sobre a proporção final:
identify png/*
quais saídas:
png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000
portanto, a proporção clássica de 480p (640x480 == 4/3) parece apropriada.
Faça uma conversão com redimensionamento mínimo para uniformizar as larguras (o TODO é automatizado para qualquer largura, aqui eu apenas observei manualmente a identify
saída e reduzi a largura e a altura em um):
mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4
Isso produz resultados terríveis, porque, como visto em:
ffprobe raw.mp4
O ffmpeg apenas pega o tamanho da primeira imagem, 556x494, e depois converte todas as outras para esse tamanho exato, quebrando a proporção.
Agora vamos converter as imagens para a proporção 480p de destino automaticamente cortando conforme o ImageMagick: como cortar minimamente uma imagem em uma determinada proporção?
mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4
Então, agora, a proporção é boa, mas inevitavelmente é preciso fazer alguns cortes, o que meio que corta partes interessantes das imagens.
A outra opção é preencher com fundo preto para ter a mesma proporção mostrada em: Redimensionar para caber em uma caixa e definir fundo para preto na parte "vazia"
mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4
De um modo geral, idealmente, você poderá selecionar imagens com proporções iguais ou semelhantes para evitar esses problemas em primeiro lugar.
Sobre as opções da CLI
Observe no entanto que, apesar do nome, -glob
isso não é tão geral quanto os padrões do shell Glob, por exemplo: -i '*'
falha: https://trac.ffmpeg.org/ticket/3620 (aparentemente porque o tipo de arquivo é deduzido da extensão).
-r 30
faz o -framerate 1
vídeo 30 FPS para superar bugs em players como o VLC para baixas taxas de quadros: o VLC congela para um vídeo baixo de 1 FPS criado a partir de imagens com ffmpeg Portanto, repete cada quadro 30 vezes para manter o efeito de 1 imagem por segundo desejado.
Próximos passos
Você também vai querer:
TODO: aprenda a cortar e concatenar vários arquivos de áudio no vídeo sem arquivos intermediários, tenho certeza de que é possível:
Testado em
ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.
Bibliografia