Como criar um vídeo a partir de imagens com o FFmpeg?


163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Essa linha funcionou bem, mas quero criar um arquivo de vídeo a partir de imagens em outra pasta. Os nomes das imagens na minha pasta são:

img001.jpg
img002.jpg
img003.jpg
...

Como inserir arquivos de imagens de uma pasta diferente? Exemplo:C:\mypics

Eu tentei este comando, mas ffmpeggerei um vídeo apenas com a primeira imagem (img001.jpg).

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Respostas:


167

Veja o show de slides em vídeo a partir de imagens - FFmpeg

Se o seu vídeo não mostrar os quadros corretamente Se você encontrar problemas, como a primeira imagem é ignorada ou apenas é exibida para um quadro, use o filtro de vídeo fps em vez de -r para a taxa de quadros de saída

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Como alternativa, o filtro de vídeo em formato pode ser adicionado à cadeia de filtros para substituir -pix_fmt yuv420p como "fps = 25, format = yuv420p" . A vantagem desse método é que você pode controlar qual filtro entra primeiro

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Eu testei abaixo dos parâmetros, funcionou para mim

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

os parâmetros abaixo também funcionaram, mas sempre ignoram a primeira imagem

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

fazendo um vídeo a partir de imagens colocadas em pastas diferentes

Primeiro, adicione caminhos de imagem ao imagepaths.txt como abaixo.

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Amostra de uso da seguinte forma;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0 parâmetro evita o nome do arquivo não seguro erro de

Links Relacionados

FFmpeg fazendo um vídeo a partir de imagens colocadas em pastas diferentes

FFMPEG Um guia intermediário / sequência de imagens

Concatenar - FFmpeg


"Se o seu vídeo não mostra os quadros corretamente. Se você encontrar problemas, como a primeira imagem é ignorada ou apenas é exibida para um quadro, use o filtro de vídeo fps" Desculpe, mas você poderia explicar o que você quer dizer com "fps filtro de vídeo "exatamente?
Arnuschky 6/11

3
Tanto quanto sei –r parâmetro é taxa de quadros variável, isso significa que o FFMPEG pode eliminar ou duplicar quadros para atingir a taxa de quadros de saída desejada. O uso do filtro fps “-vf fps = value” força o FFMPEG a produzir taxa de quadros constante. Consulte Criar uma apresentação de slides de vídeo a partir de imagens - FFmpeg , e esta Qual é a diferença (técnica) entre -r e o filtro fps? . Então, usando -r parâmetro às vezes pular couse primeira imagem ..
khan

O primeiro comando nesta lista ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4,, parecia funcionar, mas no final resultou em um vídeo que era ilegível para qualquer jogador (no Ubuntu). VNC disse: "átomo moov não encontrado". Tentando remediar isso com qt-faststarto erro "último átomo no arquivo não era um átomo de moov"
sh37211

147

-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 imagemagickou 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 identifysaí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, -globisso 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 30faz o -framerate 1ví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


Se você estiver usando python e subprocess.call para iniciar o ffmpeg, não use aspas simples 'nos nomes dos arquivos de entrada e saída. Caso contrário, ele não encontrará os arquivos.
RunOrVeith 13/05/19

Isso seria ótimo para mim, mas meu pacote build from npm ffmpeg-staticnão implementa glob. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi

-pix_fmtTrailing options were found on the commandline.erro causado
Anthony Kong

@AnthonyKong que não consegui reproduzir ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4no Ubuntun 19.10 ffmpeg 4.1.4 agora, qual é a sua versão e o comando exato?
Ciro Santilli escreveu: 11/04

20

Versão simples do Documentos

Funciona especialmente bem para imagens do Google Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
Não é possível reproduzir esta saída: [h264 @ 0x7f148cc3cc40] o acelerador de hardware falhou ao decodificar a imagem
Bram

oi como posso executar esse comando estou apenas descobrindo que você pode me ajudar por favor?
Inocente

@Innocent Do seu terminal ou console.
Joshua Pinter

entendi man, mas o projeto% 3d.png não selecionou todas as minhas imagens em uma pasta com o nome Project001.png, Project002.png e assim por diante apenas obtém 2 fotos, o que devo fazer para obter todas as minhas fotos e convertê-las em vídeo
Inocente

Você está usando %3dou %03d?
Joshua Pinter

10

cat *.png | ffmpeg -f image2pipe -i - output.mp4

do wiki

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.