FFmpeg 6.1.2
Since* 1.1
#

Select frames to pass in output.

This filter accepts the following options:

expr, e

Set expression, which is evaluated for each input frame.

If the expression is evaluated to zero, the frame is discarded.

If the evaluation result is negative or NaN, the frame is sent to the first output; otherwise it is sent to the output with index ceil(val)-1, assuming that the input index starts from 0.

For example a value of 1.2 corresponds to the output with index ceil(1.2)-1 = 2-1 = 1, that is the second output.

outputs, n

Set the number of outputs. The output to which to send the selected frame is based on the result of the evaluation. Default value is 1.

The expression can contain the following constants:

n

The (sequential) number of the filtered frame, starting from 0.

selected_n

The (sequential) number of the selected frame, starting from 0.

prev_selected_n

The sequential number of the last selected frame. It’s NAN if undefined.

TB

The timebase of the input timestamps.

pts

The PTS (Presentation TimeStamp) of the filtered frame, expressed in TB units. It’s NAN if undefined.

t

The PTS of the filtered frame, expressed in seconds. It’s NAN if undefined.

prev_pts

The PTS of the previously filtered frame. It’s NAN if undefined.

prev_selected_pts

The PTS of the last previously filtered frame. It’s NAN if undefined.

prev_selected_t

The PTS of the last previously selected frame, expressed in seconds. It’s NAN if undefined.

start_pts

The first PTS in the stream which is not NAN. It remains NAN if not found.

start_t

The first PTS, in seconds, in the stream which is not NAN. It remains NAN if not found.

pict_type (video only)

The type of the filtered frame. It can assume one of the following values:

  • I
  • P
  • B
  • S
  • SI
  • SP
  • BI
interlace_type (video only)

The frame interlace type. It can assume one of the following values:

PROGRESSIVE

The frame is progressive (not interlaced).

TOPFIRST

The frame is top-field-first.

BOTTOMFIRST

The frame is bottom-field-first.

consumed_sample_n (audio only)

the number of selected samples before the current frame

samples_n (audio only)

the number of samples in the current frame

sample_rate (audio only)

the input sample rate

key

This is 1 if the filtered frame is a key-frame, 0 otherwise.

pos

the position in the file of the filtered frame, -1 if the information is not available (e.g. for synthetic video); deprecated, do not use

scene (video only)

value between 0 and 1 to indicate a new scene; a low value reflects a low probability for the current frame to introduce a new scene, while a higher value means the current frame is more likely to be one (see the example below)

concatdec_select

The concat demuxer can select only part of a concat input file by setting an inpoint and an outpoint, but the output packets may not be entirely contained in the selected interval. By using this variable, it is possible to skip frames generated by the concat demuxer which are not exactly contained in the selected interval.

This works by comparing the frame pts against the lavf.concat.start_time and the lavf.concat.duration packet metadata values which are also present in the decoded frames.

The concatdec_select variable is -1 if the frame pts is at least start_time and either the duration metadata is missing or the frame pts is less than start_time + duration, 0 otherwise, and NaN if the start_time metadata is missing.

That basically means that an input frame is selected if its pts is within the interval set by the concat demuxer.

The default value of the select expression is "1".

#

Examples

  • Select all frames in input:

    select
    

    The example above is the same as:

    select=1
  • Skip all frames:

    select=0
  • Select only I-frames:

    select='eq(pict_type\,I)'
  • Select one frame every 100:

    select='not(mod(n\,100))'
  • Select only frames contained in the 10-20 time interval:

    select=between(t\,10\,20)
  • Select only I-frames contained in the 10-20 time interval:

    select=between(t\,10\,20)*eq(pict_type\,I)
  • Select frames with a minimum distance of 10 seconds:

    select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)'
  • Use aselect to select only audio frames with samples number > 100:

    aselect='gt(samples_n\,100)'
  • Create a mosaic of the first scenes:

    ffmpeg -i video.avi -vf select='gt(scene\,0.4)',scale=160:120,tile -frames:v 1 preview.png

    Comparing scene against a value between 0.3 and 0.5 is generally a sane choice.

  • Send even and odd frames to separate outputs, and compose them:

    select=n=2:e='mod(n, 2)+1' [odd][even]; [odd] pad=h=2*ih [tmp]; [tmp][even] overlay=y=h
  • Select useful frames from an ffconcat file which is using inpoints and outpoints but where the source files are not intra frame only.

    ffmpeg -copyts -vsync 0 -segment_time_metadata 1 -i input.ffconcat -vf select=concatdec_select -af aselect=concatdec_select output.avi