-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 imagemagick
o 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' identify
output 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, -glob
questo 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 30
rende il -framerate 1
video 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