wiki:

ChangingFrameRate


Version 1 (modified by slhck, 2 months ago) (diff)

create fps guide

Changing the frame rate

ffmpeg can be used to change the frame rate of an existing video, such that the output frame rate is lower or higher than the input frame rate. The output duration of the video will stay the same.

This is useful when working with, for example, high-framerate input video that needs to be temporally scaled down for devices that do not support high FPS.

When the frame rate is changed, ffmpeg will drop or duplicate frames as necessary to achieve the targeted output frame rate. A detailed explanation of how ffmpeg decides to drop/duplicate frames is given in this post.

Note: Changing frame rates requires the video to be re-encoded. Without setting appropriate output quality or bit rate, the video quality may be degraded. Please look at the respective encoding guides for the codec you've chosen.

If you are interested in keeping the number of frames, but squeezing / stretching the video, see: How to speed up / slow down a video

How to change the frame rate

There are two ways to change the output frame rate:

  1. With the -r option used as an output option
  2. With the fps filter

There are minor differences in implementation of those two; particularly, -r as an output option applies to all streams, whereas fps can be set for each stream individually within complex filter chains. In the following we will focus on using the fps filter, as it is more configurable.

Example

To change the output frame rate to 30 fps, use the following command:

ffmpeg -i <input> -filter:v fps=fps=30 <output>

If the input video was 60 fps, ffmpeg would drop every other frame to get 30 fps output.

Verifying frame rate changes

In order to verify which frames are duplicated or dropped by a frame rate change, you can first generate a sample video:

ffmpeg -f lavfi -i testsrc=duration=10:size=854x480:rate=60 \
-vf "drawtext=text=%{n}:fontsize=72:r=60:x=(w-tw)/2: y=h-(2*lh):fontcolor=white:box=1:boxcolor=0x00000099" test.mp4

This 10 second, 60 fps video called test.mp4 will show the frame count at the bottom, and a second counter in the middle of the frame. By playing the output in a player that allows seeking frame-by-frame, you can inspect which frames have been dropped or duplicated.