[FFmpeg-user] Create slideshow with ffmpeg from still images

thljcl jiachielee at live.com
Sun Jul 28 21:55:54 CEST 2013


Create slide show from still images is not exactly as simple as I originally
anticipated. After knowing that ffmpeg is able to convert still images into
video of lossless compression using encoders such as x264, I have a basic
idea of how to create a slide show from a bunch of still images. In a way,
creating slide show is exactly the opposite of creating the illusion of
moving pictures. Human eyes perceive motion when the similar images are
being displayed in sequence rapidly. For a slide show, however, each image
or slide is being displayed for a couple of seconds instead of 1/24 seconds.
Let’s start from the very beginning.
 The basic command to convert a couple of still images to H.264 lossless
video is:
ffmpeg -r "24" -i "f_%%1d.png" -vcodec "libx264" -crf "0" "output.mkv"
The input frames are being set to the frame rate of 24 FPS.
f_%%1d.png represents images with the file name starting with f_1.png,
f_2.png, f_3.png …
In Windows 8, you select a couple of images with whatever file names, when
you rename those files together, they would be renamed to filename (1).png,
filename (2).png…
Each frame would be displayed for 1/24 second.
On ffmpeg wiki at http://bit.ly/14YRtSv, there is a guide for creating a
video slideshow with ffmpeg. If that guide works perfectly for me, I would
not bother to write here.
Say if you want to create a slide show with each slide to be displayed for 5
seconds, one way that would work, though not practical, is to manually
duplicate the same image. You would need 120 copies of the same image for
the same slide to be displayed for 5 seconds at 24 frame per second. 
The problem with the ffmpeg wiki’s guide is that ffmpeg drops frames,
especially at the beginning or ending of the videos. Dropping frames causes
the dropped slide or changed length. What I want to do is to dictate how
ffmpeg duplicate frames automatically as I want.
Here I have 135 images at http://sdrv.ms/11onHnh. Among them, 9 of them have
the resolution of 3456 × 1080 pixels; the rest of them have the resolution
of 1920 × 1080 pixels. To create a slideshow of 1280 × 720 pixels, I need to
resize all of them to have the same resolution.

ffmpeg -r "1" -i "wallpapers\sources\1_%%1d.jpg" -pix_fmt "yuv444p" -vcodec
"libx264" -crf "0" "wallpapers\1.mkv"
ffmpeg -r "1" -i "wallpapers\sources\2_%%1d.jpg" -pix_fmt "yuv444p" -vf
"scale=1920:600,pad=1920:1080:0:240" -vcodec "libx264" -crf "0"
"wallpapers\2.mkv"
ffmpeg -r "1" -i "wallpapers\sources\3_%%1d.jpg" -pix_fmt "yuv444p" -vcodec
"libx264" -crf "0" "wallpapers\3.mkv"

I merge the three videos using mkvtoolnix. I extract frames from the
combined video.

mkdir "wallpapers\frames"
ffmpeg -i "wallpapers\t.mkv" -vf "scale=1280:720" "wallpapers\frames\f
(%%1d).png"

>From individual frames, I wrote a batch file to duplicate frames and create
a slideshow (H.264 lossless). Each slide is to be displayed for 10 seconds.

cd /d "wallpapers\frames"
copy "f (135).png" "f (136).png"
cd /d "%programfiles%\ffmpeg\bin"
ffmpeg -r "1" -i "wallpapers\frames\f (%%1d).png" -vcodec "libx264" -crf "0"
-vf "fps=10" "wallpapers\1.mkv"
cd /d "wallpapers\frames"
del "f (136).png"
cd /d "%programfiles%\ffmpeg\bin"
ffmpeg -r "1" -i "wallpapers\1.mkv" -vf "fps=24" -vcodec "libx264" -crf "0"
"wallpapers\2.mkv"
cd /d "wallpapers"
del "1.mkv"
ren "2.mkv" "slideshow.mkv"
cd /d "%programfiles%\ffmpeg\bin"

In duplicating the frames, ffmpeg will ignore the last frame. That’s why I
duplicate the last frame. Likewise, I can extract all the frames from the
last show. Ffmpeg will duplicate the first frame. Similarly, I delete the
first frame. Below is the lines I wrote to extract the frames from the
slideshow:

ffmpeg -i "wallpapers\slideshow.mkv" -vf "fps=1" -vcodec "libx264" -crf "0"
"wallpapers\1.mkv"
ffmpeg -r "10" -i "wallpapers\1.mkv" -vf "fps=1" -vcodec "libx264" -crf "0"
"wallpapers\2.mkv"
cd /d "wallpapers"
del "1.mkv"
ren "2.mkv" "1.mkv"
cd /d "%programfiles%\ffmpeg\bin"
mkdir "wallpapers\frames_1"
ffmpeg -i "wallpapers\1.mkv" "wallpapers\frames_1\f_%%1d.png"
cd /d "wallpapers\frames_1"
del "f_1.png"
cd /d "%programfiles%\ffmpeg\bin\wallpapers"
del "1.mkv"
cd /d "%programfiles%\ffmpeg\bin"
ffmpeg -r "1" -i "wallpapers\frames_1\f_%%1d.png" -vcodec "libx264" -crf "0"
"wallpapers\1.mkv"
rmdir /s /q "wallpapers\frames_1"
mkdir "wallpapers\frames_1"
ffmpeg -i "wallpapers\1.mkv" "wallpapers\frames_1\f_%%1d.png"
cd /d "wallpapers"
del "1.mkv"
cd /d "%programfiles%\ffmpeg\bin"

The slideshow I created is at http://sdrv.ms/15Xa2TU.




--
View this message in context: http://ffmpeg-users.933282.n4.nabble.com/Create-slideshow-with-ffmpeg-from-still-images-tp4660277.html
Sent from the FFmpeg-users mailing list archive at Nabble.com.


More information about the ffmpeg-user mailing list