HowTo - Bilder zu einem Video machen - shellscript

09.12.2021

Aufgabe: you have 90 pictures of various sizes, taken in different formats and shapes. Using all sorts strange file names. Make a movie out of all of them, with the images using the correct aspect ratio. And add music. Use only command line tools on Linux.

Lösung: this is a solution, you can most likely solve this in 50 other ways as well. And by posting it here, I can find it myself if I ever want to do the same stunt again…

#!/bin/sh 
j=0                                                                     

# convert options
 pic="-resize 1920x1280 -background black -gravity center -extent 1920x1080"      
 # loop over the images
     for i in `ls *jpg | sort -R`; do
 echo "Convert $i" convert $pic $i "pic-$j.jpg" j=`expr $j + 1`
     done                                                                          
# now generate the movie
	mp3="file.mp3" echo "make movie"
	ffmpeg -framerate 3 -i pic-%d.jpg -i $mp3 -acodec
	copy -c:v libx264 -r 30 -pix_fmt yuv420p -s 1920x1280 -shortest out.mp4

Erklärung

Dies ist ein Shellscript

The ‘pic’ variable holds command line options for the ImageMagick ‘convert‘ tool. It resizes each picture to 1920×1280 while maintaining aspect ratio and if the pic gets smaller, it is centered and gets a black border.

The loop goes through all files matching *,jpg, randomizes the order with ‘sort’ and then runs ‘convert’ on them one by one and calls the output files pic-[number].jpg where number is increased by one for each image.

Once all images have the correct and same size, ‘ffmpeg‘ is invoked. It is told to produce a movie with 3 photos per second, how to find all the images, to include an mp3 file into the output and to stop encoding when one of the streams ends – this assumes the playing time of the mp3 file is longer than the total time the images are shown so the movie stops when we run out of images to show.