Search code examples
ffmpeg

Create a video from images where the video size is not much larger than the sum of all images


What I am describing is basically a slideshow.

I was hoping to be able to create a video which consistis of, for example, three different frames 1, 2 and 3 but each of them gets shown for an hour.

Let's say we have a file inputs.txt

file 'img1.jpg'
duration 3600
file 'img2.jpg'
duration 3600
file 'img3.jpg'
duration 3600

I would like to concatenate these images like so:

ffmpeg -f concat -i inputs.txt output.mp4 -y

However, this is already giving me the warning of

More than 1000 frames duplicated

I have seen some parameters in the documentation like decimate or mpdecimate but they do not seem to do the trick here.

Is it even possible to do what I am trying here?

It seems like a "no-brainer" to just show a particular image after a certain amount of time but I am not sure how to achieve that.

By the way, I also tried to use MKV here, but this results in a video with just three frames instead of a three hours video:

ffmpeg -f concat -i inputs.txt output.mkv -y

Solution

  • The closest thing I got was using concat like above, and setting a lower framerate. I wasn't aware that the framerate can be less than on.

    With

    file 'image1.jpg'
    duration 3600
    file 'image2.jpg'
    duration 3600
    file 'image3.jpg'
    duration 3600
    file 'image3.jpg'
    duration 0
    

    I simply ran

    ffmpeg -f concat -i inputs.txt -vf "fps=0.1" output.mp4 -y
    

    Each image being around 20 kB, the resulting three hours video took around 80 kB in storage space.