Come creare un video dalle immagini con FFmpeg?


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

Questa linea ha funzionato bene, ma voglio creare un file video dalle immagini in un'altra cartella. I nomi delle immagini nella mia cartella sono:

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

Come posso inserire file di immagini da una cartella diversa? Esempio:C:\mypics

Ho provato questo comando ma ho ffmpeggenerato un video solo con la prima immagine (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

Risposte:


170

Guarda la sezione Creare una presentazione video dalle immagini - FFmpeg

Se il tuo video non mostra correttamente i frame Se riscontri problemi, come la prima immagine viene saltata o viene mostrata solo per un frame, usa il filtro video fps invece di -r per il framerate di output

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

In alternativa, è possibile aggiungere il filtro video di formato alla catena di filtri per sostituire -pix_fmt yuv420p come "fps = 25, format = yuv420p" . Il vantaggio di questo metodo è che puoi controllare quale filtro passa per primo

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

Ho provato sotto i parametri, ha funzionato per me

"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

anche i parametri seguenti hanno funzionato, ma salta sempre la prima immagine

"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

realizzare un video da immagini collocate in cartelle diverse

Innanzitutto, aggiungi i percorsi delle immagini a imagepaths.txt come di seguito.

# 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'

Esempio di utilizzo come segue;

"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"

Il parametro -safe 0 impedisce l' errore del nome del file non sicuro

Link correlati

FFmpeg realizza un video da immagini collocate in cartelle diverse

FFMPEG Una guida intermedia / sequenza di immagini

Concatenato - FFmpeg


"Se il tuo video non mostra correttamente i fotogrammi Se riscontri problemi, come la prima immagine viene saltata o viene mostrata solo per un fotogramma, usa invece il filtro video fps" Scusa ma potresti spiegare cosa intendi con "fps filtro video "esattamente?
arnuschky,

3
Per quanto ne so, il parametro -r è frame rate variabile, ciò significa che FFMPEG potrebbe far cadere o duplicare i frame per ottenere il frame rate di output desiderato. Usando il filtro fps “-vf fps = value” forza FFMPEG a produrre frame rate costante. Vedi Creare una presentazione video dalle immagini - FFmpeg , e questo Qual è la differenza (tecnica) tra -r e il filtro fps? . Quindi, usando il parametro -r a volte si può saltare la prima immagine ..
khan,

Il primo comando in questo elenco ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4sembrava funzionare, ma alla fine ha prodotto un video illeggibile da qualsiasi lettore (su Ubuntu). VNC ha detto: "Moov Atom non trovato". Il tentativo di rimediare a questo ha qt-faststartprodotto l'errore "ultimo atomo nel file non era un atomo di moov"
sh37211

150

-pattern_type glob

Questa fantastica opzione semplifica la selezione delle immagini in molti casi.

Presentazione video con un'immagine al secondo

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Aggiungi un po 'di musica, interrompi quando l'audio presumibilmente più lungo quando le immagini finiscono:

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

Ecco due demo su YouTube:

Diventa un hippie e usa il formato video illimitato di brevetti 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

Le immagini dovrebbero ovviamente essere ordinate in ordine alfabetico, in genere come:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

e così via.

Vorrei anche prima assicurarmi che tutte le immagini da utilizzare abbiano le stesse proporzioni, possibilmente tagliandole in anticipo imagemagicko con nomac , in modo che ffmpeg non debba prendere decisioni difficili. In particolare, la larghezza deve essere divisibile per 2, altrimenti la conversione non riesce con: "larghezza non divisibile per 2".

Video a velocità normale con un'immagine per frame a 30 FPS

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

Ecco come appare:

GIF generata con: /ubuntu/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Aggiungi un po 'di audio ad esso:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Risultato: https://www.youtube.com/watch?v=HG7c7lldhM4

Questi sono i supporti di prova che ho usato: a

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

Immagini generate con: Come utilizzare GLUT / OpenGL per eseguire il rendering in un file?

È bello osservare quanto il video comprime la sequenza di immagini in modo migliore rispetto a ZIP in quanto è in grado di comprimere attraverso i frame con algoritmi specializzati:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

Converti un file musicale in un video con un'immagine fissa per il caricamento su YouTube

Risposta a: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Impostazione dettagliata del case study della presentazione passo-passo

C'è di più nella creazione di presentazioni rispetto all'esecuzione di un singolo comando ffmpeg, quindi ecco un esempio dettagliato più interessante ispirato a questa sequenza temporale .

Ottieni il supporto di input:

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

Ora diamo una rapida occhiata a tutte le dimensioni dell'immagine per decidere le proporzioni finali:

identify png/*

che produce:

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

quindi il classico formato 480p (640x480 == 4/3) sembra appropriato.

Effettua una conversione con ridimensionamento minimo per uniformare le larghezze (TODO automatizza per qualsiasi larghezza, qui ho appena guardato manualmente l' identifyoutput e ridotto larghezza e altezza di uno):

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

Questo produce un output terribile, perché visto da:

ffprobe raw.mp4

ffmpeg prende solo le dimensioni della prima immagine, 556x494, quindi converte tutte le altre in quelle dimensioni esatte, interrompendo le proporzioni.

Ora convertiamo le immagini nel formato di destinazione 480p automaticamente ritagliandole secondo ImageMagick: come ritagliare minimamente un'immagine in un determinato formato?

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

Quindi ora le proporzioni sono buone, ma inevitabilmente è stato necessario un ritaglio, che ha tagliato parti interessanti delle immagini.

L'altra opzione è di riempire con sfondo nero per avere le stesse proporzioni mostrate in: Ridimensiona per adattarsi a una scatola e impostare lo sfondo su nero sulla parte "vuota"

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

In generale, tuttavia, sarai in grado di selezionare idealmente immagini con proporzioni uguali o simili per evitare quei problemi in primo luogo.

Informazioni sulle opzioni della CLI

Si noti tuttavia che, nonostante il nome, -globquesto non è così generale come gli schemi della shell Glob, ad esempio: -i '*'fail: https://trac.ffmpeg.org/ticket/3620 (apparentemente perché il tipo di file viene dedotto dall'estensione).

-r 30rende il -framerate 1video 30 FPS per superare i bug nei lettori come VLC per framerate bassi: VLC si blocca per un video FPS basso 1 creato da immagini con ffmpeg Quindi ripete ogni fotogramma 30 volte per mantenere l'effetto desiderato di 1 immagine al secondo.

Prossimi passi

Dovrai anche:

TODO: impara a tagliare e concatenare più file audio nel video senza file intermedi, sono abbastanza sicuro che sia possibile:

Testato su

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografia


Se stai usando python e subprocess.call per avviare ffmpeg, non dovresti usare le virgolette singole 'nei nomi dei file di input e output. Altrimenti non troverà i file.
RunOrVeith

Questo sarebbe fantastico per me, ma la mia build dal pacchetto npm ffmpeg-staticnon 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.errore causato
Anthony Kong,

@AnthonyKong Non sono riuscito a riprodurre ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4su Ubuntun 19.10 ffmpeg 4.1.4 proprio ora, qual è la tua versione e il comando esatto?
Ciro Santilli 11 冠状 病 六四 事件 法轮功

21

Versione semplice da Documenti

Funziona particolarmente bene con le immagini di Google Earth Studio :

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

1
Impossibile riprodurre questo output: [h264 @ 0x7f148cc3cc40] l'acceleratore hardware non è riuscito a decodificare l'immagine
Bram

ciao come posso eseguire quel comando sto solo trovando che mi può aiutare per favore?
Innocente il

@Innocente dal tuo terminale o console.
Joshua Pinter

capito, ma il progetto% 3d.png non ha raccolto tutte le mie immagini in una cartella con nome Project001.png, Project002.png e così via solo 2 immagini che cosa devo fare per ottenere tutte le mie immagini e convertirle in video
Innocente il

Stai usando %3do %03d?
Joshua Pinter

10

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

dal wiki

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.