Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Is it possible to use ffmpeg create a video from a set of sequences, where the number does not start from zero?

For example, I have some images [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg], and I want to convert them to a video. I tried the following command, but it didn't work (it seems the number should start from zero):

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

Any advise?

share|improve this question

migrated from stackoverflow.com Jul 26 '13 at 13:48

This question came from our site for professional and enthusiast programmers.

    
It's been a while since you asked this, but if you're still interested in the question, the answer is YES -- I've posted the details and an example below: stackoverflow.com/a/12160155/181638 –  Assad Ebrahim Aug 28 '12 at 13:20
    
@casperOne would be useful to have an idea why this is off topic. It seems like a specific programming problem. The FFmpeg tag has 3.7k followers, and with 27k views clearly people find it useful.. –  geotheory May 20 '13 at 10:36
2  
@geotheory The tag stats are irrelevant. ffmpeg is a program much in the way of say, WinRar. While you can program against the libraries in ffmpeg, this question is not about that. Using ffmpeg from the command line is to be asked on Super User, where it's on topic. –  casperOne May 20 '13 at 11:45
add comment

8 Answers 8

There is no need to rename files if using the -start_number switch like so:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

where n is the start of the sequence of stills.

Note, this will work as long as the sequence is unbroken once it starts. If there are gaps and you want all of the stills included, then renumbering may be necessary to fill the gaps.

There are some other switches you might find useful.

I use the following one liner to get a slower frame rate and to compress the images and have a smaller resulting video:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 
        -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

The -r 3 option sets the framerate of the resulting video to 3 frames per second so that I can see each still for a short period of time. The -s option rescales the pictures to the desired resolution to manage the size of the resulting video.

(In the Windows shell, replace -i Imgp%04d.jpg with -i "Imgp%%04d.jpg". Credit for this to Mike Fitzpatrick http://superuser.com/a/344178/153054)

share|improve this answer
1  
what's the difference between -r and -framerate? –  nuno_cruz Oct 24 '12 at 20:21
    
they're the same IIRC –  rogerdpack Feb 18 '13 at 16:34
4  
No need for numbering nonsense, as long as you're happy to accept the order they appear in (say) 'ls'... just use: ffmpeg -pattern_type glob -i '*.jpg' movie.mp4 –  Orwellophile Nov 3 '13 at 5:32
add comment

As far as I know, you cannot start the sequence in random numbers (I don't remember if you should start it at 0 or 1), plus, it cannot have gaps, if it does, ffmpeg will assume the sequence is over and stop adding more images.

Also, as stated in the comments to my answer, remember you need to specify the width of your index. Like:

image%03d.jpg

And if you use a %03d index type, you need to pad your filenames with 0, like :

image001.jpg image002.jpg image003.jpg

etc.

share|improve this answer
1  
If the image file names have leading zeros then the format string must also specify the width like "%03d". –  Hudson May 13 '10 at 18:17
1  
If that's the only obstacle, you could just write a script to either rename or symlink your images to a properly reindexed set. –  Jefromi May 13 '10 at 18:18
1  
Yes, I've worked with this before, I wrote a wrapper in Ruby a while ago where you called instance.addImage(), then instance.processVideo() and it would create a temporal directory, copy/rename the images with proper indices and create the video. It is quite easy. –  Francisco Soto May 13 '10 at 18:25
    
@Jefromi I have created a symlink but how do I give the path of the symlink file to ffmpeg? It just assumes the symlink file is the image I am trying to convert? I'm on win7 btw –  Jared Glass Apr 12 '12 at 16:13
    
The sequence can start anywhere from 0 to 4 inclusive. –  Assad Ebrahim Aug 28 '12 at 12:11
add comment

you can use this below code snippet:

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4
share|improve this answer
add comment

You can find an example script in the ffmpeg documentation:

3.2 How do I encode single pictures into movies?

If you have large number of pictures to rename, you can use the following command to ease the burden. The command, using the bourne shell syntax, symbolically links all files in the current directory that match *jpg to the /tmp' directory in the sequence ofimg001.jpg', `img002.jpg' and so on.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Then run:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
share|improve this answer
1  
You'd be better making x=0 to start so the image name's start img000.jpg as this is what ffmpeg expects. Also symlinking didn't work for me as ffmpeg couldn't find the files so I had to use cp instead (obvious speed and space draw backs but I rm them after anyway). mv would also work if you don't mind losing the originals. –  RyanfaeScotland Mar 28 '13 at 14:21
add comment

I agree with Francisco, but as a workaround you could just write a quick script to move or create symbolic links to the files with the sequence numbers that ffmpeg needs. The script could then call ffmpeg and then remove the links or move the files back to their original locations.

share|improve this answer
add comment

look up

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done
share|improve this answer
add comment

From ffmpeg's docs:

Using a glob pattern

ffmpeg also supports bash-style globbing (* represents any number of any characters).

This is useful if your images are sequential but not necessarily in a numerically sequential order as in the previous examples.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

So, as long as your files are sorted, using the -pattern_type glob switch should work for you.

share|improve this answer
add comment

I used the flv encoder since my video was going in a flash player (Jwplayer)

ffmpeg -i %d.jpg -vcodec flv test.flv

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.