how can i convert a video to images using ffmpeg? Example am having a video with total duration 60 seconds. I want images between different set of duration like between 2-6 seconds, then between 15-24 seconds and so on. Is that possible using ffmpeg?
Best Answer
Official ffmpeg documentation on this: Create a thumbnail image every X seconds of the video
Output one image every second:
ffmpeg -i input.mp4 -vf fps=1 out%d.png
Output one image every minute:
ffmpeg -i test.mp4 -vf fps=1/60 thumb%04d.png
Output one image every 10 minutes:
ffmpeg -i test.mp4 -vf fps=1/600 thumb%04d.png
You can use the select filter for a set of custom ranges:
ffmpeg -i in.mp4 -vf select='between(t,2,6)+between(t,15,24)' -vsync 0 out%d.png
Another way is to use ffmpeg library for python, particularly useful if you don't want to add ffmpeg to your pc environment. Start by installing ffmpeg on conda with:conda install ffmpeg
Then you can write a script as bellow:
import ffmpeginput_file_name = 'input_video.mp4'(ffmpeg.input(input_file_name ).filter('fps', fps=10, round = 'up').output("%s-%%04d.jpg"%(input_file_name[:-4]), **{'qscale:v': 3}).run())
In addition to the select filter in Gyan's answer (which I use with eq
rather than between
), I came across another filter in the manual: thumbnail
Select the most representative frame in a given sequence ofconsecutive frames.
The filter accepts the following options:
- n: Set the frames batch size to analyze; in a set of n frames, the filter will pick one of them, and then handle the next batch of nframes until the end. Default is 100.
Since the filter keeps track of the whole frames sequence, a bigger nvalue will result in a higher memory usage, so a high value is notrecommended.
Examples
Extract one picture each 50 frames:
thumbnail=50
Complete example of a thumbnail creation with ffmpeg:
ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png