Programming

How to create a video from images with FFmpeg closed

27 September 2026 · 12 min read

How to create a video from images with FFmpeg closed

Transforming still images into dynamic videos is a powerful way to tell stories, share memories, or create engaging content for social media and presentations. With the free and versatile command-line tool FFmpeg, creating videos from a sequence of images is surprisingly simple. This guide will provide a step-by-step walkthrough of how to create a video from images with FFmpeg, covering everything from basic commands to advanced customization options. Whether you’re a beginner or an experienced user, you’ll find valuable insights and practical tips to enhance your video creation process.

Understanding FFmpeg and its Capabilities

FFmpeg is a cross-platform, open-source software project that provides a comprehensive set of tools for handling multimedia files. It’s capable of encoding, decoding, transcoding, muxing, demuxing, streaming, filtering, and playing virtually any audio and video format you can think of. Its power lies in its command-line interface, which allows for precise control and automation of complex tasks. This makes it a valuable tool for anyone working with video, from hobbyists to professionals.

While the command-line interface might appear intimidating at first, it becomes remarkably intuitive with a little practice. The basic structure of an FFmpeg command involves specifying an input source, applying filters and settings, and defining an output destination. This flexibility allows you to tailor your video creation process to your specific needs, whether you’re creating a simple slideshow or a complex video montage.

FFmpeg’s extensive documentation and active online community provide ample resources for learning and troubleshooting. You can find detailed explanations of every command and option, along with numerous examples and tutorials.

Preparing Your Images

Before diving into FFmpeg, ensure your images are correctly named and organized. FFmpeg relies on a consistent naming convention to sequence images correctly. A common practice is to use sequential numbering, such as image001.jpg, image002.jpg, and so on. This allows FFmpeg to automatically arrange the images in the correct order within the video.

Consider the image format. While FFmpeg supports numerous formats, using common formats like JPEG or PNG is recommended for optimal compatibility. Also, ensure all images have the same dimensions for a consistent video output. If your images vary in size, you might need to resize or crop them before using FFmpeg. Various image editing tools can help achieve this.

Storing all images in a dedicated folder simplifies the process and helps avoid errors. This organized approach also makes it easier to manage and modify your image sequences for different video projects.

Creating a Basic Slideshow with FFmpeg

The core command for creating a video from images utilizes the ffmpeg -framerate option, which specifies the frame rate of the output video (i.e., how many images are displayed per second). For instance, ffmpeg -framerate 1/5 -i image%03d.jpg output.mp4 creates a video named output.mp4 using images named image001.jpg, image002.jpg, etc., with each image displayed for 5 seconds (1/5 frames per second).

The -i flag designates the input files. The image%03d.jpg pattern tells FFmpeg to look for files named “image” followed by a three-digit number and the “.jpg” extension. Adjust the “03d” if your file numbers have a different number of digits (e.g., %04d for four digits).

Finally, output.mp4 specifies the name and format of the output video file. You can change the output format to other formats supported by FFmpeg like MOV, AVI, etc. by changing the extension.

Adding Audio and Transitions

Adding audio and transitions elevates your video from a simple slideshow to a more engaging experience. Use the -i flag again, followed by the audio file path, to add an audio track. FFmpeg automatically synchronizes the audio with the video. You can adjust the audio volume using the -af 'volume=X' filter, replacing X with the desired volume level (e.g., 0.5 for half volume). Consider using royalty-free music to avoid copyright issues.

While FFmpeg doesn’t directly support complex transitions like fades or cross dissolves, you can achieve similar effects using video editing software after creating the initial video. Export the FFmpeg-generated video and import it into your chosen editing software for further refinement. This two-step process allows you to leverage the efficiency of FFmpeg for the basic video creation and then add more polished transitions using dedicated editing tools.

  • Ensure images are sequentially numbered.
  • Use consistent image dimensions.
  1. Organize images in a dedicated folder.
  2. Use the -framerate option to control the slideshow speed.
  3. Specify the output video format.

Featured Snippet: To create a basic slideshow with FFmpeg, use the command ffmpeg -framerate 1/5 -i image%03d.jpg output.mp4, replacing “image%03d.jpg” with your image sequence pattern and “output.mp4” with your desired output file name. Adjust the framerate value to control the duration of each image display.

Learn more about advanced FFmpeg techniques.For example, a travel blogger could compile photos from a recent trip into a short video showcasing the highlights. This allows for a more dynamic and engaging way to share their experiences compared to a static photo album.

External Resources

[Infographic Placeholder]

Frequently Asked Questions (FAQ)

Q: How do I change the output video resolution?

A: You can use the -s flag followed by the desired resolution, for example, -s 1920x1080 for Full HD.

Q: What if my images have different durations?

A: You can create a separate text file listing each image and its desired duration, then use the -r flag in combination with the text file as input.

Creating videos from images with FFmpeg opens up a world of creative possibilities. By mastering these techniques, you can efficiently produce engaging content for various purposes. Whether it’s sharing personal memories, creating marketing materials, or developing educational resources, FFmpeg provides the tools you need to bring your images to life. Experiment with different settings and explore the extensive documentation to unlock the full potential of FFmpeg. Start crafting your visual narratives today – you’ll be surprised by what you can achieve. Download FFmpeg and begin transforming your image collections into captivating videos.

Question & Answer :

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

This line worked fine but I want to create a video file from images in another folder. Image names in my folder are:

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

How could I input images files from a different folder? Example: C:\mypics

I tried this command but ffmpeg generated a video with the first image (img001.jpg) only.

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

-pattern_type glob

This great option makes it easier to select the images in many cases.

Normal speed video with one image per frame at 30 FPS

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

Here’s what it looks like:

GIF generated with: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Add some audio to it:

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

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

These are the test media I’ve used:

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 

Images generated with: How to use GLUT/OpenGL to render to a file?

It is cool to observe how much the video compresses the image sequence way better than ZIP as it is able to compress across frames with specialized algorithms:

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

Convert one music file to a video with a fixed image for YouTube upload

Answered at: https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Slideshow video with one image per second

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

Add some music to it, cutoff when the presumably longer audio when the images end:

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 

Here are two demos on YouTube:

Be a hippie and use the Theora patent-unencumbered video format in an OGG container:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \ -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogv 

Your images should of course be sorted alphabetically, typically as:

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

and so on.

I would also first ensure that all images to be used have the same aspect ratio, possibly by cropping them with imagemagick or nomacs beforehand, so that ffmpeg will not have to make hard decisions. In particular, the width has to be divisible by 2, otherwise conversion fails with: “width not divisible by 2”.

Full realistic slideshow case study setup step by step

There’s a bit more to creating slideshows than running a single ffmpeg command, so here goes a more interesting detailed example inspired by this timeline.

Get the input media:

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. # https://unix.stackexchange.com/questions/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 

Now we have a quick look at all image sizes to decide on the final aspect ratio:

identify png/* 

which outputs:

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 

so the classic 480p (640x480 == 4/3) aspect ratio seems appropriate.

Do one conversion with minimal resizing to make widths even (TODO automate for any width, here I just manually looked at identify output and reduced width and height by one):

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 

This produces terrible output, because as seen from:

ffprobe raw.mp4 

ffmpeg just takes the size of the first image, 556x494, and then converts all others to that exact size, breaking their aspect ratio.

Now let’s convert the images to the target 480p aspect ratio automatically by cropping as per ImageMagick: how to minimally crop an image to a certain aspect ratio?

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 

So now, the aspect ratio is good, but inevitably some cropping had to be done, which kind of cut up interesting parts of the images.

The other option is to pad with black background to have the same aspect ratio as shown at: Resize to fit in a box and set background to black on “empty” part

mkdir -p black mogrify -path black -thumbnail 640x480 -background black -gravity center -extent 640x480 png/*.png 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 

Generally speaking though, you will ideally be able to select images with the same or similar aspect ratios to avoid those problems in the first place.

About the CLI options

Note however that despite the name, -glob this is not as general as shell Glob patters, e.g.: -i '*' fails: https://trac.ffmpeg.org/ticket/3620 (apparently because filetype is deduced from extension).

-r 30 makes the -framerate 1 video 30 FPS to overcome bugs in players like VLC for low framerates: VLC freezes for low 1 FPS video created from images with ffmpeg Therefore it repeats each frame 30 times to keep the desired 1 image per second effect.

Next steps

You will also want to:

  • cut up the part of the audio that you want before joining it: Cutting the videos based on start and end time using ffmpeg

    ffmpeg -i in.mp3 -ss 03:10 -to 03:30 -c copy out.mp3 
    

    Alternatively, you can also cut it directly in the conversion command by adding the -ss just before the audio -i:

    ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -ss 0:36 -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4 
    

TODO: learn to cut and concatenate multiple audio files into the video without intermediate files, I’m pretty sure it’s possible:

Different duration for each image

https://video.stackexchange.com/questions/23530/use-ffmpeg-to-create-a-video-from-a-few-images gives a solution.

You create a file in.txt like:

file png/1.png outpoint 5 file png/2.png outpoint 2 file png/3.png outpoint 7 

and outpoint sets the duration of the previous image in seconds.

Then we just remove -framerate from the previous conversion commands:

ffmpeg -f concat -i in.txt -framerate 1 -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4 

I also like that that approach with file names in a file is nicer than having to rename the input files to have the correct order, which makes it easier to quickly reorder images on a text editor (multiple -i did not work). Having two lines per input file makes that a bit more annoying, I didn’t manage to combine the file and outpoint into a single line, but still, good to know.

This approach is also convenient if you are just going to convert a subset of your images. Then, to save time on the ImageMagick, you can reuse that in.txt file to loop over only the images you care about:

grep -E '^file ' in.txt | sed -E 's/^file //; s/\..*//' | while read f; do echo $f convert -thumbnail 1280x720 -background black -gravity center -extent 1280x720 "$(command ls -1 ../$f.* | grep -v .xcf | head -n1)" "out/$f.jpg" done 

Tested on

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliography