FFMPEG-FILTERS(1)

๐Ÿ’… FFMPEG-FILTERS(1) โ€” the ffmpeg-filters era ๐Ÿ’…

๐ŸŒธ NAME ๐ŸŒธ

ffmpeg-filters โ€” FFmpeg filters. Thatโ€™s the whole vibe: filters, bestie, filters.


โœจ DESCRIPTION โœจ

This document describes filters, sources, and sinks provided by the libavfilter library. Itโ€™s giving the full tour, no cap.


๐Ÿฆ‹ FILTERING INTRODUCTION ๐Ÿฆ‹

Filtering in FFmpeg is enabled through the libavfilter library. Thatโ€™s the main character right there.

In libavfilter, a filter can have multiple inputs and multiple outputs. To illustrate the sorts of things that are possible, we consider the following filtergraph:

                       [main]
       input --> split ---------------------> overlay --> output
                   |                             ^
                   |[tmp]                  [flip]|
                   +-----> crop --> vflip -------+

This filtergraph splits the input stream in two streams, then sends one stream through the crop filter and the vflip filter, before merging it back with the other stream by overlaying it on top. You can use the following command to achieve this:

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT

The result will be that the top half of the video is mirrored onto the bottom half of the output video. Iconic behavior, honestly.

Filters in the same linear chain are separated by commas, and distinct linear chains of filters are separated by semicolons. In our example, crop,vflip are in one linear chain, split and overlay are separately in another. The points where the linear chains join are labelled by names enclosed in square brackets. In the example, the split filter generates two outputs that are associated to the labels [main] and [tmp]. Slay.

The stream sent to the second output of split, labelled as [tmp], is processed through the crop filter, which crops away the lower half part of the video, and then vertically flipped. The overlay filter takes in input the first unchanged output of the split filter (which was labelled as [main]), and overlay on its lower half the output generated by the crop,vflip filterchain. Literally the plot of the whole graph.

Some filters take in input a list of parameters: they are specified after the filter name and an equal sign, and are separated from each other by a colon.

There exist so-called source filters that do not have an audio/video input, and sink filters that will not have audio/video output. Different lane, same universe.


๐ŸŽ€ GRAPH ๐ŸŽ€

The graph2dot program included in the FFmpeg tools directory can be used to parse a filtergraph description and issue a corresponding textual representation in the dot language. Cute, right?

Invoke the command:

graph2dot -h

to see how to use graph2dot.

You can then pass the dot description to the dot program (from the graphviz suite of programs) and obtain a graphical representation of the filtergraph. Itโ€™s giving visualization, highkey.

For example the sequence of commands:

echo <GRAPH_DESCRIPTION> | \
tools/graph2dot -o graph.tmp && \
dot -Tpng graph.tmp -o graph.png && \
display graph.png

can be used to create and display an image representing the graph described by the GRAPH_DESCRIPTION string. Note that this string must be a complete self-contained graph, with its inputs and outputs explicitly defined. For example if your command line is of the form:

ffmpeg -i infile -vf scale=640:360 outfile

your GRAPH_DESCRIPTION string will need to be of the form:

nullsrc,scale=640:360,nullsink

you may also need to set the nullsrc parameters and add a format filter in order to simulate a specific input file. ๐Ÿ’–

๐Ÿฆ‹ FILTERGRAPH DESCRIPTION ๐Ÿฆ‹

Okay bestie, picture a filtergraph as a directed graph of connected filters. Itโ€™s allowed to contain cycles, and two filters can have multiple links between them. Lowkey wild, but legal. Every link has one input pad on one side โ€” that side connects to the filter it takes its input from โ€” and one output pad on the other side, connecting to the filter that accepts its output. โœจ

Each filter in a filtergraph is an instance of a filter class registered in the application, and that class defines the filterโ€™s features plus how many input and output pads it has. A filter with no input pads is called a โ€œsourceโ€, and a filter with no output pads is called a โ€œsinkโ€. iconic little taxonomy.

๐ŸŽ€ Filtergraph syntax ๐ŸŽ€

This textual representation is recognized by -filter/-vf/-af and -filter_complex in ffmpeg, and by -vf/-af in ffplay, plus by the avfilter_graph_parse_ptr() function defined in libavfilter/avfilter.h. iykyk.

A filterchain is a sequence of connected filters, each one connected to the previous one in the sequence. You write a filterchain as a list of ,-separated filter descriptions. A filtergraph is a sequence of filterchains, and you write that sequence as a list of ;-separated filterchain descriptions. Itโ€™s giving nested-list energy. ๐Ÿซถ

A filter is represented by a string shaped like this:

[in_link_1]...[in_link_N]filter_name@id=arguments[out_link_1]...[out_link_M]

filter_name is the name of the filter class that the described filter is an instance of. It has to be the name of one of the filter classes registered in the program, optionally followed by @id. The filter class name can optionally be followed by a string =arguments.

arguments is a string holding the parameters used to initialize the filter instance. It may have one of two forms:

  • A :-separated list of key=value pairs.
  • A :-separated list of value. In this case, the keys are assumed to be the option names in the order theyโ€™re declared. Example: the fade filter declares three options in this order โ€” type, start_frame and nb_frames. So the parameter list in:0:30 means the value in is assigned to option type, 0 to start_frame, and 30 to nb_frames.
  • A :-separated list mixing direct values and long key=value pairs. Direct values must precede the key=value pairs, and they follow the same constraints/order as the previous point. The key=value pairs after that can be set in any order you prefer.

If the option value itself is a list of items (say the format filter takes a list of pixel formats), the items in that list are usually separated by |.

The arguments list can be quoted using the character ' as the opening and ending mark, and the character \ for escaping characters within the quoted text. If you donโ€™t quote it, the argument string is considered terminated when the next special character from the set []=;, is encountered. respect the delimiters, bestie.

Thereโ€™s a special syntax in the ffmpeg CLI tool for loading option values from files. You prepend a slash / to the option name, and then the supplied value is interpreted as a path from which the actual value is loaded. For example:

ffmpeg -i <INPUT> -vf drawtext=/text=/tmp/some_text <OUTPUT>

This will load the text to be drawn from /tmp/some_text. API users who want a similar feature should use the avfilter_graph_segment_*() functions together with custom IO code. โœจ

The filterโ€™s name and arguments may be preceded and followed by a list of link labels. A link label lets you name a link and associate it with a filter output pad or input pad. The labels before it โ€” in_link_1 ... in_link_N โ€” are associated with the filter input pads; the labels after it โ€” out_link_1 ... out_link_M โ€” are associated with the output pads.

When two link labels with the same name show up in the filtergraph, a link between the corresponding input pad and output pad is created. matching names = connection.

If an output pad has no label, it gets linked by default to the first unlabelled input pad of the next filter in the filterchain. Example:

nullsrc, split[L1], [L2]overlay, nullsink

Here the split filter instance has two output pads and the overlay filter instance has two input pads. The first output pad of split is labelled L1; the first input pad of overlay is labelled L2; and the second output pad of split is linked to the second input pad of overlay โ€” both of those are unlabelled.

In a filter description, if the first filterโ€™s input label isnโ€™t specified, in is assumed. If the last filterโ€™s output label isnโ€™t specified, out is assumed. In a complete filterchain, every unlabelled filter input pad and output pad must be connected. A filtergraph is considered valid only if all the filter input pads and output pads of all its filterchains are connected. No dangling vibes allowed. ๐Ÿ’…

Leading and trailing whitespace โ€” space, tabs, or line feeds โ€” that separates tokens in the filtergraph specification is ignored. That means the filtergraph can be expressed using empty lines and spaces to improve readability. For example, this filtergraph:

testsrc,split[L1],hflip[L2];[L1][L2] hstack

can be represented as:

testsrc,
split [L1], hflip [L2];

[L1][L2] hstack

Libavfilter will automatically insert scale filters wherever format conversion is required. Itโ€™s possible to specify swscale flags for those automatically inserted scalers by prepending sws_flags=flags; to the filtergraph description. ๐ŸŽ€

Hereโ€™s the BNF description of the filtergraph syntax:

<NAME>             ::= sequence of alphanumeric characters and '_'
<FILTER_NAME>      ::= <NAME>["@"<NAME>]
<LINKLABEL>        ::= "[" <NAME> "]"
<LINKLABELS>       ::= <LINKLABEL> [<LINKLABELS>]
<FILTER_ARGUMENTS> ::= sequence of chars (possibly quoted)
<FILTER>           ::= [<LINKLABELS>] <FILTER_NAME> ["=" <FILTER_ARGUMENTS>] [<LINKLABELS>]
<FILTERCHAIN>      ::= <FILTER> [,<FILTERCHAIN>]
<FILTERGRAPH>      ::= [sws_flags=<flags>;] <FILTERCHAIN> [;<FILTERGRAPH>]

๐Ÿ˜ญ Notes on filtergraph escaping ๐Ÿ˜ญ

Putting a filtergraph description together means stacking several levels of escaping. See the โ€œQuoting and escapingโ€ section in the ffmpeg-utils(1) manual for more information about the escaping procedure used.

The first level of escaping affects the content of each filter option value. Those values may contain the special character : used to separate values, or one of the escaping characters \ or '.

The second level of escaping affects the whole filter description, which may contain the escaping characters \ and ', or the special characters [, ], ,, ; used by the filtergraph description.

Finally, when you specify a filtergraph on a shell commandline, you need a third level of escaping for the shell special characters contained within it.

Example time. Consider this string, which is meant to be embedded in the drawtext filter descriptionโ€™s text value:

this is a 'string': may contain one, or more, special characters

This string contains the ' special escaping character and the : special character, so it needs to be escaped like this:

text=this is a \'string\'\: may contain one, or more, special characters

A second level of escaping is required when embedding the filter description in a filtergraph description, to escape all the filtergraph special characters. So the example above becomes:

drawtext=text=this is a \\\'string\\\'\\: may contain one\, or more\, special characters

(Quick note: in addition to the \' escaping special characters, the , also needs escaping.)

Finally, an additional level of escaping is needed when writing the filtergraph description in a shell command, and that depends on the escaping rules of the shell youโ€™re using. For example, assuming \ is special and needs to be escaped with another \, the previous string finally results in:

-vf "drawtext=text=this is a \\\\\\'string\\\\\\'\\\\: may contain one\\, or more\\, special characters"

To avoid cumbersome escaping when using a commandline tool that accepts a filter specification as input, itโ€™s advisable to avoid direct inclusion of the filter or options specification in the shell. For example, with the drawtext filter, you might prefer to use the textfile option instead of text to specify the text to render. save yourself the backslash headache, bestie.

โฐ TIMELINE EDITING โฐ

Some filters support a generic enable option. For filters supporting timeline editing, this option can be set to an expression that is evaluated before sending a frame to the filter. If the evaluation is non-zero, the filter will be enabled; otherwise the frame will be sent unchanged to the next filter in the filtergraph. gatekeeping frames, but make it math.

The expression accepts the following values:

  • t โ€” timestamp expressed in seconds, NAN if the input timestamp is unknown
  • n โ€” sequential number of the input frame, starting from 0
  • pos โ€” the position in the file of the input frame, NAN if unknown; deprecated, do not use
  • w, h โ€” width and height of the input frame if video

Additionally, these filters support an enable command that can be used to re-define the expression. Like any other filtering option, the enable option follows the same rules.

For example, to enable a blur filter (smartblur) from 10 seconds to 3 minutes, and a curves filter starting at 3 seconds:

smartblur = enable='between(t,10,3*60)',
curves    = enable='gte(t,3)' : preset=cross_process

See ffmpeg -filters to view which filters have timeline support. ๐Ÿ‘‘

๐Ÿ’… CHANGING OPTIONS AT RUNTIME WITH A COMMAND ๐Ÿ’…

Some options can be changed during the operation of the filter by using a command. These options are marked T on the output of ffmpeg -h filter=<name of filter>. The name of the command is the name of the option, and the argument is the new value. runtime glow-up, but for options.

๐ŸŒธ OPTIONS FOR FILTERS WITH SEVERAL INPUTS ๐ŸŒธ

Okay so some filters have multiple inputs, and they share a little common option squad. Important: these can only be set by name, not with the short notation. No sneaky abbreviations, bestie.

  • eof_action โ€” what to do when EOF hits on the secondary input. Pick one:
    • repeat โ€” repeat the last frame. This is the default.
    • endall โ€” end both streams.
    • pass โ€” pass the main input through.
  • shortest โ€” if set to 1, force the output to terminate when the shortest input terminates. Default is 0.
  • repeatlast โ€” if set to 1, force the filter to extend the last frame of secondary streams until the end of the primary stream. A value of 0 disables this behavior. Default is 1.
  • ts_sync_mode โ€” how strictly to sync streams based on secondary input timestamps. Pick one:
    • default โ€” frame from secondary input with the nearest lower or equal timestamp to the primary input frame.
    • nearest โ€” frame from secondary input with the absolute nearest timestamp to the primary input frame.

๐ŸŽง AUDIO FILTERS ๐ŸŽง

When you configure your FFmpeg build, you can disable any of the existing filters using --disable-filters. The configure output will show the audio filters included in your build. โœจ

Below is a description of the currently available audio filters. Letโ€™s get into it.

aap

Apply the Affine Projection algorithm to the first audio stream using the second audio stream.

This adaptive filter is used to estimate unknown audio based on multiple input audio samples. Affine projection algorithm can make trade-offs between computation complexity with convergence speed.

A description of the accepted options follows.

  • order โ€” set the filter order.
  • projection โ€” set the projection order.
  • mu โ€” set the filter mu.
  • delta โ€” set the coefficient to initialize the internal covariance matrix.
  • out_mode โ€” set the filter output samples. It accepts the following values:
    • i โ€” pass the 1st input.
    • d โ€” pass the 2nd input.
    • o โ€” pass difference between desired, 2nd input and error signal estimate.
    • n โ€” pass difference between input, 1st input and error signal estimate.
    • e โ€” pass error signal estimated samples.

Default value is o.

  • precision โ€” set which precision to use when processing samples.
    • auto โ€” auto pick internal sample format depending on other filters.
    • float โ€” always use single-floating point precision sample format.
    • double โ€” always use double-floating point precision sample format.

acompressor

A compressor is mainly used to reduce the dynamic range of a signal. Especially modern music is mostly compressed at a high ratio to improve the overall loudness. Itโ€™s done to get the highest attention of a listener, โ€œfattenโ€ the sound and bring more โ€œpowerโ€ to the track. If a signal is compressed too much it may sound dull or โ€œdeadโ€ afterwards or it may start to โ€œpumpโ€ (which could be a powerful effect but can also destroy a track completely). The right compression is the key to reach a professional sound and is the high art of mixing and mastering. Because of its complex settings it may take a long time to get the right feeling for this kind of effect.

Compression is done by detecting the volume above a chosen level โ€œthresholdโ€ and dividing it by the factor set with โ€œratioโ€. So if you set the threshold to -12dB and your signal reaches -6dB, a ratio of 2:1 will result in a signal at -9dB. Because an exact manipulation of the signal would cause distortion of the waveform, the reduction can be levelled over the time. This is done by setting โ€œAttackโ€ and โ€œReleaseโ€. โ€œattackโ€ determines how long the signal has to rise above the threshold before any reduction will occur, and โ€œreleaseโ€ sets the time the signal has to fall below the threshold to reduce the reduction again. Shorter signals than the chosen attack time will be left untouched. The overall reduction of the signal can be made up afterwards with the โ€œmakeupโ€ setting. So compressing the peaks of a signal about 6dB and raising the makeup to this level results in a signal twice as loud than the source. To gain a softer entry in the compression the โ€œkneeโ€ flattens the hard edge at the threshold in the range of the chosen decibels.

The filter accepts the following options:

  • level_in โ€” set input gain. Default is 1. Range is between 0.015625 and 64.
  • mode โ€” set mode of compressor operation. Can be upward or downward. Default is downward.
  • threshold โ€” if a signal of stream rises above this level it will affect the gain reduction. By default it is 0.125. Range is between 0.00097563 and 1.
  • ratio โ€” set a ratio by which the signal is reduced. 1:2 means that if the level rose 4dB above the threshold, it will be only 2dB above after the reduction. Default is 2. Range is between 1 and 20.
  • attack โ€” amount of milliseconds the signal has to rise above the threshold before gain reduction starts. Default is 20. Range is between 0.01 and 2000.
  • release โ€” amount of milliseconds the signal has to fall below the threshold before reduction is decreased again. Default is 250. Range is between 0.01 and 9000.
  • makeup โ€” set the amount by how much signal will be amplified after processing. Default is 1. Range is from 1 to 64.
  • knee โ€” curve the sharp knee around the threshold to enter gain reduction more softly. Default is 2.82843. Range is between 1 and 8.
  • link โ€” choose if the โ€œaverageโ€ level between all channels of input stream or the louder (โ€œmaximumโ€) channel of input stream affects the reduction. Default is average.
  • detection โ€” should the exact signal be taken in case of peak or an RMS one in case of rms. Default is rms, which is mostly smoother.
  • mix โ€” how much to use compressed signal in output. Default is 1. Range is between 0 and 1.

Commands

This filter supports all the above options as commands. ๐Ÿ‘‘

acontrast

Simple audio dynamic range compression/expansion filter.

The filter accepts the following options:

  • contrast โ€” set contrast. Default is 33. Allowed range is between 0 and 100.

acopy

Copy the input audio source unchanged to the output. This is mainly useful for testing purposes.

acrossfade

Apply cross fade from one input audio stream to another input audio stream. The cross fade is applied for specified duration near the end of first stream.

The filter accepts the following options:

  • inputs, n โ€” specify the number of inputs to crossfade. When crossfading multiple inputs, each input will be concatenated and crossfaded in sequence, similar to the concat filter. Default is 2.
  • nb_samples, ns โ€” specify the number of samples for which the cross fade effect has to last. At the end of the cross fade effect the first input audio will be completely silent. Default is 44100.
  • duration, d โ€” specify the duration of the cross fade effect. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. By default the duration is determined by nb_samples. If set, this option is used instead of nb_samples.
  • overlap, o โ€” should first stream end overlap with second stream start. Default is enabled.
  • curve1 โ€” set curve for cross fade transition for first stream.
  • curve2 โ€” set curve for cross fade transition for second stream.

For description of available curve types see afade filter description.

Examples

  • Cross fade from one input to another:
ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:c1=exp:c2=exp output.flac
  • Cross fade from one input to another but without overlapping:
ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:o=0:c1=exp:c2=exp output.flac

Concatenate multiple inputs with cross fade between each:

ffmpeg -i first.flac -i second.flac -i third.flac -filter_complex acrossfade=n=3 output.flac

acrossover

Split audio stream into several bands.

This filter splits audio stream into two or more frequency ranges. Summing all streams back will give flat output.

The filter accepts the following options:

  • split โ€” set split frequencies. Those must be positive and increasing.
  • order โ€” set filter order for each band split. This controls filter roll-off or steepness of filter transfer function. Available values are:
    • 2nd โ€” 12 dB per octave.
    • 4th โ€” 24 dB per octave.
    • 6th โ€” 36 dB per octave.
    • 8th โ€” 48 dB per octave.
    • 10th โ€” 60 dB per octave.
    • 12th โ€” 72 dB per octave.
    • 14th โ€” 84 dB per octave.
    • 16th โ€” 96 dB per octave.
    • 18th โ€” 108 dB per octave.
    • 20th โ€” 120 dB per octave.

Default is 4th.

  • level โ€” set input gain level. Allowed range is from 0 to 1. Default value is 1.
  • gains โ€” set output gain for each band. Default value is 1 for all bands.
  • precision โ€” set which precision to use when processing samples.
    • auto โ€” auto pick internal sample format depending on other filters.
    • float โ€” always use single-floating point precision sample format.
    • double โ€” always use double-floating point precision sample format.

Default value is auto.

Examples

  • Split input audio stream into two bands (low and high) with split frequency of 1500 Hz, each band will be in separate stream:
ffmpeg -i in.flac -filter_complex 'acrossover=split=1500[LOW][HIGH]' -map '[LOW]' low.wav -map '[HIGH]' high.wav
  • Same as above, but with higher filter order:
ffmpeg -i in.flac -filter_complex 'acrossover=split=1500:order=8th[LOW][HIGH]' -map '[LOW]' low.wav -map '[HIGH]' high.wav
  • Same as above, but also with additional middle band (frequencies between 1500 and 8000):
ffmpeg -i in.flac -filter_complex 'acrossover=split=1500 8000:order=8th[LOW][MID][HIGH]' -map '[LOW]' low.wav -map '[MID]' mid.wav -map '[HIGH]' high.wav

acrusher

Reduce audio bit resolution.

okay so this filter is a bit crusher, but likeโ€ฆ a glow-up bit crusher with โœจenhanced functionalityโœจ. A bit crusher's whole personality is audibly reducing the number of bits an audio signal is sampled with โ€” and no, bestie, before you ask, this does not change the bit depth at all, it just produces the effect. Material with reduced bit depth sounds harsher and more "digital", which is kinda the point. This filter can even round to continuous values instead of discrete bit depths, fancy. On top of that it's got a D/C offset, which means the lower half and the upper half of the signal get crushed differently. And there's an Anti-Aliasing setting that gives you "softer" crushing sounds. ๐ŸŽ€

Another feature: the logarithmic mode. This switches from linear distances between bits to logarithmic ones. The result is a much more "natural" sounding crusher that, like, doesn't gate low signals (iykyk). Human ears perceive stuff logarithmically, so this kind of crushing is way more pleasant. And logarithmic crushing can get anti-aliased too. ๐Ÿ’–

It accepts the following options:

  • level_in โ€” sets level in.
  • level_out โ€” sets level out.
  • bits โ€” sets bit reduction.
  • mix โ€” sets mixing amount.
  • mode โ€” can be linear: "lin" or logarithmic: "log".
  • dc โ€” sets DC.
  • aa โ€” sets anti-aliasing.
  • samples โ€” sets sample reduction.
  • lfo โ€” enables LFO. By default it's disabled.
  • lforange โ€” sets LFO range.
  • lforate โ€” sets LFO rate.

๐Ÿ’ฌ Commands

This filter supports the all above options as commands. (yes, literally all of them, go off ๐Ÿ‘‘)


๐ŸŽง acue

Delays audio filtering until a given wallclock timestamp. See the cue filter. โฐ


๐Ÿงฝ adeclick

Removes impulsive noise from the input audio. Samples that get detected as impulsive noise are replaced by interpolated samples using autoregressive modelling. ๐Ÿซง

  • window, w โ€” sets the window size, in milliseconds. Allowed range is 10 to 100. Default value is 55 milliseconds. This sets the size of the window that gets processed at once.
  • overlap, o โ€” sets the window overlap, as a percentage of window size. Allowed range is 50 to 95. Default value is 75 percent. Setting this to a very high value increases impulsive noise removal but makes the whole process much slower. ๐Ÿ˜ญ
  • arorder, a โ€” sets the autoregression order, as a percentage of window size. Allowed range is 0 to 25. Default value is 2 percent. This option also controls the quality of interpolated samples using neighbour good samples.
  • threshold, t โ€” sets the threshold value. Allowed range is 1 to 100. Default value is 2. This controls the strength of the impulsive noise that's going to be removed. The lower the value, the more samples get detected as impulsive noise.
  • burst, b โ€” sets burst fusion, as a percentage of window size. Allowed range is 0 to 10. Default value is 2. If any two samples detected as noise are spaced less than this value, then any sample between those two samples will also be detected as noise.
  • method, m โ€” sets the overlap method. It accepts the following values:
    • add, a โ€” selects the overlap-add method. Even not interpolated samples get slightly changed with this method.
    • save, s โ€” selects the overlap-save method. Not interpolated samples remain unchanged.

Default value is "a".


โœ‚๏ธ adeclip

Removes clipped samples from the input audio. Samples detected as clipped are replaced by interpolated samples using autoregressive modelling. ๐Ÿฉน

  • window, w โ€” sets the window size, in milliseconds. Allowed range is 10 to 100. Default value is 55 milliseconds. This sets the size of the window that gets processed at once.
  • overlap, o โ€” sets the window overlap, as a percentage of window size. Allowed range is 50 to 95. Default value is 75 percent.
  • arorder, a โ€” sets the autoregression order, as a percentage of window size. Allowed range is 0 to 25. Default value is 8 percent. This option also controls the quality of interpolated samples using neighbour good samples.
  • threshold, t โ€” sets the threshold value. Allowed range is 1 to 100. Default value is 10. Higher values make clip detection less aggressive.
  • hsize, n โ€” sets the size of the histogram used to detect clips. Allowed range is 100 to 9999. Default value is 1000. Higher values make clip detection less aggressive.
  • method, m โ€” sets the overlap method. It accepts the following values:
    • add, a โ€” selects the overlap-add method. Even not interpolated samples get slightly changed with this method.
    • save, s โ€” selects the overlap-save method. Not interpolated samples remain unchanged.

Default value is "a".


๐ŸŒ€ adecorrelate

Applies decorrelation to the input audio stream. (it's giving spatial ๐Ÿ’ซ)

The filter accepts the following options:

  • stages โ€” sets the decorrelation stages of filtering. Allowed range is 1 to 16. Default value is 6.
  • seed โ€” sets the random seed used for setting the delay in samples across channels.

โณ adelay

Delays one or more audio channels. Samples in a delayed channel get filled with silence. ๐Ÿคซ

The filter accepts the following option:

  • delays โ€” sets the list of delays in milliseconds for each channel, separated by '|'. Unused delays get silently ignored. If the number of given delays is smaller than the number of channels, all remaining channels will not be delayed. If you want to delay an exact number of samples, append 'S' to the number. If you'd rather delay in seconds, append 's' to the number.
  • all โ€” uses the last set delay for all remaining channels. By default it's disabled. If you enable this option, it changes how the "delays" option is interpreted.

โœจ Examples

  • Delay the first channel by 1.5 seconds, the third channel by 0.5 seconds, and leave the second channel (and any other channels that may be present) unchanged.
adelay=1500|0|500
  • Delay the second channel by 500 samples, the third channel by 700 samples, and leave the first channel (and any other channels that may be present) unchanged.
adelay=0|500S|700S
  • Delay all channels by the same number of samples:
adelay=delays=64S:all=1

๐ŸŒฌ๏ธ adenorm

Fixes denormals in audio by adding extremely low-level noise. This filter shall be placed before any filter that can produce denormals โ€” like, do that, fr fr. ๐Ÿซถ

A description of the accepted parameters follows.

  • level โ€” sets the level of added noise in dB. Default is -351. Allowed range is from -451 to -90.
  • type โ€” sets the type of added noise.
    • dc โ€” adds a DC signal.
    • ac โ€” adds an AC signal.
    • square โ€” adds a square signal.
    • pulse โ€” adds a pulse signal.

Default is "dc".

๐Ÿ’ฌ Commands

This filter supports the all above options as commands.


๐Ÿ“ˆ aderivative, aintegral

Computes the derivative/integral of the audio stream. Applying both filters one after another produces the original audio โ€” iconic round-trip behaviour tbh. ๐Ÿ”


๐ŸŽš๏ธ adrc

Applies the spectral dynamic range controller filter to the input audio stream.

A description of the accepted options follows.

  • transfer โ€” sets the transfer expression. The expression can contain the following constants:
    • ch โ€” current channel number
    • sn โ€” current sample number
    • nb_channels โ€” number of channels
    • t โ€” timestamp expressed in seconds
    • sr โ€” sample rate
    • p โ€” current frequency power value, in dB
    • f โ€” current frequency in Hz

Default value is "p".

  • attack โ€” sets the attack in milliseconds. Default is 50 milliseconds. Allowed range is from 1 to 1000 milliseconds.
  • release โ€” sets the release in milliseconds. Default is 100 milliseconds. Allowed range is from 5 to 2000 milliseconds.
  • channels โ€” sets which channels to filter. By default "all" channels in the audio stream get filtered.

๐Ÿ’ฌ Commands

This filter supports the all above options as commands.

โœจ Examples

  • Apply spectral compression to all frequencies with a threshold of -50 dB and a 1:6 ratio:
adrc=transfer='if(gt(p,-50),-50+(p-(-50))/6,p)':attack=50:release=100
  • Similar to above but with a 1:2 ratio and filtering only the front center channel:
adrc=transfer='if(gt(p,-50),-50+(p-(-50))/2,p)':attack=50:release=100:channels=FC
  • Apply a spectral noise gate to all frequencies with a threshold of -85 dB and with a short attack time and short release time:
adrc=transfer='if(lte(p,-85),p-800,p)':attack=1:release=5
  • Apply spectral expansion to all frequencies with a threshold of -10 dB and a 1:2 ratio:
adrc=transfer='if(lt(p,-10),-10+(p-(-10))*2,p)':attack=50:release=100
  • Apply a limiter to max -60 dB to all frequencies, with an attack of 2 ms and a release of 10 ms:
adrc=transfer='min(p,-60)':attack=2:release=10

๐ŸŽ›๏ธ adynamicequalizer

Applies dynamic equalization to the input audio stream. ๐Ÿ’…

A description of the accepted options follows.

  • threshold โ€” sets the detection threshold used to trigger equalization. Threshold detection is using the detection filter. Default value is 0. Allowed range is from 0 to 100.
  • dfrequency โ€” sets the detection frequency in Hz used for the detection filter used to trigger equalization. Default value is 1000 Hz. Allowed range is between 2 and 1000000 Hz.
  • dqfactor โ€” sets the detection resonance factor for the detection filter used to trigger equalization. Default value is 1. Allowed range is from 0.001 to 1000.
  • tfrequency โ€” sets the target frequency of the equalization filter. Default value is 1000 Hz. Allowed range is between 2 and 1000000 Hz.
  • tqfactor โ€” sets the target resonance factor for the target equalization filter. Default value is 1. Allowed range is from 0.001 to 1000.
  • attack โ€” sets the amount of milliseconds the signal from detection has to rise above the detection threshold before equalization starts. Default is 20. Allowed range is between 1 and 2000.
  • release โ€” sets the amount of milliseconds the signal from detection has to fall below the detection threshold before equalization ends. Default is 200. Allowed range is between 1 and 2000.
  • ratio โ€” sets the ratio by which the equalization gain is raised. Default is 1. Allowed range is between 0 and 30.
  • makeup โ€” sets the makeup offset by which the equalization gain is raised. Default is 0. Allowed range is between 0 and 100.
  • range โ€” sets the max allowed cut/boost amount. Default is 50. Allowed range is from 1 to 200.
  • mode โ€” sets the mode of filter operation, can be one of the following:
    • listen โ€” output only isolated detection signal.
  • cutbelow โ€” cut frequencies below the detection threshold.
  • cutabove โ€” cut frequencies above the detection threshold.
  • boostbelow โ€” boost frequencies below the detection threshold.
  • boostabove โ€” boost frequencies above the detection threshold.

Default mode is cutbelow โ€” the default, periodt.

  • dftype โ€” set the type of detection filter. It can be one of:
    • bandpass
    • lowpass
    • highpass
    • peak

Default type is bandpass.

  • tftype โ€” set the type of target filter. It can be one of:
    • bell
    • lowshelf
    • highshelf

Default type is bell.

  • auto โ€” automatically gather threshold from the detection filter. By default it's disabled. This option is useful to detect threshold in a certain time frame of the input audio stream, and in that case the option value is changed at runtime. Available values are:
    • disabled โ€” disable using automatically gathered threshold value.
    • off โ€” stop picking threshold value.
    • on โ€” start picking threshold value.
    • adaptive โ€” adaptively pick threshold value, by calculating sliding window entropy.
  • precision โ€” set which precision to use when processing samples:
    • auto โ€” auto pick internal sample format depending on other filters.
    • float โ€” always use single-floating point precision sample format.
    • double โ€” always use double-floating point precision sample format.

๐Ÿ’ฌ Commands

This filter supports all the above options as commands. Slay.


๐ŸŒŠ adynamicsmooth

Apply dynamic smoothing to the input audio stream. Here are the accepted options, bestie:

  • sensitivity โ€” set an amount of sensitivity to frequency fluctuations. Default is 2. Allowed range is from 0 to 1e+06.
  • basefreq โ€” set a base frequency for smoothing. Default value is 22050. Allowed range is from 2 to 1e+06.

๐Ÿ’ฌ Commands

This filter supports all the above options as commands.


๐Ÿชž aecho

Apply echoing to the input audio.

Echoes are reflected sound and can occur naturally amongst mountains (and sometimes large buildings) when talking or shouting; digital echo effects emulate this behaviour and are often used to help fill out the sound of a single instrument or vocal. The time difference between the original signal and the reflection is the "delay", and the loudness of the reflected signal is the "decay". Multiple echoes can have different delays and decays.

Parameters, coming right up:

  • in_gain โ€” set input gain of the reflected signal. Default is 0.6.
  • out_gain โ€” set output gain of the reflected signal. Default is 0.3.
  • delays โ€” set list of time intervals in milliseconds between the original signal and reflections, separated by |. Allowed range for each "delay" is (0 - 90000.0]. Default is 1000.
  • decays โ€” set list of loudness of reflected signals, separated by |. Allowed range for each "decay" is (0 - 1.0]. Default is 0.5.

โœจ Examples

  • Make it sound as if there are twice as many instruments as are actually playing:
aecho=0.8:0.88:60:0.4
  • If delay is very short, then it sounds like a (metallic) robot playing music:
aecho=0.8:0.88:6:0.4
  • A longer delay will sound like an open air concert in the mountains:
aecho=0.8:0.9:1000:0.3
  • Same as above but with one more mountain:
aecho=0.8:0.9:1000|1800:0.3|0.25

๐ŸŽš๏ธ aemphasis

Audio emphasis filter creates or restores material directly taken from LPs or emphasized CDs with different filter curves. E.g. to store music on vinyl the signal has to be altered by a filter first to even out the disadvantages of this recording medium. Once the material is played back the inverse filter has to be applied to restore the distortion of the frequency response.

The filter accepts the following options:

  • level_in โ€” set input gain.
  • level_out โ€” set output gain.
  • mode โ€” set filter mode. For restoring material use reproduction mode, otherwise use production mode. Default is reproduction mode.
  • type โ€” set filter type. Selects medium. Can be one of:
    • col โ€” select Columbia.
    • emi โ€” select EMI.
    • bsi โ€” select BSI (78RPM).
    • riaa โ€” select RIAA.
    • cd โ€” select Compact Disc (CD).
    • 50fm โ€” select 50ยตs (FM).
    • 75fm โ€” select 75ยตs (FM).
    • 50kf โ€” select 50ยตs (FM-KF).
    • 75kf โ€” select 75ยตs (FM-KF).

๐Ÿ’ฌ Commands

This filter supports all the above options as commands.


๐Ÿงฎ aeval

Modify an audio signal according to the specified expressions.

This filter accepts one or more expressions (one for each channel), which are evaluated and used to modify a corresponding audio signal.

It accepts the following parameters:

  • exprs โ€” set the |-separated expressions list for each separate channel. If the number of input channels is greater than the number of expressions, the last specified expression is used for the remaining output channels.
  • channel_layout, c โ€” set output channel layout. If not specified, the channel layout is specified by the number of expressions. If set to same, it will use by default the same input channel layout.

Each expression in exprs can contain the following constants and functions:

  • ch โ€” channel number of the current expression.
  • n โ€” number of the evaluated sample, starting from 0.
  • s โ€” sample rate.
  • t โ€” time of the evaluated sample expressed in seconds.
  • nb_in_channels, nb_out_channels โ€” input and output number of channels.
  • val(CH) โ€” the value of input channel with number CH.
Note: this filter is slow. For faster processing you should use a dedicated filter.

โœจ Examples

  • Half volume:
aeval=val(ch)/2:c=same
  • Invert phase of the second channel:
aeval=val(0)|-val(1)

โœจ aexciter

An exciter is used to produce high sound that is not present in the original signal. This is done by creating harmonic distortions of the signal which are restricted in range and added to the original signal. An Exciter raises the upper end of an audio signal without simply raising the higher frequencies like an equalizer would do to create a more "crisp" or "brilliant" sound.

The filter accepts the following options:

  • level_in โ€” set input level prior processing of the signal. Allowed range is from 0 to 64. Default value is 1.
  • level_out โ€” set output level after processing of the signal. Allowed range is from 0 to 64. Default value is 1.
  • amount โ€” set the amount of harmonics added to the original signal. Allowed range is from 0 to 64. Default value is 1.
  • drive โ€” set the amount of newly created harmonics. Allowed range is from 0.1 to 10. Default value is 8.5.
  • blend โ€” set the octave of newly created harmonics. Allowed range is from -10 to 10. Default value is 0.
  • freq โ€” set the lower frequency limit of producing harmonics in Hz. Allowed range is from 2000 to 12000 Hz. Default is 7500 Hz.
  • ceil โ€” set the upper frequency limit of producing harmonics. Allowed range is from 9999 to 20000 Hz. If value is lower than 10000 Hz no limit is applied.
  • listen โ€” mute the original signal and output only added harmonics. By default it's disabled.

๐Ÿ’ฌ Commands

This filter supports all the above options as commands.


๐ŸŒ… afade

Apply fade-in/out effect to input audio.

A description of the accepted parameters follows.

  • type, t โ€” specify the effect type, can be either in for fade-in, or out for a fade-out effect. Default is in.
  • start_sample, ss โ€” specify the number of the start sample for starting to apply the fade effect. Default is 0.
  • nb_samples, ns โ€” specify the number of samples for which the fade effect has to last. At the end of the fade-in effect the output audio will have the same volume as the input audio, at the end of the fade-out transition the output audio will be silence. Default is 44100.
  • start_time, st โ€” specify the start time of the fade effect. Default is 0. The value must be specified as a time duration; see the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. If set, this option is used instead of start_sample.
  • duration, d โ€” specify the duration of the fade effect. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. At the end of the fade-in effect the output audio will have the same volume as the input audio, at the end of the fade-out transition the output audio will be silence. By default the duration is determined by nb_samples. If set, this option is used instead of nb_samples.
  • curve โ€” set curve for fade transition. It accepts the following values:
    • tri โ€” select triangular, linear slope (default)
    • qsin โ€” select quarter of sine wave
    • hsin โ€” select half of sine wave
    • esin โ€” select exponential sine wave
    • log โ€” select logarithmic
    • ipar โ€” select inverted parabola
    • qua โ€” select quadratic
    • cub โ€” select cubic
    • squ โ€” select square root
    • cbr โ€” select cubic root
    • par โ€” select parabola
    • exp โ€” select exponential
    • iqsin โ€” select inverted quarter of sine wave
    • ihsin โ€” select inverted half of sine wave
    • dese โ€” select double-exponential seat
    • desi โ€” select double-exponential sigmoid
    • losi โ€” select logistic sigmoid
    • sinc โ€” select sine cardinal function
    • isinc โ€” select inverted sine cardinal function
    • quat โ€” select quartic
    • quatr โ€” select quartic root
    • qsin2 โ€” select squared quarter of sine wave
    • hsin2 โ€” select squared half of sine wave
    • nofade โ€” no fade applied
  • silence โ€” set the initial gain for fade-in or final gain for fade-out. Default value is 0.0.
  • unity โ€” set the initial gain for fade-out or final gain for fade-in. Default value is 1.0.

๐Ÿ’ฌ Commands

This filter supports all the above options as commands.

โœจ Examples

  • Fade in first 15 seconds of audio:
afade=t=in:ss=0:d=15
  • Fade out last 25 seconds of a 900 seconds audio:
afade=t=out:st=875:d=25

๐Ÿงผ afftdn

Denoise audio samples with FFT.

A description of the accepted parameters follows, bestie ๐Ÿ’– okay so hereโ€™s the full tea:

  • noise_reduction, nr โ€” Set the noise reduction in dB. Allowed range is 0.01 to 97. Default value is 12 dB.
  • noise_floor, nf โ€” Set the noise floor in dB. Allowed range is -80 to -20. Default value is -50 dB.
  • noise_type, nt โ€” Set the noise type. Default value is white noise. It accepts these values:
    • white, w โ€” Select white noise.
    • vinyl, v โ€” Select vinyl noise.
    • shellac, s โ€” Select shellac noise.
    • custom, c โ€” Select custom noise, defined in the bn option.
  • band_noise, bn โ€” Set a custom band noise profile for every one of 15 bands. Bands are separated by ' ' or '|'.
  • residual_floor, rf โ€” Set the residual floor in dB. Allowed range is -80 to -20. Default value is -38 dB.
  • track_noise, tn โ€” Enable noise floor tracking. By default itโ€™s disabled. With this enabled, the noise floor is automatically adjusted.
  • track_residual, tr โ€” Enable residual tracking. By default itโ€™s disabled.
  • output_mode, om โ€” Set the output mode. Default value is output. It accepts these values:
    • input, i โ€” Pass input unchanged.
    • output, o โ€” Pass noise filtered out.
    • noise, n โ€” Pass only noise.
  • adaptivity, ad โ€” Set the adaptivity factor, used for how fast to adapt gain adjustments per each frequency bin. Value 0 enables instant adaptation, while higher values react much slower. Allowed range is from 0 to 1. Default value is 0.5.
  • floor_offset, fo โ€” Set the noise floor offset factor. This option adjusts the offset applied to the measured noise floor. Itโ€™s only effective when noise floor tracking is enabled. Allowed range is from -2.0 to 2.0. Default value is 1.0.
  • noise_link, nl โ€” Set the noise link used for multichannel audio. Default value is min. It accepts these values:
    • none โ€” Use unchanged channelโ€™s noise floor.
    • min โ€” Use measured min noise floor of all channels.
    • max โ€” Use measured max noise floor of all channels.
    • average โ€” Use measured average noise floor of all channels.
  • band_multiplier, bm โ€” Set the band multiplier factor, used for how much to spread bands across frequency bins. Allowed range is from 0.2 to 5. Default value is 1.25.
  • sample_noise, sn โ€” Toggle capturing and measurement of a noise profile from input audio. Default value is "none". It accepts these values:
    • start, begin โ€” Start sample noise capture.
    • stop, end โ€” Stop sample noise capture and measure new noise band profile.
  • gain_smooth, gs โ€” Set gain smooth spatial radius, used to smooth gains applied to each frequency bin. Useful to reduce random music noise artefacts. Higher values increase smoothing of gains. Allowed range is from 0 to 50. Default value is 0.

Commands ๐Ÿ’ฌ

This filter supports some of the options above as commands, periodt.

Examples ๐ŸŽ€

  • Reduce white noise by 10dB, and use a previously measured noise floor of -40dB:
afftdn=nr=10:nf=-40
  • Reduce white noise by 10dB, also set the initial noise floor to -80dB, and enable automatic tracking of the noise floor so it gradually changes during processing:
afftdn=nr=10:nf=-80:tn=1
  • Reduce noise by 20dB, using a noise floor of -40dB, and using commands to take the noise profile of the first 0.4 seconds of input audio:
asendcmd=0.0 afftdn sn start,asendcmd=0.4 afftdn sn stop,afftdn=nr=20:nf=-40

afftfilt โœจ

Apply arbitrary expressions to samples in frequency domain. Iconic.

  • real โ€” Set the frequency domain real expression for each separate channel, separated by '|'. Default is "re". If the number of input channels is greater than the number of expressions, the last specified expression is used for the remaining output channels.
  • imag โ€” Set the frequency domain imaginary expression for each separate channel, separated by '|'. Default is "im".

Each expression in real and imag can contain the following constants and functions:

  • sr โ€” sample rate
  • b โ€” current frequency bin number
  • nb โ€” number of available bins
  • ch โ€” channel number of the current expression
  • chs โ€” number of channels
  • pts โ€” current frame pts
  • re โ€” current real part of frequency bin of current channel
  • im โ€” current imaginary part of frequency bin of current channel
  • real(b, ch) โ€” Return the value of real part of frequency bin at location (bin,channel)
  • imag(b, ch) โ€” Return the value of imaginary part of frequency bin at location (bin,channel)
  • win_size โ€” Set window size. Allowed range is from 16 to 131072. Default is 4096.
  • win_func โ€” Set window function. Default is "hann". It accepts these values:
    • rect
    • bartlett
    • hann, hanning
    • hamming
    • blackman
    • welch
    • flattop
    • bharris
    • bnuttall
    • bhann
    • sine
    • nuttall
    • lanczos
    • gauss
    • tukey
    • dolph
    • cauchy
    • parzen
    • poisson
    • bohman
    • kaiser
  • overlap โ€” Set window overlap. If set to 1, the recommended overlap for the selected window function will be picked. Default is 0.75.

Examples ๐ŸŽ€

  • Leave almost only low frequencies in audio:
afftfilt="'real=re * (1-clip((b/nb)*b,0,1))':imag='im * (1-clip((b/nb)*b,0,1))'"
  • Apply robotize effect:
afftfilt="real='hypot(re,im)*sin(0)':imag='hypot(re,im)*cos(0)':win_size=512:overlap=0.75"
  • Apply whisper effect:
afftfilt="real='hypot(re,im)*cos((random(0)*2-1)*2*3.14)':imag='hypot(re,im)*sin((random(1)*2-1)*2*3.14)':win_size=128:overlap=0.8"
  • Apply phase shift:
afftfilt="real=re*cos(1)-im*sin(1):imag=re*sin(1)+im*cos(1)"

afir ๐Ÿ”ฅ

Apply an arbitrary Finite Impulse Response filter.

This filter is designed for applying long FIR filters, up to 60 seconds long.

It can be used as a component for digital crossover filters, room equalization, cross talk cancellation, wavefield synthesis, auralization, ambiophonics, ambisonics and spatialization.

This filter uses the streams higher than the first one as FIR coefficients. If the non-first stream holds a single channel, it will be used for all input channels in the first stream; otherwise the number of channels in the non-first stream must be the same as the number of channels in the first stream.

It accepts the following parameters:

  • dry โ€” Set dry gain. This sets input gain.
  • wet โ€” Set wet gain. This sets final output gain.
  • length โ€” Set Impulse Response filter length. Default is 1, which means the whole IR is processed.
  • gtype โ€” This option is deprecated, and does nothing.
  • irnorm โ€” Set norm to be applied to IR coefficients before filtering. Allowed range is from -1 to 2. IR coefficients are normalized with the calculated vector norm set by this option. For negative values, no norm is calculated, and IR coefficients are not modified at all. Default is 1.
  • irlink โ€” For multichannel IR, if this option is set to true, all IR channels will be normalized with the maximal measured gain of all IR channels coefficients as set by the irnorm option. When disabled, all IR coefficients in each IR channel will be normalized independently. Default is true.
  • irgain โ€” Set gain to be applied to IR coefficients before filtering. Allowed range is 0 to 1. This gain is applied after any gain applied with the irnorm option.
  • irfmt โ€” Set format of IR stream. Can be "mono" or "input". Default is "input".
  • maxir โ€” Set max allowed Impulse Response filter duration in seconds. Default is 30 seconds. Allowed range is 0.1 to 60 seconds.
  • response โ€” This option is deprecated, and does nothing.
  • channel โ€” This option is deprecated, and does nothing.
  • size โ€” This option is deprecated, and does nothing.
  • rate โ€” This option is deprecated, and does nothing.
  • minp โ€” Set minimal partition size used for convolution. Default is 8192. Allowed range is from 1 to 65536. Lower values decrease latency at the cost of higher CPU usage.
  • maxp โ€” Set maximal partition size used for convolution. Default is 8192. Allowed range is from 8 to 65536. Lower values may increase CPU usage.
  • nbirs โ€” Set number of input impulse responses streams which will be switchable at runtime. Allowed range is from 1 to 32. Default is 1.
  • ir โ€” Set IR stream which will be used for convolution, starting from 0. It should always be lower than the value supplied by the nbirs option. Default is 0. This option can be changed at runtime via commands.
  • precision โ€” Set which precision to use when processing samples. Default value is auto. It accepts these values:
    • auto โ€” Auto pick internal sample format depending on other filters.
    • float โ€” Always use single-floating point precision sample format.
    • double โ€” Always use double-floating point precision sample format.
  • irload โ€” Set when to load the IR stream. Can be "init" or "access". The first one loads and prepares all IRs on initialization; the second one loads once on first access of the specific IR. Default is "init".

Examples ๐ŸŽ€

  • Apply reverb to stream using a mono IR file as second input, complete command using ffmpeg:
ffmpeg -i input.wav -i middle_tunnel_1way_mono.wav -lavfi afir output.wav
  • Apply true stereo processing given an input stereo stream, and two stereo impulse responses for left and right channel. The impulse response files are files with names l_ir.wav and r_ir.wav, and setting the irnorm option value:
"pan=4C|c0=FL|c1=FL|c2=FR|c3=FR[a];amovie=l_ir.wav[LIR];amovie=r_ir.wav[RIR];[LIR][RIR]amerge[ir];[a][ir]afir=irfmt=input:irnorm=1.2,pan=stereo|FL<c0+c2|FR<c1+c3"
  • Similar to the above example, but with irgain explicitly set to an estimated value and with irnorm disabled:
"pan=4C|c0=FL|c1=FL|c2=FR|c3=FR[a];amovie=l_ir.wav[LIR];amovie=r_ir.wav[RIR];[LIR][RIR]amerge[ir];[a][ir]afir=irfmt=input:irgain=-5dB:irnom=-1,pan=stereo|FL<c0+c2|FR<c1+c3"

aformat ๐Ÿฆ‹

Set output format constraints for the input audio. The framework will negotiate the most appropriate format to minimize conversions.

It accepts the following parameters:

  • sample_fmts, f โ€” a '|'-separated list of requested sample formats. pick your faves ๐Ÿ’–
  • sample_rates, r โ€” a '|'-separated list of requested sample rates. rate it โœจ
  • channel_layouts, cl โ€” a '|'-separated list of requested channel layouts. layout check ๐ŸŽ€

See the Channel Layout section in the ffmpeg-utils(1) manual for the required syntax. iykyk ๐Ÿฆ‹

If a parameter is omitted, all values are allowed โ€” literally the whole menu, no limits ๐Ÿ’…

Force the output to either unsigned 8-bit or signed 16-bit stereo:

aformat=sample_fmts=u8|s16:channel_layouts=stereo

afreqshift ๐ŸŒ€โœจ

Apply frequency shift to input audio samples. it's giving frequency-shift main character energy ๐Ÿ’ซ

The filter accepts the following options:

  • shift โ€” Specify frequency shift. Allowed range is -INT_MAX to INT_MAX. Default value is 0.0. tiny nudge or full send โญ
  • level โ€” Set output gain applied to final output. Allowed range is from 0.0 to 1.0. Default value is 1.0. volume vibes ๐ŸŽš๏ธ
  • order โ€” Set filter order used for filtering. Allowed range is from 1 to 16. Default value is 8. order up ๐Ÿ“

Commands ๐Ÿ’ฌ

This filter supports all of the above options as commands. yes bestie, command-line control ๐Ÿซถ


afwtdn ๐ŸŒŠโœจ

Reduce broadband noise from input samples using Wavelets. noise cleanup era ๐Ÿงผ

A description of the accepted options follows.

  • sigma โ€” Set the noise sigma, allowed range is from 0 to 1. Default value is 0. This option controls strength of denoising applied to input samples. Most useful way to set this option is via decibels, eg. -45dB. dB girlies rise ๐Ÿ’–
  • levels โ€” Set the number of wavelet levels of decomposition. Allowed range is from 1 to 12. Default value is 10. Setting this too low make denoising performance very poor. do not skimp ๐Ÿ˜ญ
  • wavet โ€” Set wavelet type for decomposition of input frame. They are sorted by number of coefficients, from lowest to highest. More coefficients means worse filtering speed, but overall better quality. Available wavelets are:
    • sym2
    • sym4
    • rbior68
    • deb10
    • sym10
    • coif5
    • bl3
  • percent โ€” Set percent of full denoising. Allowed range is from 0 to 100 percent. Default value is 85 percent or partial denoising. partial slay โœจ
  • profile โ€” If enabled, first input frame will be used as noise profile. If first frame samples contain non-noise performance will be very poor. vibe check your first frame ๐Ÿ’€
  • adaptive โ€” If enabled, input frames are analyzed for presence of noise. If noise is detected with high possibility then input frame profile will be used for processing following frames, until new noise frame is detected. adaptive icon behavior ๐Ÿฆ‹
  • samples โ€” Set size of single frame in number of samples. Allowed range is from 512 to 65536. Default frame size is 8192 samples. frame size matters ๐ŸŽ€
  • softness โ€” Set softness applied inside thresholding function. Allowed range is from 0 to 10. Default softness is 1. soft girl filtering ๐ŸŒธ

Commands ๐Ÿ’ฌ

This filter supports all of the above options as commands. group chat approved โœ…


agate ๐Ÿšชโœจ

A gate is mainly used to reduce lower parts of a signal. This kind of signal processing reduces disturbing noise between useful signals. quiet the awkward little noises, periodt ๐Ÿ’…

Gating is done by detecting the volume below a chosen level threshold and dividing it by the factor set with ratio. The bottom of the noise floor is set via range. Because an exact manipulation of the signal would cause distortion of the waveform the reduction can be levelled over time. This is done by setting attack and release. timing is everything โณ

attack determines how long the signal has to fall below the threshold before any reduction will occur and release sets the time the signal has to rise above the threshold to reduce the reduction again. Shorter signals than the chosen attack time will be left untouched. leave the shorties alone ๐Ÿฆ‹

  • level_in โ€” Set input level before filtering. Default is 1. Allowed range is from 0.015625 to 64. input glow-up โœจ
  • mode โ€” Set the mode of operation. Can be "upward" or "downward". Default is "downward". If set to "upward" mode, higher parts of signal will be amplified, expanding dynamic range in upward direction. Otherwise, in case of "downward" lower parts of signal will be reduced. choose your direction ๐ŸŒ€
  • range โ€” Set the level of gain reduction when the signal is below the threshold. Default is 0.06125. Allowed range is from 0 to 1. Setting this to 0 disables reduction and then filter behaves like expander. zero means expander mode, no cap ๐Ÿ’€
  • threshold โ€” If a signal rises above this level the gain reduction is released. Default is 0.125. Allowed range is from 0 to 1. the line in the sand โญ
  • ratio โ€” Set a ratio by which the signal is reduced. Default is 2. Allowed range is from 1 to 9000. ratio said what it said ๐Ÿ’…
  • attack โ€” Amount of milliseconds the signal has to rise above the threshold before gain reduction stops. Default is 20 milliseconds. Allowed range is from 0.01 to 9000. fast attack energy โšก
  • release โ€” Amount of milliseconds the signal has to fall below the threshold before the reduction is increased again. Default is 250 milliseconds. Allowed range is from 0.01 to 9000. let it breathe ๐ŸŒŠ
  • makeup โ€” Set amount of amplification of signal after processing. Default is 1. Allowed range is from 1 to 64. post-processing glow ๐ŸŽ€
  • knee โ€” Curve the sharp knee around the threshold to enter gain reduction more softly. Default is 2.828427125. Allowed range is from 1 to 8. soft knee supremacy ๐ŸŒธ
  • detection โ€” Choose if exact signal should be taken for detection or an RMS like one. Default is "rms". Can be "peak" or "rms". detection vibe check ๐Ÿฆ‹
  • link โ€” Choose if the average level between all channels or the louder channel affects the reduction. Default is "average". Can be "average" or "maximum". link up ๐Ÿซถ

Commands ๐Ÿ’ฌ

This filter supports all of the above options as commands. all the knobs, live ๐ŸŽ›๏ธ


aiir ๐ŸŒˆโœจ

Apply an arbitrary Infinite Impulse Response filter. big filter energy ๐Ÿ‘‘

It accepts the following parameters:

  • zeros, z โ€” Set B/numerator/zeros/reflection coefficients. zeros bestie ๐Ÿ’ซ
  • poles, p โ€” Set A/denominator/poles/ladder coefficients. poles bestie ๐ŸŒ€
  • gains, k โ€” Set channels gains. gain check โœจ
  • dry_gain โ€” Set input gain. dry vibes ๐Ÿ’ง
  • wet_gain โ€” Set output gain. wet vibes ๐ŸŒŠ
  • format, f โ€” Set coefficients format.
    • ll โ€” lattice-ladder function
    • sf โ€” analog transfer function
    • tf โ€” digital transfer function
    • zp โ€” Z-plane zeros/poles, cartesian (default)
    • pr โ€” Z-plane zeros/poles, polar radians
    • pd โ€” Z-plane zeros/poles, polar degrees
    • sp โ€” S-plane zeros/poles
  • process, r โ€” Set type of processing.
    • d โ€” direct processing
    • s โ€” serial processing
    • p โ€” parallel processing
  • precision, e โ€” Set filtering precision.
    • dbl โ€” double-precision floating-point (default)
    • flt โ€” single-precision floating-point
    • i32 โ€” 32-bit integers
    • i16 โ€” 16-bit integers
  • normalize, n โ€” Normalize filter coefficients, by default is enabled. Enabling it will normalize magnitude response at DC to 0dB. normalized and thriving ๐ŸŽ€
  • mix โ€” How much to use filtered signal in output. Default is 1. Range is between 0 and 1. mix it up ๐Ÿ’…
  • response โ€” Show IR frequency response, magnitude(magenta), phase(green) and group delay(yellow) in additional video stream. By default it is disabled. pretty colors in a video stream ๐ŸŒˆ
  • channel โ€” Set for which IR channel to display frequency response. By default is first channel displayed. This option is used only when response is enabled. channel pick ๐Ÿ“บ
  • size โ€” Set video stream size. This option is used only when response is enabled. size matters for the video stream ๐ŸŽ€

Coefficients in tf and sf format are separated by spaces and are in ascending order. space-separated, ascending, got it โœจ

Coefficients in zp format are separated by spaces and order of coefficients doesn't matter. Coefficients in zp format are complex numbers with i imaginary unit. imaginary unit era ๐Ÿฆ‹

Different coefficients and gains can be provided for every channel, in such case use '|' to separate coefficients or gains. Last provided coefficients will be used for all remaining channels. last one wins for the rest ๐Ÿ’…

Examples ๐Ÿงช

  • Apply 2 pole elliptic notch at around 5000Hz for 48000 Hz sample rate:
aiir=k=1:z=7.957584807809675810E-1 -2.575128568908332300 3.674839853930788710 -2.57512875289799137 7.957586296317130880E-1:p=1 -2.86950072432325953 3.63022088054647218 -2.28075678147272232 6.361362326477423500E-1:f=tf:r=d
  • Same as above but in zp format:
aiir=k=0.79575848078096756:z=0.80918701+0.58773007i 0.80918701-0.58773007i 0.80884700+0.58784055i 0.80884700-0.58784055i:p=0.63892345+0.59951235i 0.63892345-0.59951235i 0.79582691+0.44198673i 0.79582691-0.44198673i:f=zp:r=s
  • Apply 3-rd order analog normalized Butterworth low-pass filter, using analog transfer function format:
aiir=z=1.3057 0 0 0:p=1.3057 2.3892 2.1860 1:f=sf:r=d

alimiter ๐Ÿ›‘โœจ

The limiter prevents an input signal from rising over a desired threshold. This limiter uses lookahead technology to prevent your signal from distorting. It means that there is a small delay after the signal is processed. Keep in mind that the delay it produces is the attack time you set. lookahead icon behavior ๐Ÿ‘€

The filter accepts the following options:

  • level_in โ€” Set input gain. Default is 1. incoming level ๐ŸŽš๏ธ
  • level_out โ€” Set output gain. Default is 1. outgoing level โœจ
  • limit โ€” Don't let signals above this level pass the limiter. Default is 1. hard no above this ๐Ÿ›‘
  • attack โ€” The limiter will reach its attenuation level in this amount of time in milliseconds. Default is 5 milliseconds. quick reflexes โšก
  • release โ€” Come back from limiting to attenuation 1.0 in this amount of milliseconds. Default is 50 milliseconds. release the limit ๐ŸŒŠ
  • asc โ€” When gain reduction is always needed ASC takes care of releasing to an average reduction level rather than reaching a reduction of 0 in the release time. average reduction, not zero ๐Ÿซถ
  • asc_level โ€” Select how much the release time is affected by ASC, 0 means nearly no changes in release time while 1 produces higher release times. ASC level up ๐ŸŒธ
  • level โ€” Auto level output signal. Default is enabled. This normalizes audio back to 0dB if enabled. auto glow-up ๐ŸŽ€
  • latency โ€” Compensate the delay introduced by using the lookahead buffer set with attack parameter. Also flush the valid audio data in the lookahead buffer when the stream hits EOF. latency compensation, bestie ๐Ÿฆ‹
Depending on picked setting it is recommended to upsample input 2x or 4x times with aresample before applying this filter. upsample first, slay after ๐Ÿ’…

allpass ๐ŸŒ€โœจ

Apply a two-pole all-pass filter with central frequency (in Hz) frequency, and filter-width width. An all-pass filter changes the audio's frequency to phase relationship without changing its frequency to amplitude relationship. phase relationship glow-up ๐Ÿ’ซ

The filter accepts the following options:

  • frequency, f โ€” Set frequency in Hz. Hz bestie ๐ŸŽš๏ธ
  • width_type, t โ€” Set method to specify band-width of filter.
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” Specify the band-width of a filter in width_type units. width in those units ๐ŸŽ€
  • mix, m โ€” How much to use filtered signal in output. Default is 1. Range is between 0 and 1. mix and match ๐Ÿ’…

okay so weโ€™re still in allpass, and the option list keeps going โ€” no repeats, just vibes and facts ๐Ÿ’…

  • channels, c โ€” tells the filter which channels to filter; by default all available channels are filtered โœจ
  • normalize, n โ€” normalizes biquad coefficients. Default is disabled. Enabling it normalizes the magnitude response at DC to 0dB ๐ŸŽ€
  • order, o โ€” sets the filter order. Can be 1 or 2. Default is 2 ๐ŸŒธ
  • transform, a โ€” sets the transform type of the IIR filter. The values are di, dii, tdi, tdii, latt, svf, zdf ๐Ÿฆ‹
  • precision, r โ€” sets the precision of filtering:
    • auto โ€” pick automatic sample format depending on surround filters.
    • s16 โ€” always use signed 16-bit.
    • s32 โ€” always use signed 32-bit.
    • f32 โ€” always use float 32-bit.
    • f64 โ€” always use float 64-bit.

Commands

This filter supports the following commands, bestie:

  • frequency, f โ€” change allpass frequency. Syntax for the command is literally "frequency" ๐Ÿ’–
  • width_type, t โ€” change allpass width_type. Syntax is "width_type" โœจ
  • width, w โ€” change allpass width. Syntax is "width" ๐ŸŽ€
  • mix, m โ€” change allpass mix. Syntax is "mix" ๐ŸŒˆ

aloop

Loop audio samples ๐Ÿ” obsessed with a good loop

The filter accepts the following options:

  • loop โ€” set the number of loops. Setting this to -1 gives you infinite loops. Default is 0 ๐Ÿ’€
  • size โ€” set maximal number of samples. Default is 0 โœจ
  • start โ€” set first sample of loop. Default is 0 ๐ŸŽ€
  • time โ€” set the time of loop start in seconds. Only used if the option named start is set to -1 ๐Ÿฆ‹

amerge

Merge two or more audio streams into a single multi-channel stream ๐ŸŒธ

All inputs must have the same sample rate, and format. If inputs do not have the same duration, the output will stop with the shortest one โ€” shortest wins, no cap.

The filter accepts the following options:

  • inputs โ€” set the number of inputs. Default is 2 ๐Ÿ’–
  • layout_mode โ€” controls how the output channel layout is determined and whether audio channels get reordered during merge:
    • legacy โ€” this is how the filter behaved historically, so itโ€™s the default. If the channel layouts of the inputs are known and disjoint, and therefore compatible, the output channel layout will be set accordingly and the channels will be reordered as necessary. If the input channel layouts are not disjoint, some of them are unknown, or theyโ€™re using special channel layouts like ambisonics, the output will have all the channels of the first input then all the channels of the second input, in that order, and the output channel layout will be the default value corresponding to the total number of channels. For example, if the first input is in 2.1 (FL+FR+LF) and the second input is FC+BL+BR, then the output will be in 5.1, with the channels in this order: a1, a2, b1, a3, b2, b3 โ€” where a1 is the first channel of the first input and b1 is the first channel of the second input ๐Ÿ‘‘ On the other hand, if both inputs are in stereo, the output channels will be in the default order a1, a2, b1, b2, and the channel layout will be arbitrarily set to 4.0, which may or may not be the expected value ๐Ÿ™ˆ
    • reset โ€” ignores the input channel layouts and does no channel reordering. The output will have all the channels of the first input, then all the channels of the second input, in that order, and so on. The output channel layout will only specify the total channel count ๐Ÿ’…
    • normal โ€” keeps channel name and designation information from the input channels and does no channel reordering. The output will have all the channels of the first input, then all the channels of the second input, in that order, and so on ๐Ÿซถ

Examples

  • Merge two mono files into a stereo stream:
amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge
  • Multiple merges assuming 1 video stream and 6 audio streams in input.mkv:
ffmpeg -i input.mkv -filter_complex "[0:1][0:2][0:3][0:4][0:5][0:6] amerge=inputs=6" -c:a pcm_s16le output.mkv

amix

Mixes multiple audio inputs into a single output ๐ŸŽงโœจ

Note that this filter only supports float samples โ€” the amerge and pan audio filters support many formats. If the amix input has integer samples, then aresample will be automatically inserted to perform the conversion to float samples ๐Ÿฆ‹

It accepts the following parameters:

  • inputs โ€” the number of inputs. If unspecified, it defaults to 2 ๐Ÿ’–
  • duration โ€” how to determine the end-of-stream:
    • longest โ€” the duration of the longest input. This is the default ๐Ÿ‘‘
    • shortest โ€” the duration of the shortest input.
    • first โ€” the duration of the first input.
  • dropout_transition โ€” the transition time, in seconds, for volume renormalization when an input stream ends. The default value is 2 seconds โญ
  • weights โ€” specify weight of each input audio stream as a sequence of numbers separated by a space. If fewer weights are specified compared to the number of inputs, the last weight is assigned to the remaining inputs. Default weight for each input is 1 ๐ŸŽ€
  • normalize โ€” always scale inputs instead of only doing summation of samples. Beware of heavy clipping if inputs are not normalized prior or after filtering by this filter when this option is disabled. By default itโ€™s enabled ๐ŸŒธ

Examples

  • This will mix 3 input audio streams to a single output with the same duration as the first input and a dropout transition time of 3 seconds:
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
  • This will mix one vocal and one music input audio stream to a single output with the same duration as the longest input. The music will have quarter the weight as the vocals, and the inputs are not normalized:
ffmpeg -i VOCALS -i MUSIC -filter_complex amix=inputs=2:duration=longest:dropout_transition=0:weights="1 0.25":normalize=0 OUTPUT

Commands

This filter supports the following commands:

  • weights โ€” syntax is same as option with same name.
  • normalize โ€” syntax is same as option with same name ๐Ÿ’…

amultiply

Multiply first audio stream with second audio stream and store the result in the output audio stream. Multiplication is done by multiplying each sample from the first stream with the sample at the same position from the second stream ๐Ÿงš

With this element-wise multiplication you can create amplitude fades and amplitude modulations โœจ

anequalizer

High-order parametric multiband equalizer for each channel ๐ŸŽš๏ธ๐Ÿ‘‘

It accepts the following parameters:

  • params โ€” this option string is in format: "cchn f=cf w=w g=g t=f | ...". Each equalizer band is separated by '|':
    • chn โ€” set channel number to which equalization will be applied. If input doesnโ€™t have that channel, the entry is ignored.
    • f โ€” set central frequency for band. If input doesnโ€™t have that frequency, the entry is ignored.
    • w โ€” set band width in Hertz.
    • g โ€” set band gain in dB.
    • t โ€” set filter type for band, optional, can be:
      • 0 โ€” Butterworth, this is default.
      • 1 โ€” Chebyshev type 1.
      • 2 โ€” Chebyshev type 2.
  • curves โ€” with this option activated, frequency response of anequalizer is displayed in video stream ๐ŸŒˆ
  • size โ€” set video stream size. Only useful if curves option is activated.
  • mgain โ€” set max gain that will be displayed. Only useful if curves option is activated. Setting this to a reasonable value makes it possible to display gain which is derived from neighbour bands which are too close to each other and thus produce higher gain when both are activated ๐Ÿ’–
  • fscale โ€” set frequency scale used to draw frequency response in video output. Can be linear or logarithmic. Default is logarithmic ๐ŸŽ€
  • colors โ€” set color for each channel curve which is going to be displayed in video stream. This is a list of color names separated by space or by '|'. Unrecognised or missing colors will be replaced by white color ๐Ÿค

Examples

  • Lower gain by 10 of central frequency 200Hz and width 100 Hz for first 2 channels using Chebyshev type 1 filter:
anequalizer=c0 f=200 w=100 g=-10 t=1|c1 f=200 w=100 g=-10 t=1

Commands

This filter supports the following commands:

  • change โ€” alter existing filter parameters. Syntax for the commands is: "fN|f=freq|w=width|g=gain". fN is existing filter number, starting from 0; if no such filter is available, an error is returned. freq sets new frequency parameter. width sets new width parameter in Hertz. gain sets new gain parameter in dB. Full filter invocation with asendcmd may look like this:
asendcmd=c='4.0 anequalizer change 0|f=200|w=50|g=1',anequalizer=...

anlmdn

Reduce broadband noise in audio samples using Non-Local Means algorithm ๐Ÿงšโœจ

Each sample is adjusted by looking for other samples with similar contexts. This context similarity is defined by comparing their surrounding patches of size p. Patches are searched in an area of r around the sample.

The filter accepts the following options:

  • strength, s โ€” set denoising strength. Allowed range is from 0.00001 to 10000. Default value is 0.00001 ๐Ÿ’œ
  • patch, p โ€” set patch radius duration. Allowed range is from 1 to 100 milliseconds. Default value is 2 milliseconds ๐ŸŒธ
  • research, r โ€” set research radius duration. Allowed range is from 2 to 300 milliseconds. Default value is 6 milliseconds ๐Ÿฆ‹
  • output, o โ€” set the output mode. It accepts the following values:
    • i โ€” pass input unchanged.
    • o โ€” pass noise filtered out.
    • n โ€” pass only noise. Default value is o ๐ŸŽ€
  • smooth, m โ€” set smooth factor. Default value is 11. Allowed range is from 1 to 1000 โœจ

Commands

This filter supports the all above options as commands ๐Ÿ’…

anlmf, anlms

Apply Normalized Least-Mean-(Squares|Fourth) algorithm to the first audio stream using the second audio stream ๐ŸŽง๐Ÿ”ฅ

This adaptive filter is used to mimic a desired filter by finding the filter coefficients that relate to producing the least mean square of the error signal โ€” the difference between the desired, 2nd input audio stream and the actual signal, the 1st input audio stream ๐Ÿ‘‘

A description of the accepted options follows.

  • order โ€” set filter order.
  • mu โ€” set filter mu.
  • eps โ€” sets the filter eps. โœจ
  • leakage โ€” sets the filter leakage. โœจ
  • out_mode โ€” which samples get to leave the party. it accepts the following values:
    • i โ€” pass the 1st input.
    • d โ€” pass the 2nd input.
    • o โ€” pass difference between desired, 2nd input and error signal estimate.
    • n โ€” pass difference between input, 1st input and error signal estimate.
    • e โ€” pass error signal estimated samples.

Default value is o. ๐Ÿ’…

  • precision โ€” which precision to use when processing samples, iykyk. options are:
    • auto โ€” auto pick internal sample format depending on other filters.
    • float โ€” always use single-floating point precision sample format.
    • double โ€” always use double-floating point precision sample format.

๐ŸŽ€ Examples

  • one of many usages of this filter is noise reduction โ€” input audio gets filtered with the same samples delayed by a fixed amount. a stereo example, bestie:
asplit[a][b],[a]adelay=32S|32S[a],[b][a]anlms=order=128:leakage=0.0005:mu=.5:out_mode=o

๐Ÿซถ Commands

this filter supports the same commands as options, excluding option order. that one's off the table, no cap.


๐ŸŒธ anull

passes the audio source through to the output completely unchanged. literally zero notes, zero drama, just vibes in and vibes out. ๐Ÿฆ‹

๐ŸŒธ apad

pads the end of an audio stream with silence. ๐Ÿ’ค

this can be used together with ffmpeg -shortest to extend audio streams to the same length as the video stream. your audio is not long enough? not anymore.

a description of the accepted options follows.

  • packet_size โ€” sets the silence packet size. default value is 4096.
  • pad_len โ€” sets the number of samples of silence to add to the end. after that value is reached, the stream is terminated. this option is mutually exclusive with whole_len.
  • whole_len โ€” sets the minimum total number of samples in the output audio stream. if the value is longer than the input audio length, silence gets added to the end until the value is reached. this option is mutually exclusive with pad_len.
  • pad_dur โ€” specifies the duration of samples of silence to add. see the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. used only if set to a non-negative value.
  • whole_dur โ€” specifies the minimum total duration in the output audio stream. see the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. used only if set to a non-negative value. if the value is longer than the input audio length, silence gets added to the end until the value is reached. this option is mutually exclusive with pad_dur.
okay important one ๐Ÿ‘‘ โ€” if neither the pad_len nor the whole_len nor pad_dur nor whole_dur option is set, the filter will add silence to the end of the input stream indefinitely. like, forever forever. ๐Ÿ˜ญ
ngl also note that for ffmpeg 4.4 and earlier, a zero pad_dur or whole_dur also caused the filter to add silence indefinitely. legacy icon behavior, we don't stan.

๐ŸŽ€ Examples

  • add 1024 samples of silence to the end of the input:
apad=pad_len=1024
  • make sure the audio output will contain at least 10000 samples, padding the input with silence if required:
apad=whole_len=10000
  • use ffmpeg to pad the audio input with silence, so that the video stream will always result the shortest and will be converted until the end in the output file when using the shortest option:
ffmpeg -i VIDEO -i AUDIO -filter_complex "[1:0]apad" -shortest OUTPUT

๐ŸŒธ aphaser

adds a phasing effect to the input audio. ๐ŸŒ€

a phaser filter creates series of peaks and troughs in the frequency spectrum. the position of the peaks and troughs gets modulated so they vary over time โ€” creating a sweeping effect. it's giving โœจmovementโœจ.

a description of the accepted parameters follows.

  • in_gain โ€” sets input gain. default is 0.4.
  • out_gain โ€” sets output gain. default is 0.74
  • delay โ€” sets delay in milliseconds. default is 3.0.
  • decay โ€” sets decay. default is 0.4.
  • speed โ€” sets modulation speed in Hz. default is 0.5.
  • type โ€” sets modulation type. default is triangular. it accepts the following values:
    • triangular, t
    • sinusoidal, s

๐ŸŒธ aphaseshift

applies phase shift to input audio samples. ๐Ÿ’ซ

the filter accepts the following options:

  • shift โ€” specifies the phase shift. allowed range is from -1.0 to 1.0. default value is 0.0.
  • level โ€” sets the output gain applied to the final output. allowed range is from 0.0 to 1.0. default value is 1.0.
  • order โ€” sets the filter order used for filtering. allowed range is from 1 to 16. default value is 8.

๐Ÿซถ Commands

this filter supports all the above options as commands. periodt.

๐ŸŒธ apsnr

measures Audio Peak Signal-to-Noise Ratio. ๐Ÿ“Š

this filter takes two audio streams for input, and outputs the first audio stream. results are in dB per channel at the end of either input. science, but make it cute. ๐Ÿงš

๐ŸŒธ apsyclip

applies a Psychoacoustic clipper to the input audio stream. ๐Ÿ”ฅ

the filter accepts the following options:

  • level_in โ€” sets input gain. by default it is 1. range is [0.015625 - 64].
  • level_out โ€” sets output gain. by default it is 1. range is [0.015625 - 64].
  • clip โ€” sets the clipping start value. default value is 0dBFS or 1.
  • diff โ€” output only difference samples, useful to hear introduced distortions. by default it's disabled.
  • adaptive โ€” sets the strength of the adaptive distortion applied. default value is 0.5. allowed range is from 0 to 1.
  • iterations โ€” sets the number of iterations of the psychoacoustic clipper. allowed range is from 1 to 20. default value is 10.
  • level โ€” auto level the output signal. default is disabled. this normalizes audio back to 0dBFS if enabled.

๐Ÿซถ Commands

this filter supports all the above options as commands. slay.

๐ŸŒธ apulsator

audio pulsator is something between an autopanner and a tremolo. but it can produce funny stereo effects as well. ๐Ÿ‘‘

pulsator changes the volume of the left and right channel based on a LFO (low frequency oscillator) with different waveforms and shifted phases. this filter has the ability to define an offset between left and right channel.

  • an offset of 0 means both LFO shapes match each other โ€” the left and right channel get altered equally, so it's a conventional tremolo.
  • an offset of 50% means the shape of the right channel is exactly shifted in phase (or moved backwards about half of the frequency) โ€” pulsator acts as an autopanner.
  • at 1 both curves match again.

every setting in between moves the phase shift gapless between all stages and produces some "bypassing" sounds with sine and triangle waveforms. the more you set the offset near 1 (starting from the 0.5) the faster the signal passes from the left to the right speaker. it's giving ping-pong main character energy. ๐Ÿ“

the filter accepts the following options:

  • level_in โ€” sets input gain. by default it is 1. range is [0.015625 - 64].
  • level_out โ€” sets output gain. by default it is 1. range is [0.015625 - 64].
  • mode โ€” sets the waveform shape the LFO will use. can be one of: sine, triangle, square, sawup or sawdown. default is sine.
  • amount โ€” sets modulation. defines how much of the original signal is affected by the LFO.
  • offset_l โ€” sets the left channel offset. default is 0. allowed range is [0 - 1].
  • offset_r โ€” sets the right channel offset. default is 0.5. allowed range is [0 - 1].
  • width โ€” sets pulse width. default is 1. allowed range is [0 - 2].
  • timing โ€” sets possible timing mode. can be one of: bpm, ms or hz. default is hz.
  • bpm โ€” sets bpm. default is 120. allowed range is [30 - 300]. only used if timing is set to bpm.
  • ms โ€” sets ms. default is 500. allowed range is [10 - 2000]. only used if timing is set to ms.
  • hz โ€” sets frequency in Hz. default is 2. allowed range is [0.01 - 100]. only used if timing is set to hz.

๐ŸŒธ aresample

resamples the input audio to the specified parameters, using the libswresample library. if none are specified then the filter will automatically convert between its input and output. ๐Ÿ”„

this filter is also able to stretch/squeeze the audio data to make it match the timestamps, or to inject silence / cut out audio to make it match the timestamps, do a combination of both, or do neither. iconic versatility tbh. ๐Ÿ’…

the filter accepts the syntax [sample_rate:]resampler_options, where sample_rate expresses a sample rate and resampler_options is a list of key=value pairs, separated by :. see the "Resampler Options" section in the ffmpeg-resampler(1) manual for the complete list of supported options. iykyk, go read that one too. ๐Ÿซถ

๐ŸŽ€ Examples

  • resample the input audio to 44100Hz:
aresample=44100
  • stretch/squeeze samples to the given timestamps, with a maximum of 1000 samples per second compensation:
aresample=async=1000

๐ŸŒธ areverse

reverses an audio clip. โช

warning: this filter requires memory to buffer the entire clip, so trimming is suggested. don't just throw a two hour podcast at it, bestie. ๐Ÿ˜ญ

๐ŸŽ€ Examples

  • take the first 5 seconds of a clip, and reverse it:
atrim=end=5,areverse

๐ŸŒธ arls

applies the Recursive Least Squares algorithm to the first audio stream using the second audio stream. ๐Ÿ“

this adaptive filter is used to mimic a desired filter by recursively finding the filter coefficients that relate to producing the minimal weighted linear least squares cost function of the error signal โ€” that's the difference between the desired signal (the 2nd input audio stream) and the actual signal (the 1st input audio stream). math girlies rise. ๐Ÿงฎโœจ

a description of the accepted options follows.

  • order โ€” sets the filter order.
  • lambda โ€” sets the forgetting factor.
  • delta โ€” sets the coefficient to initialize the internal covariance matrix.
  • out_mode โ€” sets the filter output samples. it accepts the following values:
    • i โ€” pass the 1st input.
    • d โ€” pass the 2nd input.
    • o โ€” pass difference between desired, 2nd input and error signal estimate.
    • n โ€” pass difference between input, 1st input and error signal estimate.
    • e โ€” pass error signal estimated samples.

Default value is o. ๐Ÿ’–

  • precision โ€” sets which precision to use when processing samples:
    • auto โ€” auto pick internal sample format depending on other filters.
    • float โ€” always use single-floating point precision sample format.
    • double โ€” always use double-floating point precision sample format.

๐ŸŒธ arnndn

reduces noise from speech using Recurrent Neural Networks. ๐Ÿง โœจ speech-only glow-up, and honestly it ate.

this filter accepts the following options:

  • model, m โ€” sets the train model file to load. this option is always required. no model, no filter, no exceptions. ๐Ÿ™ˆ

okay so, picking right back up with this filterโ€™s mix option: ๐Ÿ’…

  • mix โ€” sets how much filtered samples get mixed into the final output, bestie. Allowed range is from -1 to 1. Default value is 1. Negative values are special: they set how much filtered noise stays in the final filter output. Set this option to -1 to hear the actual noise removed from the input signal. iconic little chaos knob, honestly โœจ

๐Ÿ’ฌ Commands ๐Ÿ’ฌ

This filter supports the all above options as commands. periodt. ๐Ÿซถ


๐ŸŒธ asdr ๐ŸŒธ

Measures Audio Signal-to-Distortion Ratio. It takes two audio streams for input, and outputs the first audio stream. Results are in dB per channel at end of either input. ๐Ÿ’–


โœจ asetnsamples โœจ

Sets the number of samples per each output audio frame. The last output packet may contain a different number of samples, because the filter will flush all the remaining samples when the input audio signals its end. ๐Ÿซถ

It accepts the following options:

  • nb_out_samples, n โ€” sets the number of frames per each output audio frame. The number is intended as the number of samples per each channel. Default value is 1024.
  • pad, p โ€” if set to 1, the filter will pad the last audio frame with zeroes, so that the last frame will contain the same number of samples as the previous ones. Default value is 1.

For example, to set the number of per-frame samples to 1234 and disable padding for the last frame, use:

asetnsamples=n=1234:p=0

๐ŸŽš๏ธ asetrate ๐ŸŽš๏ธ

Sets the sample rate without altering the PCM data. This will result in a change of speed and pitch. yes, both. together. itโ€™s giving remix ๐Ÿ’…

It accepts the following options:

  • sample_rate, r โ€” sets the output sample rate. Default is 44100 Hz.

๐Ÿ” ashowinfo ๐Ÿ”

Shows a line containing various information for each input audio frame. The input audio is not modified. The shown line contains a sequence of key/value pairs of the form key:value. Hereโ€™s what shows up in the output: ๐Ÿซถ

  • n โ€” the (sequential) number of the input frame, starting from 0.
  • pts โ€” the presentation timestamp of the input frame, in time base units; the time base depends on the filter input pad, and is usually 1/sample_rate.
  • pts_time โ€” the presentation timestamp of the input frame in seconds.
  • fmt โ€” the sample format.
  • chlayout โ€” the channel layout.
  • rate โ€” the sample rate for the audio frame.
  • nb_samples โ€” the number of samples (per channel) in the frame.
  • checksum โ€” the Adler-32 checksum (printed in hexadecimal) of the audio data. For planar audio, the data is treated as if all the planes were concatenated.
  • plane_checksums โ€” a list of Adler-32 checksums for each data plane.

๐Ÿฆ‹ asisdr ๐Ÿฆ‹

Measures Audio Scaled-Invariant Signal-to-Distortion Ratio. It takes two audio streams for input, and outputs the first audio stream. Results are in dB per channel at end of either input. ๐Ÿ’œ


๐ŸŽ›๏ธ asoftclip ๐ŸŽ›๏ธ

Applies audio soft clipping. Soft clipping is a type of distortion effect where the amplitude of a signal is saturated along a smooth curve, rather than the abrupt shape of hard-clipping. smooth little saturation moment โœจ

It accepts the following options:

  • type โ€” sets the type of soft-clipping. It accepts the following values: hard, tanh, atan, cubic, exp, alg, quintic, sin, erf.
  • threshold โ€” sets the threshold from where to start clipping. Default value is 0dB or 1.
  • output โ€” sets the gain applied to output. Default value is 0dB or 1.
  • param โ€” sets an additional parameter which controls the sigmoid function.
  • oversample โ€” sets the oversampling factor.

๐Ÿ’ฌ Commands ๐Ÿ’ฌ

This filter supports the all above options as commands. ๐Ÿ’…


๐ŸŒˆ aspectralstats ๐ŸŒˆ

Displays frequency domain statistical information about the audio channels. Statistics are calculated and stored as metadata for each audio channel and for each audio frame. metadata girlie behavior ๐Ÿซถ

It accepts the following option:

  • win_size โ€” sets the window length in samples. Default value is 2048. Allowed range is from 32 to 65536.
  • win_func โ€” sets the window function. It accepts the following values: rect, bartlett, hann, hanning, hamming, blackman, welch, flattop, bharris, bnuttall, bhann, sine, nuttall, lanczos, gauss, tukey, dolph, cauchy, parzen, poisson, bohman, kaiser. Default is hann.
  • overlap โ€” sets window overlap. Allowed range is from 0 to 1. Default value is 0.5.
  • measure โ€” selects the parameters which are measured. The metadata keys can be used as flags, default is all which measures everything. none disables all measurement.

A list of each metadata key follows:

  • mean
  • variance
  • centroid
  • spread
  • skewness
  • kurtosis
  • entropy
  • flatness
  • crest
  • flux
  • slope
  • decrease
  • rolloff

๐ŸŽค asr ๐ŸŽค

Automatic Speech Recognition. This filter uses PocketSphinx for speech recognition. To enable compilation of this filter, you need to configure FFmpeg with --enable-pocketsphinx. ๐Ÿซถ

It accepts the following options:

  • rate โ€” sets sampling rate of input audio. Defaults is 16000. This need to match speech models, otherwise one will get poor results.
  • hmm โ€” sets dictionary containing acoustic model files.
  • dict โ€” sets pronunciation dictionary.
  • lm โ€” sets language model file.
  • lmctl โ€” sets language model set.
  • lmname โ€” sets which language model to use.
  • logfn โ€” sets output for log messages.

The filter exports recognized speech as the frame metadata "lavfi.asr.text". โœจ


๐Ÿ“Š astats ๐Ÿ“Š

Displays time domain statistical information about the audio channels. Statistics are calculated and displayed for each audio channel and, where applicable, an overall figure is also given. numbers numbers numbers, we love a data moment ๐Ÿ’š

It accepts the following options:

  • length โ€” short window length in seconds, used for peak and through RMS measurement. Default is 0.05 (50 milliseconds). Allowed range is [0 - 10].
  • metadata โ€” sets metadata injection. All the metadata keys are prefixed with lavfi.astats.X, where X is channel number starting from 1 or string Overall. Default is disabled.

Available keys for each channel are: Bit_depth, Crest_factor, DC_offset, Dynamic_range, Entropy, Flat_factor, Max_difference, Max_level, Mean_difference, Min_difference, Min_level, Noise_floor, Noise_floor_count, Number_of_Infs, Number_of_NaNs, Number_of_denormals, Peak_count, Abs_Peak_count, Peak_level, RMS_difference, RMS_peak, RMS_trough, Zero_crossings, Zero_crossings_rate.

and for Overall: Bit_depth, DC_offset, Entropy, Flat_factor, Max_difference, Max_level, Mean_difference, Min_difference, Min_level, Noise_floor, Noise_floor_count, Number_of_Infs, Number_of_NaNs, Number_of_denormals, Number_of_samples, Peak_count, Abs_Peak_count, Peak_level, RMS_difference, RMS_level, RMS_peak, RMS_trough.

For example, a full key looks like lavfi.astats.1.DC_offset or lavfi.astats.Overall.Peak_count.

Read below for the description of the keys. ๐Ÿ‘€

  • reset โ€” sets the number of frames over which cumulative stats are calculated before being reset. Default is disabled.
  • measure_perchannel โ€” selects the parameters which are measured per channel. The metadata keys can be used as flags, default is all which measures everything. none disables all per channel measurement.
  • measure_overall โ€” selects the parameters which are measured overall. The metadata keys can be used as flags, default is all which measures everything. none disables all overall measurement.

A description of the measure keys follow:

  • none โ€” no measures.
  • all โ€” all measures.
  • Bit_depth โ€” overall bit depth of audio, i.e. number of bits used for each sample.
  • Crest_factor โ€” standard ratio of peak to RMS level (note: not in dB).
  • DC_offset โ€” mean amplitude displacement from zero.
  • Dynamic_range โ€” measured dynamic range of audio in dB.
  • Entropy โ€” entropy measured across whole audio, entropy of value near 1.0 is typically measured for white noise.
  • Flat_factor โ€” flatness (i.e. consecutive samples with the same value) of the signal at its peak levels (i.e. either Min_level or Max_level).
  • Max_difference โ€” maximal difference between two consecutive samples.
  • Max_level โ€” maximal sample level.
  • Mean_difference โ€” mean difference between two consecutive samples, i.e. the average of each difference between two consecutive samples.
  • Min_difference โ€” minimal difference between two consecutive samples.
  • Min_level โ€” minimal sample level.
  • Noise_floor โ€” minimum local peak measured in dBFS over a short window.
  • Noise_floor_count โ€” number of occasions (not the number of samples) that the signal attained Noise floor.
  • Number_of_Infs โ€” number of samples with an infinite value.
  • Number_of_NaNs โ€” number of samples with a NaN (not a number) value.
  • Number_of_denormals โ€” number of samples with a subnormal value.
  • Number_of_samples โ€” number of samples.
  • Peak_count โ€” number of occasions (not the number of samples) that the signal attained either Min_level or Max_level.
  • Abs_Peak_count โ€” number of occasions that the absolute samples taken from the signal attained max absolute value of Min_level and Max_level.
  • Peak_level โ€” standard peak level measured in dBFS.
  • RMS_difference โ€” Root Mean Square difference between two consecutive samples.
  • RMS_level โ€” standard RMS level measured in dBFS.
  • RMS_peak, RMS_trough โ€” peak and through values for RMS level measured over a short window, measured in dBFS.
  • Zero crossings โ€” number of points where the waveform crosses the zero level axis.
  • Zero crossings rate โ€” rate of Zero crossings and number of audio samples.

๐Ÿ”Š asubboost ๐Ÿ”Š

Boosts subwoofer frequencies. low-end main character energy ๐Ÿ’…

The filter accepts the following options:

  • dry โ€” sets dry gain, how much of original signal is kept. Allowed range is from 0 to 1. Default value is 1.0.
  • wet โ€” sets wet gain, how much of filtered signal is kept. Allowed range is from 0 to 1. Default value is 1.0.
  • boost โ€” sets max boost factor. Allowed range is from 1 to 12. Default value is 2.
  • decay โ€” sets delay line decay gain value. Allowed range is from 0 to 1. Default value is 0.0.
  • feedback โ€” sets delay line feedback gain value. Allowed range is from 0 to 1. Default value is 0.9.
  • cutoff โ€” sets cutoff frequency in Hertz. Allowed range is from 50 to 900. Default value is 100.
  • slope โ€” sets the slope amount for the cutoff frequency, bestie. Allowed range is 0.0001 to 1, and it defaults to 0.5. ๐Ÿ’ซ
  • delay โ€” sets the delay. Allowed range is 1 to 100, default 20. โณ
  • channels โ€” picks which channels get processed. Default is all available ones, no gatekeeping. ๐ŸŽง

Commands ๐ŸŽ€

This filter supports the all above options as commands. yes, all of them โ€” go live-edit your heart out, icon. โœจ


asubcut ๐ŸŒŠ

Cut subwoofer frequencies. it's literally giving "begone, bass".

This filter lets you set a custom, steeper roll off than the highpass filter, and thus is able to more attenuate frequency content in the stop-band. steeper = more ruthless, and honestly? slay. ๐Ÿ’…

The filter accepts the following options:

  • cutoff โ€” set the cutoff frequency in Hertz. Allowed range is 2 to 200. Default value is 20. ๐Ÿ”ฅ
  • order โ€” set the filter order. Available values are from 3 to 20. Default value is 10.
  • level โ€” set the input gain level. Allowed range is from 0 to 1. Default value is 1.

Commands ๐ŸŽ€

This filter supports the all above options as commands. ๐Ÿซถ


asupercut ๐ŸŒˆ

Cut super frequencies โ€” the high-high-high end, like, the frequencies only your dog and your airpods know about. ๐Ÿถ

The filter accepts the following options:

  • cutoff โ€” set the cutoff frequency in Hertz. Allowed range is 20000 to 192000. Default value is 20000. โญ
  • order โ€” set the filter order. Available values are from 3 to 20. Default value is 10.
  • level โ€” set the input gain level. Allowed range is from 0 to 1. Default value is 1.

Commands ๐ŸŽ€

This filter supports the all above options as commands. ๐Ÿ’–


asuperpass ๐Ÿฆ‹

Apply a high order Butterworth band-pass filter. only the chosen frequencies get to be main character, everyone else is background noise. ๐Ÿ‘‘

The filter accepts the following options:

  • centerf โ€” set the center frequency in Hertz. Allowed range is 2 to 999999. Default value is 1000. ๐ŸŽฏ
  • order โ€” set the filter order. Available values are from 4 to 20. Default value is 4.
  • qfactor โ€” set the Q-factor. Allowed range is from 0.01 to 100. Default value is 1.
  • level โ€” set the input gain level. Allowed range is from 0 to 2. Default value is 1.

Commands ๐ŸŽ€

This filter supports the all above options as commands. โœจ


asuperstop ๐Ÿšซ

Apply a high order Butterworth band-stop filter. this one's the not you filter โ€” that band is getting blocked, respectfully. ๐Ÿ’€

The filter accepts the following options:

  • centerf โ€” set the center frequency in Hertz. Allowed range is 2 to 999999. Default value is 1000. ๐ŸŽฏ
  • order โ€” set the filter order. Available values are from 4 to 20. Default value is 4.
  • qfactor โ€” set the Q-factor. Allowed range is from 0.01 to 100. Default value is 1.
  • level โ€” set the input gain level. Allowed range is from 0 to 2. Default value is 1.

Commands ๐ŸŽ€

This filter supports the all above options as commands. ๐ŸŒธ


atempo ๐Ÿƒโ€โ™€๏ธ

Adjust audio tempo. it's the speed-up / slow-down girlie.

The filter accepts exactly one parameter, the audio tempo. If it's not specified then the filter will assume nominal 1.0 tempo. Tempo must be in the [0.5, 100.0] range. no cap, that's the whole range. ๐Ÿ“

okay so real talk: tempo greater than 2 will skip some samples rather than blend them in. if for any reason this is a concern it is always possible to daisy-chain several instances of atempo to achieve the desired product tempo. multiple girlies sharing the workload, periodt. ๐Ÿ’…

Examples โœจ

  • Slow down audio to 80% tempo:
atempo=0.8
  • To speed up audio to 300% tempo:
atempo=3
  • To speed up audio to 300% tempo by daisy-chaining two atempo instances:
atempo=sqrt(3),atempo=sqrt(3)

Commands ๐ŸŽ€

This filter supports the following commands:

  • tempo โ€” change filter tempo scale factor. syntax for the command is: "tempo" ๐ŸŽš๏ธ

atilt ๐ŸŽข

Apply spectral tilt filter to audio stream. it literally applies any spectral roll-off slope over any specified frequency band โ€” a whole glow-up for your spectrum, iykyk. ๐Ÿ’œ

The filter accepts the following options:

  • freq โ€” set central frequency of tilt in Hz. Default is 10000 Hz. ๐Ÿ“ป
  • slope โ€” set slope direction of tilt. Default is 0. Allowed range is from -1 to 1. โ†˜๏ธ
  • width โ€” set width of tilt. Default is 1000. Allowed range is from 100 to 10000.
  • order โ€” set order of tilt filter.
  • level โ€” set input volume level. Allowed range is from 0 to 4. Default is 1. ๐Ÿ”Š

Commands ๐ŸŽ€

This filter supports the all above options as commands. โญ


atrim โœ‚๏ธ

Trim the input so that the output contains one continuous subpart of the input. it's giving "crop but make it audio".

It accepts the following parameters:

  • start โ€” timestamp (in seconds) of the start of the section to keep. i.e. the audio sample with the timestamp start will be the first sample in the output. ๐ŸŸข
  • end โ€” specify time of the first audio sample that will be dropped, i.e. the audio sample immediately preceding the one with the timestamp end will be the last sample in the output. ๐Ÿ”ด
  • start_pts โ€” same as start, except this option sets the start timestamp in samples instead of seconds.
  • end_pts โ€” same as end, except this option sets the end timestamp in samples instead of seconds.
  • duration โ€” the maximum duration of the output in seconds. โฑ๏ธ
  • start_sample โ€” the number of the first sample that should be output.
  • end_sample โ€” the number of the first sample that should be dropped.

start, end, and duration are expressed as time duration specifications; see the Time duration section in the ffmpeg-utils(1) manual. ๐Ÿ“–

ngl this next bit matters: the first two sets of the start/end options and the duration option look at the frame timestamp, while the _sample options simply count the samples that pass through the filter. so start/end_pts and start/end_sample will give different results when the timestamps are wrong, inexact or do not start at zero. also note that this filter does not modify the timestamps. if you wish to have the output timestamps start at zero, insert the asetpts filter after the atrim filter. ๐Ÿ˜ญ

If multiple start or end options are set, this filter tries to be greedy and keep all samples that match at least one of the specified constraints. to keep only the part that matches all the constraints at once, chain multiple atrim filters. greedy icon behavior fr fr. ๐Ÿ“

The defaults are such that all the input is kept. so it is possible to set e.g. just the end values to keep everything before the specified time. ๐Ÿซถ

Examples โœจ

  • Drop everything except the second minute of input:
ffmpeg -i INPUT -af atrim=60:120
  • Keep only the first 1000 samples:
ffmpeg -i INPUT -af atrim=end_sample=1000

axcorrelate ๐Ÿงš

Calculate normalized windowed cross-correlation between two input audio streams. it's the "are y'all actually matching vibes" filter. ๐Ÿ’ž

Resulted samples are always between -1 and 1 inclusive. If result is 1 it means two input samples are highly correlated in that selected segment. result 0 means they are not correlated at all. if result is -1 it means two input samples are out of phase, which means they cancel each other. literally the "we're not compatible" result. ๐Ÿ’€

The filter accepts the following options:

  • size โ€” set size of segment over which cross-correlation is calculated. Default is 256. Allowed range is from 2 to 131072. ๐Ÿ“
  • algo โ€” set algorithm for cross-correlation. can be "slow" or "fast" or "best". Default is "best". the fast algorithm assumes mean values over any given segment are always zero and thus need much less calculations to make. this is generally not true, but is valid for typical audio streams. โšก

Examples โœจ

  • Calculate correlation between channels in stereo audio stream:
ffmpeg -i stereo.wav -af channelsplit,axcorrelate=size=1024:algo=fast correlation.wav

bandpass ๐ŸŽ€

Apply a two-pole Butterworth band-pass filter with central frequency frequency, and (3dB-point) band-width width. The csg option selects a constant skirt gain (peak gain = Q) instead of the default: constant 0dB peak gain. the filter roll off at 6dB per octave (20dB per decade). math ate, honestly. ๐Ÿ”ฅ

The filter accepts the following options:

  • frequency, f โ€” set the filter's central frequency. Default is 3000. ๐ŸŽฏ
  • csg โ€” constant skirt gain if set to 1. Defaults to 0.
  • width_type, t โ€” set method to specify band-width of filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” specify the band-width of a filter in width_type units. ๐Ÿ“
  • mix, m โ€” how much to use filtered signal in output. Default is 1. range is between 0 and 1. ๐ŸŽ›๏ธ
  • channels, c โ€” specify which channels to filter, by default all available are filtered. ๐ŸŽง
  • normalize, n โ€” normalize biquad coefficients, by default is disabled. enabling it will normalize magnitude response at DC to 0dB. โš–๏ธ
  • transform, a โ€” set transform type of IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” set precision of filtering:
    • auto โ€” pick automatic sample format depending on surround filters.
    • s16 โ€” always use signed 16-bit.
    • s32 โ€” always use signed 32-bit.
    • f32 โ€” always use float 32-bit.
    • f64 โ€” always use float 64-bit.
  • block_size, b โ€” set block size used for reverse IIR processing. if this value is set to high enough value (higher than impulse response length truncated when reaches near zero values) filtering will become linear phase, otherwise if not big enough it will just produce nasty artifacts. ๐Ÿ˜ญ
heads up bestie: note that filter delay will be exactly this many samples when set to non-zero value. โš ๏ธ

Commands ๐ŸŽ€

This filter supports the following commands:

  • frequency, f โ€” change bandpass frequency. syntax for the command is: "frequency" ๐ŸŽš๏ธ
  • width_type, t โ€” change bandpass width_type. syntax for the command is: "width_type"
  • width, w โ€” change bandpass width. syntax for the command is: "width"
  • mix, m โ€” change bandpass mix. syntax for the command is: "mix"

bandreject ๐Ÿšซ

Apply a two-pole Butterworth band-reject filter with central frequency frequency, and (3dB-point) band-width width. the filter roll off at 6dB per octave (20dB per decade). it's the inverse girlie of bandpass โ€” not you, that band, blocked. ๐Ÿ’…

The filter accepts the following options:

  • frequency, f โ€” set the filter's central frequency. Default is 3000. ๐ŸŽฏ
  • width_type, t โ€” set method to specify band-width of filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” specify the band-width of a filter in width_type units. ๐Ÿ“
  • mix, m โ€” how much to use filtered signal in output. Default is 1. range is between 0 and 1. ๐ŸŽ›๏ธ
  • channels, c โ€” specify which channels to filter, by default all available are filtered. ๐ŸŽง
  • normalize, n โ€” normalize biquad coefficients, by default is disabled. enabling it will normalize magnitude response at DC to 0dB. โš–๏ธ
  • transform, a โ€” set transform type of IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” set precision of filtering.
  • auto โ€” picks the automatic sample format, depending on the surround filters ๐Ÿ’ซ
  • s16 โ€” always use signed 16-bit
  • s32 โ€” always use signed 32-bit
  • f32 โ€” always use float 32-bit
  • f64 โ€” always use float 64-bit
  • block_size, b โ€” sets the block size used for reverse IIR processing. Okay so listen: if you set this high enough (higher than the impulse response length truncated when it reaches near-zero values), the filtering goes linear phase โœจ. If it's not big enough, it just makes nasty artifacts ๐Ÿ˜ญ no cap. Also note: the filter delay will be exactly this many samples when you set it to a non-zero value. Remember that.

Commands

This filter supports the following commands, bestie:

  • frequency, f โ€” change bandreject frequency. Syntax for the command is: "frequency"
  • width_type, t โ€” change bandreject width_type. Syntax for the command is: "width_type"
  • width, w โ€” change bandreject width. Syntax for the command is: "width"
  • mix, m โ€” change bandreject mix. Syntax for the command is: "mix"

bass, lowshelf

Boosts or cuts the bass (lower) frequencies of the audio, using a two-pole shelving filter with a response similar to that of a standard hi-fi's tone-controls ๐ŸŽš๏ธ. This is also known as shelving equalisation (EQ). Iconic behaviour, honestly.

The filter accepts the following options:

  • gain, g โ€” gives the gain at 0 Hz. Its useful range is about -20 (for a large cut) to +20 (for a large boost). Beware of clipping when using a positive gain ๐Ÿšจ (that's a real warning, not me being dramatic. okay maybe a little dramatic.)
  • frequency, f โ€” sets the filter's central frequency, so you can extend or reduce the frequency range to be boosted or cut. The default value is 100 Hz.
  • width_type, t โ€” sets the method used to specify the band-width of the filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” determines how steep the filter's shelf transition is.
  • poles, p โ€” sets the number of poles. Default is 2.
  • mix, m โ€” how much of the filtered signal to use in the output. Default is 1. Range is between 0 and 1.
  • channels, c โ€” specify which channels to filter. By default, all available channels are filtered ๐Ÿ’…
  • normalize, n โ€” normalize the biquad coefficients. By default this is disabled. Enabling it will normalize the magnitude response at DC to 0dB.
  • transform, a โ€” sets the transform type of the IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” sets the precision of filtering:
    • auto โ€” picks the automatic sample format, depending on the surround filters
    • s16 โ€” always use signed 16-bit
    • s32 โ€” always use signed 32-bit
    • f32 โ€” always use float 32-bit
    • f64 โ€” always use float 64-bit
  • block_size, b โ€” sets the block size used for reverse IIR processing. If this value is set high enough (higher than the impulse response length truncated when it reaches near-zero values), the filtering will become linear phase. Otherwise, if it's not big enough, it will just produce nasty artifacts ๐Ÿ˜ฌ. Note that the filter delay will be exactly this many samples when set to a non-zero value.

Commands

This filter supports the following commands:

  • frequency, f โ€” change bass frequency. Syntax for the command is: "frequency"
  • width_type, t โ€” change bass width_type. Syntax for the command is: "width_type"
  • width, w โ€” change bass width. Syntax for the command is: "width"
  • gain, g โ€” change bass gain. Syntax for the command is: "gain"
  • mix, m โ€” change bass mix. Syntax for the command is: "mix"

biquad

Applies a biquad IIR filter with the given coefficients ๐Ÿงฎ. Where b0, b1, b2 and a0, a1, a2 are the numerator and denominator coefficients respectively. And channels, c specify which channels to filter โ€” by default, all available are filtered.

Commands

This filter supports the following commands:

  • a0
  • a1
  • a2
  • b0
  • b1
  • b2

โ€” change a biquad parameter. Syntax for the command is: "value"

  • mix, m โ€” how much of the filtered signal to use in the output. Default is 1. Range is between 0 and 1.
  • channels, c โ€” specify which channels to filter. By default, all available channels are filtered.
  • normalize, n โ€” normalize the biquad coefficients. By default this is disabled. Enabling it will normalize the magnitude response at DC to 0dB.
  • transform, a โ€” sets the transform type of the IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” sets the precision of filtering:
    • auto โ€” picks the automatic sample format, depending on the surround filters
    • s16 โ€” always use signed 16-bit
    • s32 โ€” always use signed 32-bit
    • f32 โ€” always use float 32-bit
    • f64 โ€” always use float 64-bit
  • block_size, b โ€” sets the block size used for reverse IIR processing. If this value is set high enough (higher than the impulse response length truncated when it reaches near-zero values), the filtering becomes linear phase. Otherwise, if it isn't big enough, it will just produce nasty artifacts. Note that the filter delay will be exactly this many samples when set to a non-zero value.

bs2b

Bauer stereo to binaural transformation, which improves headphone listening of stereo audio records ๐ŸŽงโœจ. It's giving "suddenly you're in the room with the band".

To enable compilation of this filter you need to configure FFmpeg with --enable-libbs2b.

It accepts the following parameters:

  • profile โ€” pre-defined crossfeed level:
    • default โ€” default level (fcut=700, feed=50)
    • cmoy โ€” Chu Moy circuit (fcut=700, feed=60)
    • jmeier โ€” Jan Meier circuit (fcut=650, feed=95)
  • fcut โ€” cut frequency (in Hz).
  • feed โ€” feed level (in Hz).

channelmap

Remaps input channels to new locations ๐Ÿ—บ๏ธ.

It accepts the following parameters:

  • map โ€” map channels from input to output. The argument is a |-separated list of mappings, each in the in_channel-out_channel or in_channel form. in_channel can be either the name of the input channel (e.g. FL for front left) or its index in the input channel layout. out_channel is the name of the output channel or its index in the output channel layout. If out_channel is not given, then it is implicitly an index, starting with zero and increasing by one for each mapping. Mixing different types of mappings is not allowed and will result in a parse error ๐Ÿ’€.
  • channel_layout โ€” the channel layout of the output stream. If not specified, then the filter will guess it based on the out_channel names or the number of mappings. Heads up: guessed layouts will not necessarily contain channels in the order of the mappings ๐Ÿซ .

If no mapping is present, the filter will implicitly map input channels to output channels, preserving indices.

Examples

  • For example, assuming a 5.1+downmix input MOV file,
ffmpeg -i in.mov -filter 'channelmap=map=DL-FL|DR-FR' out.wav

will create an output WAV file tagged as stereo from the downmix channels of the input ๐Ÿ’–.

  • To fix a 5.1 WAV improperly encoded in AAC's native channel order:
ffmpeg -i in.wav -filter 'channelmap=1|2|0|5|3|4:5.1' out.wav

channelsplit

Splits each channel from an input audio stream into a separate output stream โœ‚๏ธ๐Ÿฆ‹.

It accepts the following parameters:

  • channel_layout โ€” the channel layout of the input stream. The default is stereo.
  • channels โ€” a channel layout describing the channels to be extracted as separate output streams, or all to extract each input channel as a separate stream. The default is all.
Choosing channels not present in the channel layout in the input will result in an error ๐Ÿšจ.

Examples

  • For example, assuming a stereo input MP3 file,
ffmpeg -i in.mp3 -filter_complex channelsplit out.mkv

will create an output Matroska file with two audio streams, one containing only the left channel and the other the right channel ๐Ÿ‘‘.

  • Split a 5.1 WAV file into per-channel files:
ffmpeg -i in.wav -filter_complex
'channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR]'
-map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]'
front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]'
side_right.wav
  • Extract only LFE from a 5.1 WAV file:
ffmpeg -i in.wav -filter_complex 'channelsplit=channel_layout=5.1:channels=LFE[LFE]'
-map '[LFE]' lfe.wav

chorus

Adds a chorus effect to the audio ๐ŸŒˆ๐ŸŽค.

Can make a single vocal sound like a chorus, but can also be applied to instrumentation.

Chorus resembles an echo effect with a short delay, but whereas with echo the delay is constant, with chorus it's varied using sinusoidal or triangular modulation. The modulation depth defines the range the modulated delay is played before or after the delay. Hence the delayed sound will sound slower or faster โ€” that is, the delayed sound tuned around the original one, like in a chorus where some vocals are slightly off key ๐ŸŽถ.

It accepts the following parameters:

  • in_gain โ€” sets input gain. Default is 0.4.
  • out_gain โ€” sets output gain. Default is 0.4.
  • delays โ€” sets delays. A typical delay is around 40ms to 60ms.
  • decays โ€” sets decays.
  • speeds โ€” sets speeds.
  • depths โ€” sets depths.

Examples

  • A single delay:
chorus=0.7:0.9:55:0.4:0.25:2
  • Two delays:
chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3
  • Fuller sounding chorus with three delays:
chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3

compand

Compresses or expands the audio's dynamic range ๐ŸŽ›๏ธ. Squish it or stretch it, your call.

It accepts the following parameters:

  • attacks
  • decays

โ€” a list of times in seconds for each channel over which the instantaneous level of the input signal is averaged to determine its volume. attacks refers to increase of volume and decays refers to decrease of volume. For most situations, the attack time (response to the audio getting louder) should be shorter than the decay time, because the human ear is more sensitive to sudden loud audio than sudden soft audio ๐Ÿ‘‚. A typical value for attack is 0.3 seconds and a typical value for decay is 0.8 seconds. If the specified number of attacks & decays is lower than the number of channels, the last set attack/decay will be used for all remaining channels ๐Ÿ’ซ.

  • points โ€” the whole transfer-function vibe, in dB relative to the max possible signal amplitude ๐Ÿ’–. Every key-points list has to be written like "x0/y0|x1/y1|x2/y2|...." or "x0/y0 x1/y1 x2/y2 ...." (either separator is fine, bestie).

Ngl the input values have to be in strictly increasing order, but your transfer function does not have to be monotonically rising โ€” it can be whatever shape it wants, no cap. The point 0/0 is assumed but you can override it (with 0/out-dBn). Typical values for the transfer function are -70/-70|-60/-20|1/0.

  • soft-knee โ€” sets the curve radius in dB for all the joints โœจ. Defaults to 0.01.
  • gain โ€” the extra gain in dB applied at all points on the transfer function, so you can tweak overall gain in one little move ๐ŸŽ€. Defaults to 0.
  • volume โ€” sets an initial volume, in dB, assumed for each channel when filtering starts ๐Ÿฆ‹. This lets you hand over a nominal level upfront so that, like, a huge gain doesn't get slammed onto initial signal levels before the companding has even started doing its thing. A typical value for audio that's initially quiet is -90 dB. Defaults to 0.
  • delay โ€” sets a delay, in seconds โฑ๏ธ. The input audio gets analyzed immediately, but the audio is delayed before it's fed to the volume adjuster. If you specify a delay roughly equal to the attack/decay times, the filter gets to operate in predictive mode instead of reactive mode โ€” which is lowkey iconic. Defaults to 0.

Examples ๐ŸŒธ

  • Make music with both quiet and loud passages, suitable for listening in a noisy environment:
compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2
  • Another example for audio with whisper and explosion parts:
compand=0|0:1|1:-90/-900|-70/-70|-30/-9|0/-3:6:0:0:0
  • A noise gate for when the noise is at a lower level than the signal:
compand=.1|.1:.2|.2:-900/-900|-50.1/-900|-50/-50:.01:0:-90:.1
  • Here's another noise gate, this time for when the noise is at a higher level than the signal (which makes it, in some ways, similar to squelch):
compand=.1|.1:.1|.1:-45.1/-45.1|-45/-900|0/-900:.01:45:-90:.1
  • 2:1 compression starting at -6dB:
compand=points=-80/-80|-6/-6|0/-3.8|20/3.5
  • 2:1 compression starting at -9dB:
compand=points=-80/-80|-9/-9|0/-5.3|20/2.9
  • 2:1 compression starting at -12dB:
compand=points=-80/-80|-12/-12|0/-6.8|20/1.9
  • 2:1 compression starting at -18dB:
compand=points=-80/-80|-18/-18|0/-9.8|20/0.7
  • 3:1 compression starting at -15dB:
compand=points=-80/-80|-15/-15|0/-10.8|20/-5.2
  • Compressor/Gate:
compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6
  • Expander:
compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3
  • Hard limiter at -6dB:
compand=attacks=0:points=-80/-80|-6/-6|20/-6
  • Hard limiter at -12dB:
compand=attacks=0:points=-80/-80|-12/-12|20/-12
  • Hard noise gate at -35 dB:
compand=attacks=0:points=-80/-115|-35.1/-80|-35/-35|20/20
  • Soft limiter:
compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8

๐ŸŽ€ compensationdelay ๐ŸŽ€

Compensation Delay Line is a metric based delay, used to compensate for microphones or speakers being in different positions ๐Ÿ’….

Okay so picture this: you recorded guitar with two microphones placed in different locations. Because the front of the sound wave has a fixed speed under normal conditions, the phasing of the microphones can vary, and it depends on where they are and how they're positioned relative to each other. The best sound mix happens when those microphones are in phase (synchronized) ๐Ÿซถ. Note that a distance of ~30 cm between microphones makes one microphone capture the signal in antiphase to the other one โ€” and that makes the final mix sound moody ๐Ÿ˜ญ. This filter helps solve those phasing problems by adding different delays to each microphone track so they get synchronized.

The best result is yours when you take one track as the base and synchronize the other tracks with it one by one. Remember that the synchronization/delay tolerance depends on sample rate too โ€” higher sample rates will give you more tolerance โœจ.

The filter accepts the following parameters:

  • mm โ€” set millimeters distance. This is the compensation distance for fine tuning. Default is 0.
  • cm โ€” set cm distance. This is the compensation distance for tightening up the distance setup. Default is 0.
  • m โ€” set meters distance. This is the compensation distance for hard distance setup. Default is 0.
  • dry โ€” set dry amount. That's how much unprocessed (dry) signal you get. Default is 0.
  • wet โ€” set wet amount. That's how much processed (wet) signal you get. Default is 1.
  • temp โ€” set temperature in degrees Celsius ๐ŸŒก๏ธ. This is the temperature of the environment. Default is 20.

Commands

This filter supports the all above options as commands ๐Ÿ‘‘


๐Ÿฆ‹ crossfeed ๐Ÿฆ‹

Apply headphone crossfeed filter ๐ŸŽง.

Crossfeed is the process of blending the left and right channels of a stereo audio recording. It's mainly used to reduce that extreme stereo separation of low frequencies.

The intent? To produce a more speaker-like sound for the listener โœจ.

The filter accepts the following options:

  • strength โ€” set strength of crossfeed. Default is 0.2. Allowed range is from 0 to 1. This sets the gain of the low shelf filter for the side part of the stereo image. Default is -6dB. Max allowed is -30 dB when strength is set to 1.
  • range โ€” set soundstage wideness. Default is 0.5. Allowed range is from 0 to 1. This sets the cutoff frequency of the low shelf filter. Default cutoff is near 1550 Hz. With range set to 1 the cutoff frequency is set to 2100 Hz.
  • slope โ€” set curve slope of the low shelf filter. Default is 0.5. Allowed range is from 0.01 to 1.
  • level_in โ€” set input gain. Default is 0.9.
  • level_out โ€” set output gain. Default is 1.
  • block_size โ€” set the block size used for reverse IIR processing. If you set this value high enough (higher than the impulse response length truncated when it reaches near-zero values), the filtering becomes linear phase โ€” otherwise, if it's not big enough, it just produces nasty artifacts ๐Ÿ’€.

Note that the filter delay will be exactly this many samples when set to a non-zero value.

Commands

This filter supports the all above options as commands ๐Ÿ‘‘


๐Ÿ’œ crystalizer ๐Ÿ’œ

Simple algorithm for audio noise sharpening โœจ.

This filter linearly increases the differences between each audio sample.

The filter accepts the following options:

  • i โ€” sets the intensity of the effect (default: 2.0). Must be in range between -10.0 to 0 (unchanged sound) to 10.0 (maximum effect). To inverse filter, use a negative value.
  • c โ€” enable clipping. By default it's enabled.

Commands

This filter supports the all above options as commands ๐Ÿ‘‘


๐ŸŒˆ dcshift ๐ŸŒˆ

Apply a DC shift to the audio.

This can be useful to remove a DC offset (caused perhaps by a hardware problem in the recording chain) from the audio. The effect of a DC offset is reduced headroom and therefore reduced volume. The astats filter can be used to determine whether a signal has a DC offset ๐Ÿ‘€.

  • shift โ€” set the DC shift. Allowed range is [-1, 1]. It indicates the amount to shift the audio.
  • limitergain โ€” optional. It should have a value much less than 1 (e.g. 0.05 or 0.02) and it's used to prevent clipping ๐Ÿซถ.

๐Ÿ“ deesser ๐Ÿ“

Apply de-essing to the audio samples.

  • i โ€” set intensity for triggering de-essing. Allowed range is from 0 to 1. Default is 0.
  • m โ€” set amount of ducking on the treble part of the sound. Allowed range is from 0 to 1. Default is 0.5.
  • f โ€” how much of the original frequency content to keep when de-essing. Allowed range is from 0 to 1. Default is 0.5.
  • s โ€” set the output mode.

It accepts the following values:

  • i โ€” pass input unchanged.
  • o โ€” pass ess filtered out.
  • e โ€” pass only ess.

Default value is o.


๐Ÿ‘‘ dialoguenhance ๐Ÿ‘‘

Enhance dialogue in stereo audio ๐ŸŽฌ.

This filter accepts stereo input and produces surround (3.0) channels output. The newly produced front center channel has enhanced speech dialogue that was originally available in both stereo channels. The filter outputs the front left and front right channels the same as they were available in the stereo input โœจ.

The filter accepts the following options:

  • original โ€” set the original center factor to keep in the front center channel output. Allowed range is from 0 to 1. Default value is 1.
  • enhance โ€” set the dialogue enhance factor to put in the front center channel output. Allowed range is from 0 to 3. Default value is 1.
  • voice โ€” set the voice detection factor. Allowed range is from 2 to 32. Default value is 2.

Commands

This filter supports the all above options as commands ๐Ÿ‘‘


๐Ÿ’€ drmeter ๐Ÿ’€

Measure audio dynamic range ๐Ÿ“Š.

DR values of 14 and higher are found in very dynamic material. DR of 8 to 13 is found in transition material. And anything less than 8 has very poor dynamics and is very compressed.

The filter accepts the following options:

  • length โ€” set window length in seconds, used to split audio into segments of equal length. Default is 3 seconds.

๐Ÿงš dynaudnorm ๐Ÿงš

Dynamic Audio Normalizer โœจ.

This filter applies a certain amount of gain to the input audio in order to bring its peak magnitude to a target level (e.g. 0 dBFS). But โ€” and this is the iconic part โ€” in contrast to more "simple" normalization algorithms, the Dynamic Audio Normalizer dynamically re-adjusts the gain factor to the input audio. This lets you apply extra gain to the "quiet" sections of the audio while avoiding distortions or clipping the "loud" sections ๐Ÿ’…. In other words: the Dynamic Audio Normalizer will "even out" the volume of quiet and loud sections, in the sense that the volume of each section is brought to the same target level. Note though, bestie, that the Dynamic Audio Normalizer achieves this goal without applying "dynamic range compressing". It retains 100% of the dynamic range within each section of the audio file ๐Ÿซถ.

  • framelen, f โ€” Set the frame length in milliseconds. In range from 10 to 8000 milliseconds. Default is 500 milliseconds. ๐Ÿ’…

Okay so the Dynamic Audio Normalizer processes the input audio in small chunks, referred to as frames. This is required, because a peak magnitude has no meaning for just a single sample value. Instead, we need to determine the peak magnitude for a contiguous sequence of sample values. While a "standard" normalizer would simply use the peak magnitude of the complete file, the Dynamic Audio Normalizer determines the peak magnitude individually for each frame. The length of a frame is specified in milliseconds. By default, the Dynamic Audio Normalizer uses a frame length of 500 milliseconds, which has been found to give good results with most files.

Note that the exact frame length, in number of samples, will be determined automatically, based on the sampling rate of the individual input audio file. โœจ

  • gausssize, g โ€” Set the Gaussian filter window size. In range from 3 to 301, must be odd number. Default is 31. ๐Ÿฆ‹

Probably the most important parameter of the Dynamic Audio Normalizer is the "window size" of the Gaussian smoothing filter. The filter's window size is specified in frames, centered around the current frame. For the sake of simplicity, this must be an odd number. Consequently, the default value of 31 takes into account the current frame, as well as the 15 preceding frames and the 15 subsequent frames. Using a larger window results in a stronger smoothing effect and thus in less gain variation, i.e. slower gain adaptation. Conversely, using a smaller window results in a weaker smoothing effect and thus in more gain variation, i.e. faster gain adaptation.

In other words, the more you increase this value, the more the Dynamic Audio Normalizer will behave like a "traditional" normalization filter. On the contrary, the more you decrease this value, the more the Dynamic Audio Normalizer will behave like a dynamic range compressor. ๐ŸŽ€

  • peak, p โ€” Set the target peak value. This specifies the highest permissible magnitude level for the normalized audio input. This filter will try to approach the target peak magnitude as closely as possible, but at the same time it also makes sure that the normalized signal will never exceed the peak magnitude.

A frame's maximum local gain factor is imposed directly by the target peak magnitude. The default value is 0.95 and thus leaves a headroom of 5%*. It is not recommended to go above this value. ๐Ÿ’€

Heads up, bestie: it is not recommended to go above this value.
  • maxgain, m โ€” Set the maximum gain factor. In range from 1.0 to 100.0. Default is 10.0. ๐Ÿ”ฅ

The Dynamic Audio Normalizer determines the maximum possible (local) gain factor for each input frame, i.e. the maximum gain factor that does not result in clipping or distortion. The maximum gain factor is determined by the frame's highest magnitude sample. However, the Dynamic Audio Normalizer additionally bounds the frame's maximum gain factor by a predetermined (global) maximum gain factor. This is done in order to avoid excessive gain factors in "silent" or almost silent frames. By default, the maximum gain factor is 10.0. For most inputs the default value should be sufficient and it usually is not recommended to increase this value. Though, for input with an extremely low overall volume level, it may be necessary to allow even higher gain factors.

Note, however, that the Dynamic Audio Normalizer does not simply apply a "hard" threshold (i.e. cut off values above the threshold). Instead, a "sigmoid" threshold function will be applied. This way, the gain factors will smoothly approach the threshold value, but never exceed that value. ๐Ÿ‘‘

  • targetrms, r โ€” Set the target RMS. In range from 0.0 to 1.0. Default is 0.0 - disabled. ๐ŸŒธ

By default, the Dynamic Audio Normalizer performs "peak" normalization. This means that the maximum local gain factor for each frame is defined (only) by the frame's highest magnitude sample. This way, the samples can be amplified as much as possible without exceeding the maximum signal level, i.e. without clipping. Optionally, however, the Dynamic Audio Normalizer can also take into account the frame's root mean square, abbreviated RMS. In electrical engineering, the RMS is commonly used to determine the power of a time-varying signal. It is therefore considered that the RMS is a better approximation of the "perceived loudness" than just looking at the signal's peak magnitude. Consequently, by adjusting all frames to a constant RMS value, a uniform "perceived loudness" can be established. If a target RMS value has been specified, a frame's local gain factor is defined as the factor that would result in exactly that RMS value.

Note, however, that the maximum local gain factor is still restricted by the frame's highest magnitude sample, in order to prevent clipping. ๐Ÿ’–

  • coupling, n โ€” Enable channels coupling. By default is enabled. ๐Ÿ’…

By default, the Dynamic Audio Normalizer will amplify all channels by the same amount. This means the same gain factor will be applied to all channels, i.e. the maximum possible gain factor is determined by the "loudest" channel. However, in some recordings, it may happen that the volume of the different channels is uneven, e.g. one channel may be "quieter" than the other one(s). In this case, this option can be used to disable the channel coupling. This way, the gain factor will be determined independently for each channel, depending only on the individual channel's highest magnitude sample. This allows for harmonizing the volume of the different channels. ๐Ÿซถ

  • correctdc, c โ€” Enable DC bias correction. By default is disabled. ๐Ÿฆ‹

An audio signal (in the time domain) is a sequence of sample values. In the Dynamic Audio Normalizer these sample values are represented in the -1.0 to 1.0 range, regardless of the original input format. Normally, the audio signal, or "waveform", should be centered around the zero point. That means if we calculate the mean value of all samples in a file, or in a single frame, then the result should be 0.0 or at least very close to that value. If, however, there is a significant deviation of the mean value from 0.0, in either positive or negative direction, this is referred to as a DC bias or DC offset. Since a DC bias is clearly undesirable, the Dynamic Audio Normalizer provides optional DC bias correction.

With DC bias correction enabled, the Dynamic Audio Normalizer will determine the mean value, or "DC correction" offset, of each input frame and subtract that value from all of the frame's sample values which ensures those samples are centered around 0.0 again. Also, in order to avoid "gaps" at the frame boundaries, the DC correction offset values will be interpolated smoothly between neighbouring frames. ๐Ÿ’œ

  • altboundary, b โ€” Enable alternative boundary mode. By default is disabled. ๐ŸŽ€

The Dynamic Audio Normalizer takes into account a certain neighbourhood around each frame. This includes the preceding frames as well as the subsequent frames. However, for the "boundary" frames, located at the very beginning and at the very end of the audio file, not all neighbouring frames are available. In particular, for the first few frames in the audio file, the preceding frames are not known. And, similarly, for the last few frames in the audio file, the subsequent frames are not known. Thus, the question arises which gain factors should be assumed for the missing frames in the "boundary" region. The Dynamic Audio Normalizer implements two modes to deal with this situation. The default boundary mode assumes a gain factor of exactly 1.0 for the missing frames, resulting in a smooth "fade in" and "fade out" at the beginning and at the end of the input, respectively. โœจ

  • compress, s โ€” Set the compress factor. In range from 0.0 to 30.0. Default is 0.0. ๐Ÿ”ฅ

By default, the Dynamic Audio Normalizer does not apply "traditional" compression. This means that signal peaks will not be pruned and thus the full dynamic range will be retained within each local neighbourhood. However, in some cases it may be desirable to combine the Dynamic Audio Normalizer's normalization algorithm with a more "traditional" compression.

For this purpose, the Dynamic Audio Normalizer provides an optional compression (thresholding) function. If (and only if) the compression feature is enabled, all input frames will be processed by a soft knee thresholding function prior to the actual normalization process. Put simply, the thresholding function is going to prune all samples whose magnitude exceeds a certain threshold value. However, the Dynamic Audio Normalizer does not simply apply a fixed threshold value. Instead, the threshold value will be adjusted for each individual frame. In general, smaller parameters result in stronger compression, and vice versa. Values below 3.0 are not recommended, because audible distortion may appear.

Real talk: values below 3.0 are not recommended, because audible distortion may appear. ๐Ÿ˜ญ
  • threshold, t โ€” Set the target threshold value. This specifies the lowest permissible magnitude level for the audio input which will be normalized. If input frame volume is above this value frame will be normalized. Otherwise frame may not be normalized at all. The default value is set to 0, which means all input frames will be normalized. This option is mostly useful if digital noise is not wanted to be amplified. ๐ŸŒˆ
  • channels, h โ€” Specify which channels to filter, by default all available channels are filtered. ๐Ÿ’–
  • overlap, o โ€” Specify overlap for frames. If set to 0 (default) no frame overlapping is done. Using >0 and <1 values will make less conservative gain adjustments, like when framelen option is set to smaller value, if framelen option value is compensated for non-zero overlap then gain adjustments will be smoother across time compared to zero overlap case. ๐Ÿฆ‹
  • curve, v โ€” Specify the peak mapping curve expression which is going to be used when calculating gain applied to frames. The max output frame gain will still be limited by other options mentioned previously for this filter. ๐Ÿ‘‘

The expression can contain the following constants:

  • ch โ€” current channel number
  • sn โ€” current sample number
  • nb_channels โ€” number of channels
  • t โ€” timestamp expressed in seconds
  • sr โ€” sample rate
  • p โ€” current frame peak value ๐ŸŽฏ

๐Ÿ’ฌ Commands

This filter supports the all above options as commands. ๐Ÿ’ฌ


๐Ÿงด earwax

Ok bestie, this one makes audio easier to listen to on headphones. It adds cues to 44.1kHz stereo (i.e. audio CD format) audio so that when you listen on headphones the stereo image moves from inside your head (standard for headphones) to outside and in front of the listener (standard for speakers). Itโ€™s giving โ€œspeakers but make it headphonesโ€ โœจ.

Ported from SoX.

๐ŸŽš๏ธ equalizer

Apply a two-pole peaking equalisation (EQ) filter. With this filter you can boost or cut the signal level at and around a chosen frequency, while โ€” unlike bandpass and bandreject filters โ€” the level at all other frequencies stays unchanged. ๐Ÿ’…

To build complex equalisation curves, you can use this filter several times, each with a different central frequency. Obsessed.

The filter accepts the following options:

  • frequency, f โ€” set the filterโ€™s central frequency in Hz.
  • width_type, t โ€” set the method used to specify the filterโ€™s band-width:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” specify the band-width of a filter in width_type units.
  • gain, g โ€” set the required gain or attenuation in dB. Beware of clipping when using a positive gain! ๐Ÿ˜ญ
  • mix, m โ€” how much filtered signal to use in the output. Default is 1. Range is between 0 and 1.
  • channels, c โ€” specify which channels to filter; by default all available channels are filtered.
  • normalize, n โ€” normalize biquad coefficients. By default this is disabled. Enabling it will normalize magnitude response at DC to 0dB.
  • transform, a โ€” set transform type of IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” set precision of filtering:
    • auto โ€” pick automatic sample format depending on surround filters.
    • s16 โ€” always use signed 16-bit.
    • s32 โ€” always use signed 32-bit.
    • f32 โ€” always use float 32-bit.
    • f64 โ€” always use float 64-bit.
  • block_size, b โ€” set block size used for reverse IIR processing. If this value is set high enough (higher than impulse response length truncated when it reaches near zero values), filtering will become linear phase; otherwise, if itโ€™s not big enough, it will just produce nasty artifacts. ๐Ÿ˜ญ Note that filter delay will be exactly this many samples when set to a non-zero value.

โœจ Examples

  • Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz:
equalizer=f=1000:t=h:width=200:g=-10
  • Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2:
equalizer=f=1000:t=q:w=1:g=2,equalizer=f=100:t=q:w=2:g=-5

๐Ÿ’ฌ Commands

This filter supports the following commands:

  • frequency, f โ€” change equalizer frequency. Syntax for the command is : "frequency"
  • width_type, t โ€” change equalizer width_type. Syntax for the command is : "width_type"
  • width, w โ€” change equalizer width. Syntax for the command is : "width"
  • gain, g โ€” change equalizer gain. Syntax for the command is : "gain"
  • mix, m โ€” change equalizer mix. Syntax for the command is : "mix"

๐ŸŽง extrastereo

Linearly increases the difference between left and right channels, which adds some sort of โ€œliveโ€ effect to playback. Itโ€™s giving concert vibes in your ears ๐ŸŽคโœจ.

The filter accepts the following options:

  • m โ€” sets the difference coefficient (default: 2.5). 0.0 means mono sound (average of both channels), with 1.0 sound will be unchanged, with -1.0 left and right channels will be swapped. ๐Ÿ’ซ
  • c โ€” enable clipping. By default this is enabled.

๐Ÿ’ฌ Commands

This filter supports the all above options as commands.

๐ŸŒˆ firequalizer

Apply FIR Equalization using an arbitrary frequency response. This one is lowkey a whole mood board for your EQ ๐ŸŽ›๏ธ.

The filter accepts the following option:

  • gain โ€” set gain curve equation (in dB). The expression can contain variables:
    • f โ€” the evaluated frequency
    • sr โ€” sample rate
    • ch โ€” channel number, set to 0 when multichannels evaluation is disabled
    • chid โ€” channel id, see libavutil/channel_layout.h, set to the first channel id when multichannels evaluation is disabled
    • chs โ€” number of channels
    • chlayout โ€” channel_layout, see libavutil/channel_layout.h

and functions:

  • gain_interpolate(f) โ€” interpolate gain on frequency f based on gain_entry
  • cubic_interpolate(f) โ€” same as gain_interpolate, but smoother

This option is also available as a command. Default is gain_interpolate(f).

  • gain_entry โ€” set gain entry for the gain_interpolate function. The expression can contain functions:
    • entry(f, g) โ€” store gain entry at frequency f with value g

This option is also available as a command.

  • delay โ€” set filter delay in seconds. Higher value means more accurate. Default is 0.01.
  • accuracy โ€” set filter accuracy in Hz. Lower value means more accurate. Default is 5.
  • wfunc โ€” set window function. Acceptable values are:
    • rectangular โ€” rectangular window, useful when gain curve is already smooth
    • hann โ€” hann window (default)
    • hamming โ€” hamming window
    • blackman โ€” blackman window
    • nuttall3 โ€” 3-terms continuous 1st derivative nuttall window
    • mnuttall3 โ€” minimum 3-terms discontinuous nuttall window
    • nuttall โ€” 4-terms continuous 1st derivative nuttall window
    • bnuttall โ€” minimum 4-terms discontinuous nuttall (blackman-nuttall) window
    • bharris โ€” blackman-harris window
    • tukey โ€” tukey window
  • fixed โ€” if enabled, use a fixed number of audio samples. This improves speed when filtering with large delay. Default is disabled.
  • multi โ€” enable multichannels evaluation on gain. Default is disabled.
  • zero_phase โ€” enable zero phase mode by subtracting timestamp to compensate delay. Default is disabled.
  • scale โ€” set scale used by gain. Acceptable values are:
    • linlin โ€” linear frequency, linear gain
    • linlog โ€” linear frequency, logarithmic (in dB) gain (default)
    • loglin โ€” logarithmic (in octave scale where 20 Hz is 0) frequency, linear gain
    • loglog โ€” logarithmic frequency, logarithmic gain
  • dumpfile โ€” set file for dumping, suitable for gnuplot.
  • dumpscale โ€” set scale for dumpfile. Acceptable values are the same as the scale option. Default is linlog.
  • fft2 โ€” enable 2-channel convolution using complex FFT. This improves speed significantly. Default is disabled.
  • min_phase โ€” enable minimum phase impulse response. Default is disabled.

โœจ Examples

  • lowpass at 1000 Hz:
firequalizer=gain='if(lt(f,1000), 0, -INF)'
  • lowpass at 1000 Hz with gain_entry:
firequalizer=gain_entry='entry(1000,0); entry(1001, -INF)'
  • custom equalization:
firequalizer=gain_entry='entry(100,0); entry(400, -4); entry(1000, -6); entry(2000, 0)'
  • higher delay with zero phase to compensate delay:
firequalizer=delay=0.1:fixed=on:zero_phase=on
  • lowpass on left channel, highpass on right channel:
firequalizer=gain='if(eq(chid,1), gain_interpolate(f), if(eq(chid,2), gain_interpolate(1e6+f), 0))'
:gain_entry='entry(1000, 0); entry(1001,-INF); entry(1e6+1000,0)':multi=on

๐ŸŒ€ flanger

Apply a flanging effect to the audio. Itโ€™s giving โ€œwhoosh whoosh but make it fashionโ€ ๐Ÿ’ซ.

The filter accepts the following options:

  • delay โ€” set base delay in milliseconds. Range from 0 to 30. Default value is 0.
  • depth โ€” set added sweep delay in milliseconds. Range from 0 to 10. Default value is 2.
  • regen โ€” set percentage regeneration (delayed signal feedback). Range from -95 to 95. Default value is 0.
  • width โ€” set percentage of delayed signal mixed with original. Range from 0 to 100. Default value is 71.
  • speed โ€” set sweeps per second (Hz). Range from 0.1 to 10. Default value is 0.5.
  • shape โ€” set swept wave shape, can be triangular or sinusoidal. Default value is sinusoidal.
  • phase โ€” set swept wave percentage-shift for multi channel. Range from 0 to 100. Default value is 25.
  • interp โ€” set delay-line interpolation, linear or quadratic. Default is linear.

๐Ÿฆ‹ haas

Apply Haas effect to audio. ๐Ÿซถ

Note that this makes most sense to apply on mono signals. With this filter applied to mono signals it gives some directionality and stretches its stereo image. Cute.

The filter accepts the following options:

  • level_in โ€” set input level. By default is 1, or 0dB.
  • level_out โ€” set output level. By default is 1, or 0dB.
  • side_gain โ€” set gain applied to side part of signal. By default is 1.
  • middle_source โ€” set kind of middle source. Can be one of the following:
    • left โ€” pick left channel.
    • right โ€” pick right channel.
    • mid โ€” pick middle part signal of stereo image.
    • side โ€” pick side part signal of stereo image.
  • middle_phase โ€” change middle phase. By default is disabled.
  • left_delay โ€” set left channel delay. By default is 2.05 milliseconds.
  • left_balance โ€” set left channel balance. By default is -1.
  • left_gain โ€” set left channel gain. By default is 1.
  • left_phase โ€” change left phase. By default is disabled.
  • right_delay โ€” set right channel delay. By default is 2.12 milliseconds.
  • right_balance โ€” set right channel balance. By default is 1.
  • right_gain โ€” set right channel gain. By default is 1.
  • right_phase โ€” change right phase. By default is enabled.

๐Ÿ’ฟ hdcd

Decodes High Definition Compatible Digital (HDCD) data. A 16-bit PCM stream with embedded HDCD codes is expanded into a 20-bit PCM stream. Iconic behavior, no cap ๐Ÿ‘‘

The filter supports the Peak Extend and Low-level Gain Adjustment features of HDCD, and detects the Transient Filter flag.

ffmpeg -i HDCD16.flac -af hdcd OUT24.flac

When using the filter with wav, note the default encoding for wav is 16-bit, so the resulting 20-bit stream will be truncated back to 16-bit. Use something like -acodec pcm_s24le after the filter to get 24-bit PCM output. Important bestie! ๐Ÿ˜ญ

ffmpeg -i HDCD16.wav -af hdcd OUT16.wav
ffmpeg -i HDCD16.wav -af hdcd -c:a pcm_s24le OUT24.wav

The filter accepts the following options:

  • disable_autoconvert โ€” disable any automatic format conversion or resampling in the filter graph.

๐Ÿ’… process_stereo

Process the stereo channels together as a unit. And like, if target_gain doesn't match between the two channels? Bestie, that's invalid โ€” the filter just uses the last valid target_gain instead. Moving on. โœจ

โฑ๏ธ cdt_ms

Sets the code detect timer period, in ms. That's it, that's the whole vibe.

๐Ÿ”ฅ force_pe

Always extend peaks above -3dBFS, even when PE isn't signaled. No cap, we're extending regardless. ๐Ÿ’€

๐ŸŒˆ analyze_mode

Replaces the audio with a solid tone and adjusts the amplitude to signal some specific aspect of the decoding process. The output file can be loaded in an audio editor alongside the original to aid analysis โ€” it's giving "science experiment but make it audio" ๐Ÿงช.

"analyze_mode=pe:force_pe=true" can be used to see all samples above the PE level. iykyk.

Modes are:

  • 0, off โ€” Disabled. Not doing anything, respectfully.
  • 1, lle โ€” Gain adjustment level at each sample.
  • 2, pe โ€” Samples where peak extend occurs.
  • 3, cdt โ€” Samples where the code detect timer is active.
  • 4, tgm โ€” Samples where the target gain does not match between channels. (The messy ones ๐Ÿ‘€)

๐ŸŽง headphone

Apply head-related transfer functions (HRTFs) to create virtual loudspeakers around the user, for binaural listening via headphones. Basically: surround sound inside your skull, iconic behavior, no notes. ๐Ÿซถ

The HRIRs are provided via additional streams โ€” for each channel, one stereo input stream is needed.

The filter accepts the following options:

  • map โ€” Set mapping of input streams for convolution. The argument is a '|'-separated list of channel names, in the order they're given as additional stream inputs for the filter. This also specifies the number of input streams, and that number must be not less than the number of channels in the first stream plus one. โœจ
  • gain โ€” Set gain applied to audio. Value is in dB. Default is 0.
  • type โ€” Set processing type. Can be time or freq. time processes audio in the time domain, which is slow ๐Ÿ˜ฉ. freq processes audio in the frequency domain, which is fast ๐Ÿ”ฅ. Default is freq.
  • lfe โ€” Set custom gain for LFE channels. Value is in dB. Default is 0.
  • size โ€” Set size of frame in number of samples which will be processed at once. Default value is 1024. Allowed range is from 1024 to 96000.
  • hrir โ€” Set format of hrir stream. Default value is stereo. Alternative value is multich. If set to stereo, the number of additional streams should be greater or equal to the number of input channels in the first input stream โ€” and also, each additional stream should have a stereo number of channels. If set to multich, the number of additional streams should be exactly one โ€” and the number of input channels of that additional stream should be equal to or greater than twice the number of channels of the first input stream. Math is mathing, stay with me ๐Ÿ’…

โœจ Examples

  • Full example using wav files as coefficients with amovie filters for 7.1 downmix โ€” each amovie filter uses a stereo file with IR coefficients as input. The files give coefficients for each position of the virtual loudspeaker:
ffmpeg -i input.wav
-filter_complex "amovie=azi_270_ele_0_DFC.wav[sr];amovie=azi_90_ele_0_DFC.wav[sl];amovie=azi_225_ele_0_DFC.wav[br];amovie=azi_135_ele_0_DFC.wav[bl];amovie=azi_0_ele_0_DFC.wav,asplit[fc][lfe];amovie=azi_35_ele_0_DFC.wav[fl];amovie=azi_325_ele_0_DFC.wav[fr];[0:a][fl][fr][fc][lfe][bl][br][sl][sr]headphone=FL|FR|FC|LFE|BL|BR|SL|SR"
output.wav
  • Full example using wav files as coefficients with amovie filters for 7.1 downmix, but now in multich hrir format. Glow up edition ๐Ÿ’–
ffmpeg -i input.wav -filter_complex "amovie=minp.wav[hrirs];[0:a][hrirs]headphone=map=FL|FR|FC|LFE|BL|BR|SL|SR:hrir=multich"
output.wav

๐Ÿฆ‹ highpass

Apply a high-pass filter with a 3dB point frequency. The filter can be either single-pole or double-pole (double-pole is the default, she's the main character). The filter roll off is 6dB per pole per octave (20dB per pole per decade). Slay.

The filter accepts the following options:

  • frequency, f โ€” Set frequency in Hz. Default is 3000.
  • poles, p โ€” Set number of poles. Default is 2.
  • width_type, t โ€” Set method to specify band-width of filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” Specify the band-width of a filter in width_type units. Applies only to double-pole filter. The default is 0.707q and gives a Butterworth response. Fancy name, iconic result โœจ
  • mix, m โ€” How much to use filtered signal in output. Default is 1. Range is between 0 and 1.
  • channels, c โ€” Specify which channels to filter. By default all available are filtered.
  • normalize, n โ€” Normalize biquad coefficients, by default is disabled. Enabling it will normalize magnitude response at DC to 0dB.
  • transform, a โ€” Set transform type of IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” Set precision of filtering:
    • auto โ€” Pick automatic sample format depending on surround filters.
    • s16 โ€” Always use signed 16-bit.
    • s32 โ€” Always use signed 32-bit.
    • f32 โ€” Always use float 32-bit.
    • f64 โ€” Always use float 64-bit.
  • block_size, b โ€” Set block size used for reverse IIR processing. If this value is set to a high enough value (higher than the impulse response length truncated when it reaches near-zero values), filtering will become linear phase. Otherwise, if it's not big enough, it will just produce nasty artifacts. ๐Ÿ˜ญ
Heads up bestie: filter delay will be exactly this many samples when set to a non-zero value. Not a vibe if you weren't expecting it. ๐Ÿ™ˆ

๐ŸŽ€ Commands

This filter supports the following commands:

  • frequency, f โ€” Change highpass frequency. Syntax for the command is: frequency
  • width_type, t โ€” Change highpass width_type. Syntax for the command is: width_type
  • width, w โ€” Change highpass width. Syntax for the command is: width
  • mix, m โ€” Change highpass mix. Syntax for the command is: mix

๐ŸŒธ join

Join multiple input streams into one multi-channel stream. Friendship bracelet energy ๐Ÿซถ.

It accepts the following parameters:

  • inputs โ€” The number of input streams. Defaults to 2.
  • channel_layout โ€” The desired output channel layout. Defaults to stereo.
  • map โ€” Map channels from inputs to output. The argument is a '|'-separated list of mappings, each in the input_idx.in_channel-out_channel form. input_idx is the 0-based index of the input stream. in_channel can be either the name of the input channel (e.g. FL for front left) or its index in the specified input stream. out_channel is the name of the output channel.

The filter will attempt to guess the mappings when they aren't specified explicitly. It does so by first trying to find an unused matching input channel, and if that fails, it picks the first unused input channel. She's doing her best and honestly? She's usually right ๐Ÿ’…

Join 3 inputs (with properly set channel layouts):

ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT

Build a 5.1 output from 6 single-channel streams:

ffmpeg -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex
'join=inputs=6:channel_layout=5.1:map=0.0-FL|1.0-FR|2.0-FC|3.0-SL|4.0-SR|5.0-LFE'
out

๐Ÿงš ladspa

Load a LADSPA (Linux Audio Developer's Simple Plugin API) plugin. Niche? Yes. Powerful? Also yes. ๐Ÿ‘‘

To enable compilation of this filter you need to configure FFmpeg with --enable-ladspa.

  • file, f โ€” Specifies the name of the LADSPA plugin library to load. If the environment variable LADSPA_PATH is defined, the LADSPA plugin is searched in each one of the directories specified by the colon-separated list in LADSPA_PATH; otherwise it's searched in the standard LADSPA paths, which are in this order: HOME/.ladspa/lib/, /usr/local/lib/ladspa/, /usr/lib/ladspa/.
  • plugin, p โ€” Specifies the plugin within the library. Some libraries contain only one plugin, but others contain many of them. If this is not set, the filter will list all available plugins within the specified library. Very "here's the menu, pick your fighter" of it ๐Ÿ“‹
  • controls, c โ€” Set the '|' separated list of controls, which are zero or more floating point values that determine the behavior of the loaded plugin (for example delay, threshold or gain). Controls need to be defined using the following syntax: c0=value0|c1=value1|c2=value2|..., where valuei is the value set on the i-th control. Alternatively they can also be defined using the following syntax: value0|value1|value2|..., where valuei is the value set on the i-th control. If controls is set to "help", all available controls and their valid ranges are printed. Bless. ๐Ÿซถ
  • sample_rate, s โ€” Specify the sample rate, default to 44100. Only used if the plugin has zero inputs.
  • nb_samples, n โ€” Set the number of samples per channel per each output frame, default is 1024. Only used if the plugin has zero inputs.
  • duration, d โ€” Set the minimum duration of the sourced audio. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. Note that the resulting duration may be greater than the specified duration, since the generated audio is always cut at the end of a complete frame. If not specified, or the expressed duration is negative, the audio is supposed to be generated forever. Only used if the plugin has zero inputs. (Forever audio, no cap ๐Ÿ˜ญ)
  • latency, l โ€” Enable latency compensation, by default is disabled. Only used if the plugin has inputs.

โญ Examples

  • List all available plugins within the amp (LADSPA example plugin) library:
ladspa=file=amp
  • List all available controls and their valid ranges for the vcf_notch plugin from the VCF library:
ladspa=f=vcf:p=vcf_notch:c=help
  • Simulate low quality audio equipment using the Computer Music Toolkit (CMT) plugin library:
ladspa=file=cmt:plugin=lofi:controls=c0=22|c1=12|c2=12
  • Add reverberation to the audio using TAP-plugins (Tom's Audio Processing plugins):
ladspa=file=tap_reverb:tap_reverb
  • Generate white noise, with 0.2 amplitude:
ladspa=file=cmt:noise_source_white:c=c0=.2
  • Generate 20 bpm clicks using the plugin C* Click - Metronome from the C* Audio Plugin Suite (CAPS) library:
ladspa=file=caps:Click:c=c1=20'
  • Apply the C* Eq10X2 - Stereo 10-band equaliser effect:
ladspa=caps:Eq10X2:c=c0=-48|c9=-24|c3=12|c4=2
  • Increase volume by 20dB using the fast lookahead limiter from Steve Harris' SWH Plugins collection:
ladspa=fast_lookahead_limiter_1913:fastLookaheadLimiter:20|0|2
  • Attenuate low frequencies using the Multiband EQ from Steve Harris' SWH Plugins collection:
ladspa=mbeq_1197:mbeq:-24|-24|-24|0|0|0|0|0|0|0|0|0|0|0|0
  • Reduce stereo image using Narrower from the C* Audio Plugin Suite (CAPS) library:
  • the Narrower one from CAPS โ€” same family, tighter vibe:
ladspa=caps:Narrower
  • another white noise moment, this time repping the "C* Audio Plugin Suite" (CAPS) library:
ladspa=caps:White:.2
  • fractal noise era, also CAPS, because we love texture:
ladspa=caps:Fractal:c=c1=1
  • dynamic volume normalization using the "VLevel" plugin โ€” chef's kiss for keeping levels in check:
ladspa=vlevel-ladspa:vlevel_mono

Commands ๐Ÿ’ฌ

This filter supports the following commands:

  • cN โ€” modify the N-th control value. And bestie, if the value you pass isn't valid, it's just ignored and the previous one stays. No chaos, no crash. ๐Ÿซถ

loudnorm

EBU R128 loudness normalization, aka the glow-up your audio deserves. โœจ It does both dynamic and linear normalization modes, and supports both single pass (livestreams, files) and double pass (files) modes. This algorithm can target IL, LRA, and maximum true peak. And heads up โ€” in dynamic mode, to accurately detect true peaks, the audio stream gets upsampled to 192 kHz. So use the -ar option or the aresample filter to explicitly set an output sample rate. ๐Ÿ‘‘

The filter accepts the following options:

  • I, i โ€” set integrated loudness target. Range is -70.0 - -5.0. Default value is -24.0.
  • LRA, lra โ€” set loudness range target. Range is 1.0 - 50.0. Default value is 7.0.
  • TP, tp โ€” set maximum true peak. Range is -9.0 - +0.0. Default value is -2.0.
  • measured_I, measured_i โ€” measured IL of input file. Range is -99.0 - +0.0.
  • measured_LRA, measured_lra โ€” measured LRA of input file. Range is 0.0 - 99.0.
  • measured_TP, measured_tp โ€” measured true peak of input file. Range is -99.0 - +99.0.
  • measured_thresh โ€” measured threshold of input file. Range is -99.0 - +0.0.
  • offset โ€” set offset gain. The gain is applied before the true-peak limiter. Range is -99.0 - +99.0. Default is +0.0.
  • linear โ€” normalize by linearly scaling the source audio. For this, measured_I, measured_LRA, measured_TP, and measured_thresh must all be specified. Target LRA shouldn't be lower than source LRA, and the change in integrated loudness shouldn't result in a true peak which exceeds the target TP. If any of these conditions aren't met, normalization mode will revert to dynamic (sneaky little fallback, iykyk). Options are true or false. Default is true.
  • dual_mono โ€” treat mono input files as "dual-mono". Here's the tea: if a mono file is intended for playback on a stereo system, its EBU R128 measurement will be perceptually incorrect. If set to true, this option compensates for that effect. Multi-channel input files are not affected by this option. Options are true or false. Default is false.
  • print_format โ€” set print format for stats. Options are summary, json, or none. Default value is none.
  • stats_file โ€” write stats to the specified file. Format is controlled by print_format, which must be set. Specify - to write to standard output. Default is unset.

lowpass ๐ŸŒ€

Apply a low-pass filter with 3dB point frequency. The filter can be either single-pole or double-pole (double-pole is the default, bestie). It rolls off at 6dB per pole per octave โ€” that's 20dB per pole per decade, math girlies rise. ๐Ÿ“

The filter accepts the following options:

  • frequency, f โ€” set frequency in Hz. Default is 500.
  • poles, p โ€” set number of poles. Default is 2.
  • width_type, t โ€” set method to specify band-width of filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” specify the band-width of a filter in width_type units. Applies only to double-pole filter. The default is 0.707q and gives a Butterworth response. ๐Ÿ’…
  • mix, m โ€” how much to use filtered signal in output. Default is 1. Range is between 0 and 1.
  • channels, c โ€” specify which channels to filter; by default all available are filtered.
  • normalize, n โ€” normalize biquad coefficients, by default is disabled. Enabling it will normalize magnitude response at DC to 0dB.
  • transform, a โ€” set transform type of IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” set precision of filtering:
    • auto โ€” pick automatic sample format depending on surround filters.
    • s16 โ€” always use signed 16-bit.
    • s32 โ€” always use signed 32-bit.
    • f32 โ€” always use float 32-bit.
    • f64 โ€” always use float 64-bit.
  • block_size, b โ€” set block size used for reverse IIR processing. If this value is set to a high enough value (higher than impulse response length truncated when it reaches near zero values), filtering will become linear phase. Otherwise, if it's not big enough, it will just produce nasty artifacts. ๐Ÿ’€
Also note: filter delay will be exactly this many samples when set to a non-zero value.

Examples ๐ŸŒธ

  • Lowpass only the LFE channel โ€” if LFE is not present it does nothing, so it's a very chill no-op:
lowpass=c=LFE

Commands ๐Ÿ’ฌ

This filter supports the following commands:

  • frequency, f โ€” change lowpass frequency. Syntax for the command is frequency.
  • width_type, t โ€” change lowpass width_type. Syntax for the command is width_type.
  • width, w โ€” change lowpass width. Syntax for the command is width.
  • mix, m โ€” change lowpass mix. Syntax for the command is mix.

lv2 ๐Ÿงš

Load a LV2 (LADSPA Version 2) plugin. Yes, the sequel. ๐ŸŽฌ

To enable compilation of this filter you need to configure FFmpeg with --enable-lv2.
  • plugin, p โ€” specifies the plugin URI. You may need to escape ':'.
  • controls, c โ€” set the '|' separated list of controls, which are zero or more floating point values that determine the behavior of the loaded plugin (for example delay, threshold or gain). If controls is set to help, all available controls and their valid ranges are printed. Basically a built-in cheat sheet, iconic.
  • sample_rate, s โ€” specify the sample rate, default to 44100. Only used if plugin have zero inputs.
  • nb_samples, n โ€” set the number of samples per channel per each output frame, default is 1024. Only used if plugin have zero inputs.
  • duration, d โ€” set the minimum duration of the sourced audio. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. Note that the resulting duration may be greater than the specified duration, as the generated audio is always cut at the end of a complete frame. If not specified, or the expressed duration is negative, the audio is supposed to be generated forever. Only used if plugin have zero inputs.

Examples ๐ŸŒˆ

  • Bass enhancer plugin from Calf โ€” the low end said "not me being quiet":
lv2=p=http\\\\://calf.sourceforge.net/plugins/BassEnhancer:c=amount=2
  • Vinyl plugin from Calf โ€” for when you want it to sound like a cozy record, drone and all:
lv2=p=http\\\\://calf.sourceforge.net/plugins/Vinyl:c=drone=0.2|aging=0.5
  • Bit crusher plugin from ArtyFX โ€” crunchy, no notes:
lv2=p=http\\\\://www.openavproductions.com/artyfx#bitta:c=crush=0.3

Commands ๐Ÿ’ฌ

This filter supports all options that are exported by the plugin as commands. Yes, whatever the plugin hands over, you get. ๐Ÿซถ


mcompand ๐ŸŒŠ

Multiband compress or expand the audio's dynamic range โ€” squish it or stretch it, your call.

The input audio is divided into bands using 4th order Linkwitz-Riley IIRs. This is akin to the crossover of a loudspeaker, and results in flat frequency response when absent compander action. (Translation: when you're not doing anything to it, it stays neutral. Respect. ๐ŸŽ€)

It accepts the following parameters:

  • args โ€” this option syntax is: attack,decay,[attack,decay..] soft-knee points crossover_frequency [delay [initial_volume [gain]]] | attack,decay ... โ€” for explanation of each item, refer to the compand filter documentation. (Bestie it's a field trip, but the docs are right there. ๐Ÿ“š)

pan ๐ŸŽ›๏ธ

Mix channels with specific gain levels. The filter accepts the output channel layout followed by a set of channel definitions.

This filter is also designed to efficiently remap the channels of an audio stream. So it's not just a mixer, it's a whole channel relocation service.

The filter accepts parameters of the form: l|outdef|outdef|...

  • l โ€” output channel layout or number of channels.
  • outdef โ€” output channel specification, of the form: out_name=[gain*]in_name[(+-)[gain*]in_name...]
  • out_name โ€” output channel to define, either a channel name (FL, FR, etc.) or a channel number (c0, c1, etc.).
  • gain โ€” multiplicative coefficient for the channel, 1 leaving the volume unchanged.
  • in_name โ€” input channel to use, see out_name for details; it is not possible to mix named and numbered input channels.
Cute trick alert ๐Ÿšจ: if the = in a channel specification is replaced by <, then the gains for that specification will be renormalized so that the total is 1, thus avoiding clipping noise. Lowkey a lifesaver.

Mixing examples ๐Ÿ’–

For example, if you want to down-mix from stereo to mono, but with a bigger factor for the left channel:

pan=1c|c0=0.9*c0+0.1*c1

A customized down-mix to stereo that works automatically for 3-, 4-, 5- and 7-channels surround:

pan=stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
Note that ffmpeg integrates a default down-mix (and up-mix) system that should be preferred (see -ac option) unless you have very specific needs. Like, the default is there for a reason, but go off if you need something bespoke. โœจ

Remapping examples ๐Ÿ”

The channel remapping will be effective if, and only if:

  • gain coefficients are zeroes or ones,
  • only one input per channel output.

If all these conditions are satisfied, the filter will notify the user (Pure channel mapping detected), and use an optimized and lossless method to do the remapping. Lossless! We love an efficient queen. ๐Ÿ‘‘

For example, if you have a 5.1 source and want a stereo audio stream by dropping the extra channels:

pan="stereo| c0=FL | c1=FR"

Given the same source, you can also switch front left and front right channels and keep the input channel layout:

pan="5.1| c0=c1 | c1=c0 | c2=c2 | c3=c3 | c4=c4 | c5=c5"

If the input is a stereo audio stream, you can mute the front left channel (and still keep the stereo channel layout) with:

pan="stereo|c1=c1"

Still with a stereo audio stream input, you can copy the right channel in both front left and right:

pan="stereo| c0=FR | c1=FR"

replaygain ๐ŸŽง

ReplayGain scanner filter. This filter takes an audio stream as an input and outputs it unchanged โ€” a true "I'm just looking, I promise" filter. At end of filtering it displays track_gain and track_peak.

The filter accepts the following exported read-only options:

  • track_gain โ€” exported track gain in dB at end of stream.
  • track_peak โ€” exported track peak at end of stream.

resample ๐Ÿฆ‹

Convert the audio sample format, sample rate and channel layout. And bestie, listen โ€” it is not meant to be used directly. It's the backstage crew, not the main character. ๐Ÿ™ˆ


rubberband ๐ŸŽ€

Apply time-stretching and pitch-shifting with librubberband. Stretchy, pitchy, iconic.

To enable compilation of this filter, you need to configure FFmpeg with --enable-librubberband.

The filter accepts the following options:

  • tempo โ€” sets the tempo scale factor ๐ŸŽš๏ธ
  • pitch โ€” sets the pitch scale factor ๐ŸŽต
  • transients โ€” picks the transients detector. the possible values are:
    • crisp
    • mixed
    • smooth
  • detector โ€” picks the detector. possible values:
    • compound
    • percussive
    • soft
  • phase โ€” sets the phase. possible values:
    • laminar
    • independent
  • window โ€” sets the processing window size. possible values:
    • standard
    • short
    • long
  • smoothing โ€” sets smoothing. possible values:
    • off
    • on
  • formant โ€” turns on formant preservation when shift pitching โœจ possible values:
    • shifted
    • preserved
  • pitchq โ€” sets pitch quality. possible values:
    • quality
    • speed
    • consistency
  • channels โ€” sets channels. possible values:
    • apart
    • together

๐ŸŽ› Commands

bestie this filter takes commands too, it's giving interactive:

  • tempo โ€” changes the filter tempo scale factor. the syntax for the command is literally:
tempo
  • pitch โ€” changes the filter pitch scale factor. syntax for the command is:
pitch

๐Ÿ’… sidechaincompress

okay so this filter is like a normal compressor but with a glow-up: it can compress the detected signal using a second input signal. it needs two input streams and hands you back one output stream ๐Ÿซถ the first input stream gets processed depending on the second stream's signal. and the filtered signal? can then be filtered with other filters in later stages of processing. peek at pan and amerge filter for the vibes.

the filter accepts these options:

  • level_in โ€” sets the input gain. default is 1. range is between 0.015625 and 64.
  • mode โ€” sets the mode of compressor operation. can be upward or downward. default is downward.
  • threshold โ€” if a signal of the second stream raises above this level it will affect the gain reduction of the first stream. by default it's 0.125. range is between 0.00097563 and 1.
  • ratio โ€” sets a ratio about which the signal is reduced. 1:2 means that if the level raised 4dB above the threshold, it will be only 2dB above after the reduction. default is 2. range is between 1 and 20.
  • attack โ€” amount of milliseconds the signal has to rise above the threshold before gain reduction starts. default is 20. range is between 0.01 and 2000.
  • release โ€” amount of milliseconds the signal has to fall below the threshold before reduction is decreased again. default is 250. range is between 0.01 and 9000.
  • makeup โ€” sets the amount by how much signal will be amplified after processing. default is 1. range is from 1 to 64.
  • knee โ€” curves the sharp knee around the threshold so you enter gain reduction more softly ๐Ÿงš default is 2.82843. range is between 1 and 8.
  • link โ€” choose if the average level between all channels of the side-chain stream, or the louder (maximum) channel of the side-chain stream, affects the reduction. default is average.
  • detection โ€” should the exact signal be taken in case of peak, or an RMS one in case of rms. default is rms, which is mainly smoother.
  • level_sc โ€” sets sidechain gain. default is 1. range is between 0.015625 and 64.
  • mix โ€” how much to use the compressed signal in the output. default is 1. range is between 0 and 1.

Commands

this filter supports all the above options as commands. yes, all of them, no cap ๐Ÿ’…

Examples

  • full ffmpeg example taking 2 audio inputs, 1st input to be compressed depending on the signal of 2nd input, and later the compressed signal gets merged with the 2nd input:
ffmpeg -i main.flac -i sidechain.flac -filter_complex "[1:a]asplit=2[sc][mix];[0:a][sc]sidechaincompress[compr];[compr][mix]amerge"

๐Ÿšช sidechaingate

a sidechain gate acts like a normal (wideband) gate but it has the ability to filter the detected signal before sending it to the gain reduction stage. normally a gate uses the full range signal to detect a level above the threshold. for example: if you cut all the lower frequencies from your sidechain signal, the gate will decrease the volume of your track only if not enough highs appear ๐Ÿ”ฅ with this technique you're able to reduce the resonation of a natural drum, or remove rumbling of muted strokes from a heavily distorted guitar. it needs two input streams and returns one output stream. the first input stream will be processed depending on the second stream's signal.

the filter accepts these options:

  • level_in โ€” sets the input level before filtering. default is 1. allowed range is from 0.015625 to 64.
  • mode โ€” sets the mode of operation. can be upward or downward. default is downward. if set to upward mode, higher parts of the signal will be amplified, expanding the dynamic range in the upward direction. otherwise, in the case of downward, the lower parts of the signal will be reduced.
  • range โ€” sets the level of gain reduction when the signal is below the threshold. default is 0.06125. allowed range is from 0 to 1. setting this to 0 disables reduction and then the filter behaves like an expander.
  • threshold โ€” if a signal rises above this level the gain reduction is released. default is 0.125. allowed range is from 0 to 1.
  • ratio โ€” sets a ratio about which the signal is reduced. default is 2. allowed range is from 1 to 9000.
  • attack โ€” amount of milliseconds the signal has to rise above the threshold before gain reduction stops. default is 20 milliseconds. allowed range is from 0.01 to 9000.
  • release โ€” amount of milliseconds the signal has to fall below the threshold before the reduction is increased again. default is 250 milliseconds. allowed range is from 0.01 to 9000.
  • makeup โ€” sets the amount of amplification of the signal after processing. default is 1. allowed range is from 1 to 64.
  • knee โ€” curves the sharp knee around the threshold so you enter gain reduction more softly ๐ŸŒธ default is 2.828427125. allowed range is from 1 to 8.
  • detection โ€” choose if the exact signal should be taken for detection, or an RMS-like one. default is rms. can be peak or rms.
  • link โ€” choose if the average level between all channels, or the louder channel, affects the reduction. default is average. can be average or maximum.
  • level_sc โ€” sets sidechain gain. default is 1. range is from 0.015625 to 64.

Commands

this filter supports all the above options as commands too ๐Ÿซถ


๐Ÿคซ silencedetect

detects silence in an audio stream. main character behaviour honestly.

this filter logs a message when it detects that the input audio volume is less than or equal to a noise tolerance value, for a duration greater than or equal to the minimum detected noise duration.

the printed times and duration are expressed in seconds โฑ๏ธ the lavfi.silence_start or lavfi.silence_start.X metadata key is set on the first frame whose timestamp equals or exceeds the detection duration, and it contains the timestamp of the first frame of the silence.

the lavfi.silence_duration or lavfi.silence_duration.X and lavfi.silence_end or lavfi.silence_end.X metadata keys are set on the first frame after the silence. if mono is enabled, and each channel is evaluated separately, the .X suffixed keys are used, and X corresponds to the channel number.

the filter accepts these options:

  • noise, n โ€” sets noise tolerance. can be specified in dB (in case dB is appended to the specified value) or as an amplitude ratio. default is -60dB, or 0.001.
  • duration, d โ€” sets silence duration until notification (default is 2 seconds). see the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax.
  • mono, m โ€” process each channel separately, instead of combined. by default it's disabled.

Examples

  • detect 5 seconds of silence with -50dB noise tolerance:
silencedetect=n=-50dB:d=5
  • complete example with ffmpeg to detect silence with 0.0001 noise tolerance in silence.mp3:
ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -f null -

โœ‚๏ธ silenceremove

removes silence from the beginning, middle or end of the audio. it's giving cleanup era ๐Ÿงน

the filter accepts these options:

  • start_periods โ€” this value is used to indicate if audio should be trimmed at the beginning of the audio. a value of zero indicates no silence should be trimmed from the beginning. when specifying a non-zero value, it trims audio up until it finds non-silence. normally, when trimming silence from the beginning of audio the start_periods will be 1, but it can be increased to higher values to trim all audio up to a specific count of non-silence periods. default value is 0.
  • start_duration โ€” specify the amount of time that non-silence must be detected before it stops trimming audio. by increasing the duration, bursts of noises can be treated as silence and trimmed off. default value is 0.
  • start_threshold โ€” this indicates what sample value should be treated as silence. for digital audio, a value of 0 may be fine, but for audio recorded from analog, you may wish to increase the value to account for background noise. can be specified in dB (in case dB is appended to the specified value) or as an amplitude ratio. default value is 0.
  • start_silence โ€” specify max duration of silence at the beginning that will be kept after trimming. default is 0, which is equal to trimming all samples detected as silence.
  • start_mode โ€” specify mode of detection of silence end at the start of multi-channel audio. can be any or all. default is any. with any, any sample from any channel that is detected as non-silence will trigger the end of silence trimming at the start of the audio stream. with all, only if every sample from every channel is detected as non-silence will it trigger the end of silence trimming at the start of the audio stream โ€” limited usage, ngl.
  • stop_periods โ€” sets the count for trimming silence from the end of audio. when specifying a positive value, it trims audio after it finds the specified silence period. to remove silence from the middle of a file, specify a stop_periods that is negative. this value is then treated as a positive value and is used to indicate the effect should restart processing as specified by stop_periods, making it suitable for removing periods of silence in the middle of the audio. default value is 0.
  • stop_duration โ€” specify a duration of silence that must exist before audio is not copied any more. by specifying a higher duration, silence that is wanted can be left in the audio. default value is 0.

okay continuing the silenceremove options, bestie โ€” we are still in the thick of it and honestly it's giving "one more thing" energy ๐Ÿ’…

  • stop_threshold โ€” this is the same as start_threshold but for trimming silence from the end of the audio. Can be specified in dB (in case "dB" is appended to the specified value) or amplitude ratio. Default value is 0.
  • stop_silence โ€” specify max duration of silence at the end that will be kept after trimming. Default is 0, which is equal to trimming all samples detected as silence.
  • stop_mode โ€” specify mode of detection of silence start after start of multi-channel audio. Can be any or all. Default is all. With any, any sample from any channel that is detected as silence will trigger start of silence trimming after start of audio stream, limited usage. With all, only if every sample from every channel is detected as silence will trigger start of silence trimming after start of audio stream. fr fr, all is the strict one.
  • detection โ€” set how silence is detected. The options are literally these:
    • avg โ€” mean of absolute values of samples in moving window.
    • rms โ€” root squared mean of absolute values of samples in moving window.
    • peak โ€” maximum of absolute values of samples in moving window.
    • median โ€” median of absolute values of samples in moving window.
    • ptp โ€” absolute of max peak to min peak difference of samples in moving window.
    • dev โ€” standard deviation of values of samples in moving window. Default value is "rms".
  • window โ€” set duration in number of seconds used to calculate size of window in number of samples for detecting silence. Using 0 will effectively disable any windowing and use only single sample per channel for silence detection. In that case it may be needed to also set start_silence and/or stop_silence to nonzero values with also start_duration and/or stop_duration to nonzero values. Default value is 0.02. Allowed range is from 0 to 10.
  • timestamp โ€” set processing mode of every audio frame output timestamp. Options are:
    • write โ€” full timestamps rewrite, keep only the start time for the first output frame.
    • copy โ€” non-dropped frames are left with same timestamp as input audio frame. Defaults value is "write".

Examples

  • The following example shows how this filter can be used to start a recording that does not contain the delay at the start which usually occurs between pressing the record button and the start of the performance:
silenceremove=start_periods=1:start_duration=5:start_threshold=0.02
  • Trim all silence encountered from beginning to end where there is more than 1 second of silence in audio:
silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB
  • Trim all digital silence samples, using peak detection, from beginning to end where there is more than 0 samples of digital silence in audio and digital silence is detected in all channels at same positions in stream:
silenceremove=window=0:detection=peak:stop_mode=all:start_mode=all:stop_periods=-1:stop_threshold=0
  • Trim every 2nd encountered silence period from beginning to end where there is more than 1 second of silence per silence period in audio:
silenceremove=stop_periods=-2:stop_duration=1:stop_threshold=-90dB
  • Similar as above, but keep maximum of 0.5 seconds of silence from each trimmed period:
silenceremove=stop_periods=-2:stop_duration=1:stop_threshold=-90dB:stop_silence=0.5
  • Similar as above, but keep maximum of 1.5 seconds of silence from start of audio:
silenceremove=stop_periods=-2:stop_duration=1:stop_threshold=-90dB:stop_silence=0.5:start_periods=1:start_duration=1:start_silence=1.5:stop_threshold=-90dB

Commands

This filter supports some above options as commands. cute.


๐ŸŽง sofalizer ๐ŸŽง

SOFAlizer uses head-related transfer functions (HRTFs) to create virtual loudspeakers around the user for binaural listening via headphones (audio formats up to 9 channels supported). The HRTFs are stored in SOFA files (see http://www.sofacoustics.org/ for a database). SOFAlizer is developed at the Acoustics Research Institute (ARI) of the Austrian Academy of Sciences. iconic academic behavior ๐ŸŽ€

To enable compilation of this filter you need to configure FFmpeg with --enable-libmysofa.

The filter accepts the following options:

  • sofa โ€” set the SOFA file used for rendering.
  • gain โ€” set gain applied to audio. Value is in dB. Default is 0.
  • rotation โ€” set rotation of virtual loudspeakers in deg. Default is 0.
  • elevation โ€” set elevation of virtual speakers in deg. Default is 0.
  • radius โ€” set distance in meters between loudspeakers and the listener with near-field HRTFs. Default is 1.
  • type โ€” set processing type. Can be time or freq. time is processing audio in time domain which is slow. freq is processing audio in frequency domain which is fast. Default is freq.
  • speakers โ€” set custom positions of virtual loudspeakers. Syntax for this option is: <CH> <AZIM> <ELEV>[|<CH> <AZIM> <ELEV>|...]. Each virtual loudspeaker is described with short channel name following with azimuth and elevation in degrees. Each virtual loudspeaker description is separated by '|'. For example to override front left and front right channel positions use: 'speakers=FL 45 15|FR 345 15'. Descriptions with unrecognised channel names are ignored.
  • lfegain โ€” set custom gain for LFE channels. Value is in dB. Default is 0.
  • framesize โ€” set custom frame size in number of samples. Default is 1024. Allowed range is from 1024 to 96000. Only used if option type is set to freq.
  • normalize โ€” should all IRs be normalized upon importing SOFA file. By default is enabled.
  • interpolate โ€” should nearest IRs be interpolated with neighbor IRs if exact position does not match. By default is disabled.
  • minphase โ€” minphase all IRs upon loading of SOFA file. By default is disabled.
  • anglestep โ€” set neighbor search angle step. Only used if option interpolate is enabled.
  • radstep โ€” set neighbor search radius step. Only used if option interpolate is enabled.

Examples

  • Using ClubFritz6 sofa file:
sofalizer=sofa=/path/to/ClubFritz6.sofa:type=freq:radius=1
  • Using ClubFritz12 sofa file and bigger radius with small rotation:
sofalizer=sofa=/path/to/ClubFritz12.sofa:type=freq:radius=2:rotation=5
  • Similar as above but with custom speaker positions for front left, front right, back left and back right and also with custom gain:
"sofalizer=sofa=/path/to/ClubFritz6.sofa:type=freq:radius=2:speakers=FL 45|FR 315|BL 135|BR 225:gain=28"

๐Ÿ—ฃ๏ธ speechnorm ๐Ÿ—ฃ๏ธ

Speech Normalizer. say it with me: speech normalizer โœจ

This filter expands or compresses each half-cycle of audio samples (local set of samples all above or all below zero and between two nearest zero crossings) depending on threshold value, so audio reaches target peak value under conditions controlled by below options.

The filter accepts the following options:

  • peak, p โ€” set the expansion target peak value. This specifies the highest allowed absolute amplitude level for the normalized audio input. Default value is 0.95. Allowed range is from 0.0 to 1.0.
  • expansion, e โ€” set the maximum expansion factor. Allowed range is from 1.0 to 50.0. Default value is 2.0. This option controls maximum local half-cycle of samples expansion. The maximum expansion would be such that local peak value reaches target peak value but never to surpass it and that ratio between new and previous peak value does not surpass this option value.
  • compression, c โ€” set the maximum compression factor. Allowed range is from 1.0 to 50.0. Default value is 2.0. This option controls maximum local half-cycle of samples compression. This option is used only if threshold option is set to value greater than 0.0, then in such cases when local peak is lower or same as value set by threshold all samples belonging to that peak's half-cycle will be compressed by current compression factor.
  • threshold, t โ€” set the threshold value. Default value is 0.0. Allowed range is from 0.0 to 1.0. This option specifies which half-cycles of samples will be compressed and which will be expanded. Any half-cycle samples with their local peak value below or same as this option value will be compressed by current compression factor, otherwise, if greater than threshold value they will be expanded with expansion factor so that it could reach peak target value but never surpass it.
  • raise, r โ€” set the expansion raising amount per each half-cycle of samples. Default value is 0.001. Allowed range is from 0.0 to 1.0. This controls how fast expansion factor is raised per each new half-cycle until it reaches expansion value. Setting this options too high may lead to distortions. pls be careful, bestie ๐Ÿ˜ญ
  • fall, f โ€” set the compression raising amount per each half-cycle of samples. Default value is 0.001. Allowed range is from 0.0 to 1.0. This controls how fast compression factor is raised per each new half-cycle until it reaches compression value.
  • channels, h โ€” specify which channels to filter, by default all available channels are filtered.
  • invert, i โ€” enable inverted filtering, by default is disabled. This inverts interpretation of threshold option. When enabled any half-cycle of samples with their local peak value below or same as threshold option will be expanded otherwise it will be compressed.
  • link, l โ€” link channels when calculating gain applied to each filtered channel sample, by default is disabled. When disabled each filtered channel gain calculation is independent, otherwise when this option is enabled the minimum of all possible gains for each filtered channel is used.
  • rms, m โ€” set the expansion target RMS value. This specifies the highest allowed RMS level for the normalized audio input. Default value is 0.0, thus disabled. Allowed range is from 0.0 to 1.0.

Commands

This filter supports the all above options as commands. yes, all of them ๐Ÿ‘‘

Examples

  • Weak and slow amplification:
speechnorm=e=3:r=0.00001:l=1
  • Moderate and slow amplification:
speechnorm=e=6.25:r=0.00001:l=1
  • Strong and fast amplification:
speechnorm=e=12.5:r=0.0001:l=1
  • Very strong and fast amplification:
speechnorm=e=25:r=0.0001:l=1
  • Extreme and fast amplification:
speechnorm=e=50:r=0.0001:l=1

stereotools ๐ŸŽ›๏ธ

Okay bestie, this filter is literally the Swiss Army knife of stereo management ๐Ÿ’… It's got handy utilities for managing stereo signals โ€” converting M/S stereo recordings to L/R while keeping full control over the parameters, or spreading the stereo image of your master track. Iconic.

The filter accepts the following options:

  • level_in โ€” sets the input level before filtering, for both channels. Default is 1. Allowed range is 0.015625 to 64.
  • level_out โ€” sets the output level after filtering, for both channels. Default is 1. Allowed range is 0.015625 to 64.
  • balance_in โ€” sets the input balance between both channels. Default is 0. Allowed range is -1 to 1.
  • balance_out โ€” sets the output balance between both channels. Default is 0. Allowed range is -1 to 1.
  • softclip โ€” enables softclipping ๐Ÿซถ which gives you analog distortion instead of that harsh digital 0dB clipping. Disabled by default.
  • mutel โ€” mutes the left channel. Disabled by default.
  • muter โ€” mutes the right channel. Disabled by default.
  • phasel โ€” changes the phase of the left channel. Disabled by default.
  • phaser โ€” changes the phase of the right channel. Disabled by default.
  • mode โ€” sets the stereo mode. The available values are:
    • lr>lr โ€” Left/Right to Left/Right. This is the default, no cap.
    • lr>ms โ€” Left/Right to Mid/Side.
    • ms>lr โ€” Mid/Side to Left/Right.
    • lr>ll โ€” Left/Right to Left/Left.
    • lr>rr โ€” Left/Right to Right/Right.
    • lr>l+r โ€” Left/Right to Left + Right.
    • lr>rl โ€” Left/Right to Right/Left.
    • ms>ll โ€” Mid/Side to Left/Left.
    • ms>rr โ€” Mid/Side to Right/Right.
    • ms>rl โ€” Mid/Side to Right/Left.
    • lr>l-r โ€” Left/Right to Left โˆ’ Right.
  • slev โ€” sets the level of the side signal. Default is 1. Allowed range is 0.015625 to 64.
  • sbal โ€” sets the balance of the side signal. Default is 0. Allowed range is -1 to 1.
  • mlev โ€” sets the level of the middle signal. Default is 1. Allowed range is 0.015625 to 64.
  • mpan โ€” sets the middle signal pan. Default is 0. Allowed range is -1 to 1.
  • base โ€” sets the stereo base between mono and inversed channels. Default is 0. Allowed range is -1 to 1.
  • delay โ€” sets the delay in milliseconds, like, how much to delay the left from the right channel and vice versa. Default is 0. Allowed range is -20 to 20.
  • sclevel โ€” sets the S/C level. Default is 1. Allowed range is 1 to 100.
  • phase โ€” sets the stereo phase in degrees. Default is 0. Allowed range is 0 to 360.
  • bmode_in, bmode_out โ€” set the balance mode for the balance_in/balance_out options. Can be one of the following:
    • balance โ€” classic balance mode, attenuating one channel at a time. Gain is raised up to 1.
    • amplitude โ€” similar to the classic mode above, but the gain is raised up to 2.
    • power โ€” equal power distribution, from -6dB to +6dB range.

Commands โŒจ๏ธ

This filter supports, like, all the above options as commands. Every single one. Slay.

Examples โœจ

  • Apply a karaoke-like effect ๐ŸŽค:
stereotools=mlev=0.015625
  • Convert an M/S signal to L/R:
"stereotools=mode=ms>lr"

stereowiden ๐ŸŒˆ

This filter enhances the stereo effect by suppressing the signal that's common to both channels, and by delaying the signal of the left into the right and vice versa โ€” thereby widening the stereo effect. It's giving expansive. Obsessed.

The filter accepts the following options:

  • delay โ€” time in milliseconds of the delay of the left signal into the right and vice versa. Default is 20 milliseconds.
  • feedback โ€” amount of gain in the delayed signal into the right and vice versa. Gives a delay effect of the left signal in the right output and vice versa, which gives that widening effect. Default is 0.3.
  • crossfeed โ€” cross feed of the left into the right with inverted phase. This helps suppress the mono ๐Ÿซถ If the value is 1 it will cancel all the signal common to both channels. Default is 0.3.
  • drymix โ€” sets the level of the input signal of the original channel. Default is 0.8.

Commands โŒจ๏ธ

This filter supports all the above options except delay as commands. Not that one. The others, yes. ๐Ÿ’…


superequalizer ๐ŸŽš๏ธ

Applies an 18 band equalizer. Eighteen. Bands. That's not a typo, bestie, that's range.

The filter accepts the following options:

  • 1b โ€” set 65Hz band gain.
  • 2b โ€” set 92Hz band gain.
  • 3b โ€” set 131Hz band gain.
  • 4b โ€” set 185Hz band gain.
  • 5b โ€” set 262Hz band gain.
  • 6b โ€” set 370Hz band gain.
  • 7b โ€” set 523Hz band gain.
  • 8b โ€” set 740Hz band gain.
  • 9b โ€” set 1047Hz band gain.
  • 10b โ€” set 1480Hz band gain.
  • 11b โ€” set 2093Hz band gain.
  • 12b โ€” set 2960Hz band gain.
  • 13b โ€” set 4186Hz band gain.
  • 14b โ€” set 5920Hz band gain.
  • 15b โ€” set 8372Hz band gain.
  • 16b โ€” set 11840Hz band gain.
  • 17b โ€” set 16744Hz band gain.
  • 18b โ€” set 20000Hz band gain.

surround ๐ŸŒ€

Applies the audio surround upmix filter. This one lets you produce multichannel output from an audio stream โ€” main character energy for your stereo file.

The filter accepts the following options:

  • chl_out โ€” sets the output channel layout. By default, this is 5.1. See the Channel Layout section in the ffmpeg-utils(1) manual for the required syntax.
  • chl_in โ€” sets the input channel layout. By default, this is stereo. See the Channel Layout section in the ffmpeg-utils(1) manual for the required syntax.
  • level_in โ€” sets the input volume level. By default, this is 1.
  • level_out โ€” sets the output volume level. By default, this is 1.
  • lfe โ€” enable LFE channel output if the output channel layout has it. By default, this is enabled.
  • lfe_low โ€” sets the LFE low cut off frequency. By default, this is 128 Hz.
  • lfe_high โ€” sets the LFE high cut off frequency. By default, this is 256 Hz.
  • lfe_mode โ€” sets the LFE mode, can be add or sub. Default is add. In add mode, the LFE channel is created from the input audio and added to the output. In sub mode, the LFE channel is created from the input audio and added to the output, but also all non-LFE output channels are subtracted with the output LFE channel. Wild but true.
  • smooth โ€” sets the temporal smoothness strength, used to gradually change factors when transforming stereo sound in time. Allowed range is from 0.0 to 1.0. Useful to improve output quality with focus option values greater than 0.0. Default is 0.0. Only values inside this range and without edges are effective โ€” so, like, no edge cases, literally.
  • angle โ€” sets the angle of the stereo surround transform. Allowed range is from 0 to 360. Default is 90.
  • focus โ€” sets the focus of the stereo surround transform. Allowed range is from -1 to 1. Default is 0.
  • fc_in โ€” sets the front center input volume. By default, this is 1.
  • fc_out โ€” sets the front center output volume. By default, this is 1.
  • fl_in โ€” sets the front left input volume. By default, this is 1.
  • fl_out โ€” sets the front left output volume. By default, this is 1.
  • fr_in โ€” sets the front right input volume. By default, this is 1.
  • fr_out โ€” sets the front right output volume. By default, this is 1.
  • sl_in โ€” sets the side left input volume. By default, this is 1.
  • sl_out โ€” sets the side left output volume. By default, this is 1.
  • sr_in โ€” sets the side right input volume. By default, this is 1.
  • sr_out โ€” sets the side right output volume. By default, this is 1.
  • bl_in โ€” sets the back left input volume. By default, this is 1.
  • bl_out โ€” sets the back left output volume. By default, this is 1.
  • br_in โ€” sets the back right input volume. By default, this is 1.
  • br_out โ€” sets the back right output volume. By default, this is 1.
  • bc_in โ€” sets the back center input volume. By default, this is 1.
  • bc_out โ€” sets the back center output volume. By default, this is 1.
  • lfe_in โ€” sets the LFE input volume. By default, this is 1.
  • lfe_out โ€” sets the LFE output volume. By default, this is 1.
  • allx โ€” sets the spread usage of the stereo image across the X axis for all channels. Allowed range is from -1 to 15. By default this value is negative -1, and thus unused.
  • ally โ€” sets the spread usage of the stereo image across the Y axis for all channels. Allowed range is from -1 to 15. By default this value is negative -1, and thus unused.
  • fcx, flx, frx, blx, brx, slx, srx, bcx โ€” set the spread usage of the stereo image across the X axis for each channel. Allowed range is from 0.06 to 15. By default this value is 0.5.
  • fcy, fly, fry, bly, bry, sly, sry, bcy โ€” set the spread usage of the stereo image across the Y axis for each channel. Allowed range is from 0.06 to 15. By default this value is 0.5.
  • win_size โ€” sets the window size. Allowed range is from 1024 to 65536. Default size is 4096.
  • win_func โ€” sets the window function. It accepts the following values:
    • rect
    • bartlett
    • hann, hanning
    • hamming
    • blackman
    • welch
    • flattop
    • bharris
    • bnuttall
    • bhann
    • sine
    • nuttall
    • lanczos
    • gauss
    • tukey
    • dolph
    • cauchy
    • parzen
    • poisson
    • bohman
    • kaiser

Default is "hann" ๐ŸŽ€

  • overlap โ€” sets the window overlap. If set to 1, the recommended overlap for the selected window function will be picked. Default is 0.5.

tiltshelf ๐Ÿฆ‹

Boosts or cuts the lower frequencies and cuts or boosts the higher frequencies of the audio using a two-pole shelving filter, with a response similar to that of a standard hi-fi's tone-controls. This is also known as shelving equalisation (EQ). Very retro-cool of it.

The filter accepts the following options:

  • gain, g โ€” give the gain at 0 Hz. Its useful range is about -20 (for a large cut) to +20 (for a large boost). โš ๏ธ Beware of clipping when using a positive gain โ€” she will peak, and not in the cute way.
  • frequency, f โ€” sets the filter's central frequency, so it can be used to extend or reduce the frequency range to be boosted or cut. The default value is 3000 Hz.
  • width_type, t โ€” sets the method used to specify the band-width of the filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” determines how steep the filter's shelf transition is.
  • poles, p โ€” sets the number of poles. Default is 2.
  • mix, m โ€” how much to use the filtered signal in the output. Default is 1. Range is between 0 and 1.
  • channels, c โ€” specify which channels to filter; by default, all available are filtered.
  • normalize, n โ€” normalizes the biquad coefficients; by default this is disabled. Enabling it will normalize the magnitude response at DC to 0dB.
  • transform, a โ€” sets the transform type of the IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” sets how precise the filtering math gets to be โœจ
    • auto โ€” just picks the sample format automatically based on the surround filters, no thoughts head empty ๐Ÿ’…
    • s16 โ€” always signed 16-bit
    • s32 โ€” always signed 32-bit
    • f32 โ€” always float 32-bit
    • f64 โ€” always float 64-bit
  • block_size, b โ€” the block size used for reverse IIR processing ๐Ÿงš set this high enough (higher than the impulse response length truncated when it reaches near-zero values) and the filtering goes linear phase, which is the dream ๐Ÿ’– but if it's not big enough you just get nasty artifacts, and nobody wants that ๐Ÿ˜ญ
heads up bestie: when you set this to a non-zero value, the filter delay will be exactly this many samples. no cap.

Commands ๐Ÿ’ฌ

This filter supports some options as commands. iykyk ๐Ÿซถ


๐ŸŽ€ treble, highshelf ๐ŸŽ€

Boosts or cuts the treble (upper) frequencies of your audio, using a two-pole shelving filter with a response similar to a standard hi-fi's tone-controls ๐ŸŽ›๏ธ this is also known as shelving equalisation (EQ), and it's lowkey iconic.

The filter accepts the following options:

  • gain, g โ€” gives the gain at whichever is the lower of ~22 kHz and the Nyquist frequency ๐ŸŒธ its useful range is about -20 (big cut) to +20 (big boost), but beware of clipping when you use a positive gain, fr fr โš ๏ธ
  • frequency, f โ€” sets the filter's central frequency, so you can extend or reduce the frequency range being boosted or cut. default value is 3000 Hz ๐Ÿฆ‹
  • width_type, t โ€” the method used to specify the band-width of the filter:
    • h โ€” Hz
    • q โ€” Q-Factor
    • o โ€” octave
    • s โ€” slope
    • k โ€” kHz
  • width, w โ€” determines how steep the filter's shelf transition is ๐Ÿ“
  • poles, p โ€” sets the number of poles. default is 2 ๐ŸŽš๏ธ
  • mix, m โ€” how much of the filtered signal goes into the output. default is 1. range is between 0 and 1 ๐Ÿ’œ
  • channels, c โ€” specify which channels get filtered; by default all available channels are filtered ๐ŸŒˆ
  • normalize, n โ€” normalizes the biquad coefficients; by default this is disabled ๐Ÿšซ enabling it will normalize the magnitude response at DC to 0dB, slay
  • transform, a โ€” sets the transform type of the IIR filter:
    • di
    • dii
    • tdi
    • tdii
    • latt
    • svf
    • zdf
  • precision, r โ€” sets precision of filtering โœจ
    • auto โ€” picks automatic sample format depending on surround filters
    • s16 โ€” always use signed 16-bit
    • s32 โ€” always use signed 32-bit
    • f32 โ€” always use float 32-bit
    • f64 โ€” always use float 64-bit
  • block_size, b โ€” sets the block size used for reverse IIR processing ๐Ÿงš set it to a high enough value (higher than the impulse response length truncated when it reaches near-zero values) and the filtering becomes linear phase โ€” otherwise, if it's not big enough, it'll just produce nasty artifacts ๐Ÿ˜ญ
note that the filter delay will be exactly this many samples when set to a non-zero value. periodt.

Commands ๐Ÿ’ฌ

This filter supports the following commands:

  • frequency, f โ€” change treble frequency. syntax for the command is: "frequency" ๐ŸŽต
  • width_type, t โ€” change treble width_type. syntax for the command is: "width_type"
  • width, w โ€” change treble width. syntax for the command is: "width"
  • gain, g โ€” change treble gain. syntax for the command is: "gain"
  • mix, m โ€” change treble mix. syntax for the command is: "mix"

๐ŸŒธ tremolo ๐ŸŒธ

Sinusoidal amplitude modulation โ€” it's giving vintage amps, it's giving "let me wiggle the volume real quick" ๐Ÿ’ซ

The filter accepts the following options:

  • f โ€” modulation frequency in Hertz ๐ŸŽต modulation frequencies in the subharmonic range (20 Hz or lower) will give you a tremolo effect. this filter may also be used as a ring modulator by specifying a modulation frequency higher than 20 Hz. range is 0.1 - 20000.0. default value is 5.0 Hz.
  • d โ€” depth of modulation as a percentage. range is 0.0 - 1.0. default value is 0.5 ๐ŸŒŠ

๐Ÿฆ‹ vibrato ๐Ÿฆ‹

Sinusoidal phase modulation โ€” yes it's tremolo's cousin, no they're not the same thing, and yes it's gorgeous ๐Ÿ’–

The filter accepts the following options:

  • f โ€” modulation frequency in Hertz. range is 0.1 - 20000.0. default value is 5.0 Hz ๐ŸŽถ
  • d โ€” depth of modulation as a percentage. range is 0.0 - 1.0. default value is 0.5 ๐ŸŒŠ

๐Ÿ”ฅ virtualbass ๐Ÿ”ฅ

Applies the audio Virtual Bass filter โ€” the moment where your stereo suddenly grows a subwoofer ๐Ÿ‘‘

This filter accepts stereo input and produces stereo with LFE (2.1) channels output ๐ŸŽง the newly produced LFE channel has enhanced virtual bass, originally obtained from both stereo channels. and the filter outputs the front left and front right channels unchanged, exactly as they were in the stereo input โ€” no notes, no edits, main character energy only โœจ

The filter accepts the following options:

  • cutoff โ€” sets the virtual bass cutoff frequency. default value is 250 Hz. allowed range is from 100 to 500 Hz ๐Ÿ“
  • strength โ€” sets the virtual bass strength. allowed range is from 0.5 to 3. default value is 3 ๐Ÿ’ช

๐Ÿ’œ volume ๐Ÿ’œ

Adjusts the input audio volume. the simplest filter with the most drama, honestly ๐Ÿ˜Œ

It accepts the following parameters:

  • volume โ€” sets the audio volume expression ๐ŸŽš๏ธ

Output values are clipped to the maximum value.

The output audio volume is given by the relation:

<output_volume> = <volume> * <input_volume>

The default value for volume is "1.0".

  • precision โ€” this parameter represents the mathematical precision ๐Ÿ”ฌ it determines which input sample formats will be allowed, which affects the precision of the volume scaling:
    • fixed โ€” 8-bit fixed-point; this limits input sample format to U8, S16, and S32.
    • float โ€” 32-bit floating-point; this limits input sample format to FLT. (default)
    • double โ€” 64-bit floating-point; this limits input sample format to DBL.
  • replaygain โ€” chooses the behaviour on encountering ReplayGain side data in input frames ๐Ÿ‘€
    • drop โ€” remove ReplayGain side data, ignoring its contents (the default).
    • ignore โ€” ignore ReplayGain side data, but leave it in the frame.
    • track โ€” prefer the track gain, if present.
    • album โ€” prefer the album gain, if present.
  • replaygain_preamp โ€” pre-amplification gain in dB to apply to the selected replaygain gain ๐Ÿ”Š default value for replaygain_preamp is 0.0.
  • replaygain_noclip โ€” prevents clipping by limiting the gain applied โœ‚๏ธ default value for replaygain_noclip is 1.
  • eval โ€” sets when the volume expression is evaluated โฐ it accepts the following values:
    • once โ€” only evaluate the expression once during filter initialization, or when the volume command is sent
    • frame โ€” evaluate the expression for each incoming frame

Default value is once.

The volume expression can contain the following parameters ๐Ÿงฎ

  • n โ€” frame number (starting at zero)
  • nb_channels โ€” number of channels
  • nb_consumed_samples โ€” number of samples consumed by the filter
  • nb_samples โ€” number of samples in the current frame
  • pos โ€” original frame position in the file; deprecated, do not use ๐Ÿ’€
  • pts โ€” frame PTS
  • sample_rate โ€” sample rate
  • startpts โ€” PTS at start of stream
  • startt โ€” time at start of stream
  • t โ€” frame time
  • tb โ€” timestamp timebase
  • volume โ€” last set volume value
note that when eval is set to once, only the sample_rate and tb variables are available โ€” all other variables will evaluate to NAN ๐Ÿ™ˆ

Commands ๐Ÿ’ฌ

This filter supports the following commands:

  • volume โ€” modify the volume expression. the command accepts the same syntax as the corresponding option ๐Ÿซถ

If the specified expression isn't valid, it's kept at its current value.

Examples โœจ

  • Halve the input audio volume ๐ŸŽ€
volume=volume=0.5
volume=volume=1/2
volume=volume=-6.0206dB

In all of the above examples the named key for volume can be omitted, for example like in:

volume=0.5
  • Increase input audio power by 6 decibels using fixed-point precision ๐Ÿ”ฅ
volume=volume=6dB:precision=fixed
  • Fade volume after time 10 with an annihilation period of 5 seconds ๐ŸŒˆ
volume='if(lt(t,10),1,max(1-(t-10)/5,0))':eval=frame

๐Ÿ“ volumedetect ๐Ÿ“

Detects the volume of the input video โ€” yes, that's what the original says, and yes we're keeping it verbatim because facts are facts ๐Ÿ’…

The filter has no parameters. It supports only 16-bit signed integer samples, so the input will be converted when needed ๐Ÿ”„ statistics about the volume will be printed in the log when the input stream end is reached.

In particular it'll show the mean volume (root mean square), the maximum volume (on a per-sample basis), and the beginning of a histogram of the registered volume values (from the maximum value to a cumulated 1/1000 of the samples) ๐Ÿ“Š

All volumes are in decibels relative to the maximum PCM value ๐Ÿ”‰

Examples โœจ

Here's an excerpt of the output:

[Parsed_volumedetect_0  0xa23120] mean_volume: -27 dB
[Parsed_volumedetect_0  0xa23120] max_volume: -4 dB
[Parsed_volumedetect_0  0xa23120] histogram_4db: 6
[Parsed_volumedetect_0  0xa23120] histogram_5db: 62
[Parsed_volumedetect_0  0xa23120] histogram_6db: 286
[Parsed_volumedetect_0  0xa23120] histogram_7db: 1042
[Parsed_volumedetect_0  0xa23120] histogram_8db: 2551
[Parsed_volumedetect_0  0xa23120] histogram_9db: 4609
[Parsed_volumedetect_0  0xa23120] histogram_10db: 8409

It means that:

  • The mean square energy is approximately -27 dB, or 10^-2.7 ๐ŸŒฑ
  • The largest sample is at -4 dB, or more precisely between -4 dB and -5 dB ๐Ÿ“
  • There are 6 samples at -4 dB, 62 at -5 dB, 286 at -6 dB, etc.

In other words, raising the volume by +4 dB doesn't cause any clipping, raising it by +5 dB causes clipping for 6 samples, etc. ๐Ÿ’€


๐Ÿงš whisper ๐Ÿงš

It runs automatic speech recognition using the OpenAI's Whisper model โ€” yes, actual transcription, in your ffmpeg, we love to see it ๐Ÿ‘‘

It requires the whisper.cpp library (https://github.com/ggml-org/whisper.cpp) as a prerequisite. after installing the library it can be enabled using: ./configure --enable-whisper ๐Ÿ› ๏ธ

The filter has the following options:

  • model โ€” the file path of the downloaded whisper.cpp model (mandatory) ๐Ÿ“ like, you literally can't skip this one bestie.
  • language โ€” the language to use for transcription ('auto' for auto-detect). default value: "auto" ๐ŸŒ
  • queue โ€” the max size that gets queued into the filter before whisper actually processes the audio ๐Ÿ’…. Small value = the audio stream gets processed more often, but bestie, the transcription quality drops and the processing power you need goes up ๐Ÿ˜ญ. Large value (like 10-20s) = way more accurate results using less CPU (same energy as using the whisper-cli tool), but the transcription latency goes up too, so it's not useful for real-time streams fr fr. Consider using the vad_model option together with a large queue value. Default value: "3"
  • use_gpu โ€” whether GPU support should be enabled. Default value: "true" โœจ
  • gpu_device โ€” the GPU device index to use. Default value: "0"
  • destination โ€” if set, the transcription output gets sent to the specified file or URL (use one of the FFmpeg AVIO protocols); otherwise the output is just logged as info messages. The output will also be set in the "lavfi.whisper.text" frame metadata ๐ŸŽ€. If the destination is a file and it already exists, it will be overwritten ๐Ÿ’€.
  • format โ€” the destination format string; it could be "text" (only the transcribed text gets sent to the destination), "srt" (subtitle format) or "json". Default value: "text"
  • max_len โ€” maximum segment length in characters. When set to a value greater than 0, transcription segments get split so they don't exceed this length. Super useful for generating subtitles with shorter lines ๐Ÿฆ‹. Default value: "0"
  • vad_model โ€” path to the VAD model file. If set, the filter loads an additional voice activity detection module (https://github.com/snakers4/silero-vad) that gets used to fragment the audio queue; use this option by setting a valid path obtained from the whisper.cpp repository (e.g. "../whisper.cpp/models/ggml-silero-v5.1.2.bin") and increase the queue parameter to a higher value (e.g. 20) ๐Ÿ‘‘
  • vad_threshold โ€” the VAD threshold to use. Default value: "0.5"
  • vad_min_speech_duration โ€” the minimum VAD speaking duration. Default value: "0.1"
  • vad_min_silence_duration โ€” the minimum VAD silence duration. Default value: "0.5"

โœจ Examples โœจ

  • Run a transcription with srt file generation:
ffmpeg -i input.mp4 -vn -af "whisper=model=../whisper.cpp/models/ggml-base.en.bin\
:language=en\
:queue=3\
:destination=output.srt\
:format=srt" -f null -
  • Run a transcription and send the output in JSON format to an HTTP service:
ffmpeg -i input.mp4 -vn -af "whisper=model=../whisper.cpp/models/ggml-base.en.bin\
:language=en\
:queue=3\
:destination=http\\://localhost\\:3000\
:format=json' -f null -
  • Transcribe the microphone input using the VAD option:
ffmpeg -loglevel warning -f pulse -i default \
-af 'highpass=f=200,lowpass=f=3000,whisper=model=../whisper.cpp/models/ggml-medium.bin\
:language=en\
:queue=10\
:destination=-\
:format=json\
:vad_model=../whisper.cpp/models/ggml-silero-v5.1.2.bin' -f null -

๐ŸŽง AUDIO SOURCES ๐ŸŽง

Okay so below is the description of all the currently available audio sources โ€” these are the places your audio can come from, bestie ๐ŸŒธ.

abuffer

Buffer audio frames, and make them available to the filter chain ๐Ÿ’–.

This source is mainly intended for a programmatic use, in particular through the interface defined in libavfilter/buffersrc.h.

It accepts the following parameters:

  • time_base โ€” the timebase that will be used for timestamps of submitted frames. It must be either a floating-point number or in numerator/denominator form.
  • sample_rate โ€” the sample rate of the incoming audio buffers.
  • sample_fmt โ€” the sample format of the incoming audio buffers. Either a sample format name or its corresponding integer representation from the enum AVSampleFormat in libavutil/samplefmt.h
  • channel_layout โ€” the channel layout of the incoming audio buffers. Either a channel layout name from channel_layout_map in libavutil/channel_layout.c or its corresponding integer representation from the AV_CH_LAYOUT_* macros in libavutil/channel_layout.h
  • channels โ€” the number of channels of the incoming audio buffers. If both channels and channel_layout are specified, then they must be consistent ๐Ÿ‘€.

Examples

abuffer=sample_rate=44100:sample_fmt=s16p:channel_layout=stereo

will instruct the source to accept planar 16bit signed stereo at 44100Hz ๐ŸŽ€. Since the sample format with name "s16p" corresponds to the number 6 and the "stereo" channel layout corresponds to the value 0x3, this is totally equivalent to:

abuffer=sample_rate=44100:sample_fmt=6:channel_layout=0x3

aevalsrc

Generate an audio signal specified by an expression โœจ.

This source accepts in input one or more expressions (one for each channel), which get evaluated and used to generate a corresponding audio signal.

This source accepts the following options:

  • exprs โ€” set the '|'-separated expressions list for each separate channel. In case the channel_layout option is not specified, the selected channel layout depends on the number of provided expressions. Otherwise the last specified expression gets applied to the remaining output channels.
  • channel_layout, c โ€” set the channel layout. The number of channels in the specified layout must be equal to the number of specified expressions.
  • duration, d โ€” set the minimum duration of the sourced audio. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. Note that the resulting duration may be greater than the specified duration, as the generated audio is always cut at the end of a complete frame ๐Ÿซถ.

If not specified, or the expressed duration is negative, the audio is supposed to be generated forever ๐Ÿ‘‘.

  • nb_samples, n โ€” set the number of samples per channel per each output frame, default to 1024.
  • sample_rate, s โ€” specify the sample rate, default to 44100.

Each expression in exprs can contain the following constants:

  • n โ€” number of the evaluated sample, starting from 0
  • t โ€” time of the evaluated sample expressed in seconds, starting from 0
  • s โ€” sample rate

Examples

  • Generate silence:
aevalsrc=0
  • Generate a sin signal with frequency of 440 Hz, set sample rate to 8000 Hz:
aevalsrc="sin(440*2*PI*t):s=8000"
  • Generate a two channels signal, specify the channel layout (Front Center + Back Center) explicitly:
aevalsrc="sin(420*2*PI*t)|cos(430*2*PI*t):c=FC|BC"
  • Generate white noise:
aevalsrc="-2+random(0)"
  • Generate an amplitude modulated signal:
aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)"
  • Generate 2.5 Hz binaural beats on a 360 Hz carrier:
aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) | 0.1*sin(2*PI*(360+2.5/2)*t)"

afdelaysrc

Generate a fractional delay FIR coefficients ๐Ÿ’….

The resulting stream can be used with the afir filter for filtering the audio signal.

The filter accepts the following options:

  • delay, d โ€” set the fractional delay. Default is 0.
  • sample_rate, r โ€” set the sample rate, default is 44100.
  • nb_samples, n โ€” set the number of samples per each frame. Default is 1024.
  • taps, t โ€” set the number of filter coefficients in output audio stream. Default value is 0.
  • channel_layout, c โ€” specifies the channel layout, and can be a string representing a channel layout. The default value of channel_layout is "stereo".

afireqsrc

Generate a FIR equalizer coefficients ๐Ÿฆ‹.

The resulting stream can be used with the afir filter for filtering the audio signal.

The filter accepts the following options:

  • preset, p โ€” set equalizer preset. Default preset is "flat".

Available presets are:

custom
flat
acoustic
bass
beats
classic
clear
deep bass
dubstep
electronic
hard-style
hip-hop
jazz
metal
movie
pop
r&b
rock
vocal booster
  • gains, g โ€” set custom gains for each band. Only used if the preset option is set to "custom". Gains are separated by white spaces and each gain is set in dBFS. Default is "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0".
  • bands, b โ€” set the custom bands from where custom equalizer gains are set. This must be in strictly increasing order. Only used if the preset option is set to "custom". Bands are separated by white spaces and each band represent frequency in Hz. Default is "25 40 63 100 160 250 400 630 1000 1600 2500 4000 6300 10000 16000 24000".
  • taps, t โ€” set number of filter coefficients in output audio stream. Default value is 4096.
  • sample_rate, r โ€” set sample rate of output audio stream, default is 44100.
  • nb_samples, n โ€” set number of samples per each frame in output audio stream. Default is 1024.
  • interp, i โ€” set interpolation method for FIR equalizer coefficients. Can be "linear" or "cubic".
  • phase, h โ€” set phase type of FIR filter. Can be "linear" or "min": minimum-phase. Default is minimum-phase filter.

afirsrc

Generate a FIR coefficients using frequency sampling method ๐ŸŒˆ.

The resulting stream can be used with the afir filter for filtering the audio signal.

The filter accepts the following options:

  • taps, t โ€” set number of filter coefficients in output audio stream. Default value is 1025.
  • frequency, f โ€” set frequency points from where magnitude and phase are set. This must be in non decreasing order, and first element must be 0, while last element must be 1. Elements are separated by white spaces.
  • magnitude, m โ€” set magnitude value for every frequency point set by frequency. Number of values must be same as number of frequency points. Values are separated by white spaces.
  • phase, p โ€” set phase value for every frequency point set by frequency. Number of values must be same as number of frequency points. Values are separated by white spaces.
  • sample_rate, r โ€” set sample rate, default is 44100.
  • nb_samples, n โ€” set number of samples per each frame. Default is 1024.
  • win_func, w โ€” set window function. Default is blackman.

anullsrc

The null audio source ๐Ÿ’€ โ€” it literally just hands you back audio frames exactly as they are, no processing, no drama. It's mostly a template girlie, and she eats in analysis/debugging tools, or as the source for filters that straight-up ignore their input data (looking at you, the sox synth filter).

This source accepts the following options:

  • channel_layout, cl โ€” bestie, tell it your channel layout: either an integer or a string representing one. Default is "stereo". Peep the channel_layout_map definition in libavutil/channel_layout.c for the mapping between strings and channel layout values, iykyk.
  • sample_rate, r โ€” the sample rate. Defaults to 44100.
  • nb_samples, n โ€” set the number of samples per requested frames.
  • duration, d โ€” how long the sourced audio lasts. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. If you don't specify it, or the duration you express is negative, the audio is supposed to be generated forever ๐Ÿซถ.

Examples

  • Set the sample rate to 48000 Hz and the channel layout to AV_CH_LAYOUT_MONO:
anullsrc=r=48000:cl=4
  • Do the same operation with a more obvious syntax:
anullsrc=r=48000:cl=mono
All the parameters need to be explicitly defined. No shortcuts, no vibes-based defaults โœจ

flite

Synthesize a voice utterance using the libflite library ๐ŸŽ€. To enable compilation of this filter you need to configure FFmpeg with --enable-libflite.

Real talk: versions of the flite library prior to 2.0 are not thread-safe. Old flite is giving chaos, not main character energy ๐Ÿ˜ญ

The filter accepts the following options:

  • list_voices โ€” if set to 1, list the names of the available voices and exit immediately. Default value is 0.
  • nb_samples, n โ€” set the maximum number of samples per frame. Default value is 512.
  • textfile โ€” set the filename containing the text to speak.
  • text โ€” set the text to speak.
  • voice, v โ€” the voice to use for the speech synthesis. Default value is "kal". See also the list_voices option ๐Ÿ‘‘

Examples

  • Read from file speech.txt, and synthesize the text using the standard flite voice:
flite=textfile=speech.txt
  • Read the specified text selecting the "slt" voice:
flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt
  • Input text to ffmpeg:
ffmpeg -f lavfi -i flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt
  • Make ffplay speak the specified text, using "flite" and the "lavfi" device:
ffplay -f lavfi flite=text='No more be grieved for which that thou hast done.'

For more information about libflite, check: http://www.festvox.org/flite/


anoisesrc

Generate a noise audio signal ๐ŸŒˆ โ€” the lofi-girl-radio-stream of filters, no cap.

The filter accepts the following options:

  • sample_rate, r โ€” specify the sample rate. Default value is 48000 Hz.
  • amplitude, a โ€” specify the amplitude (0.0 - 1.0) of the generated audio stream. Default value is 1.0.
  • duration, d โ€” specify the duration of the generated audio stream. Not specifying this option results in noise with an infinite length ๐Ÿ’€.
  • color, colour, c โ€” specify the color of noise. Available noise colors are white, pink, brown, blue, violet and velvet. Default color is white.
  • seed, s โ€” specify a value used to seed the PRNG.
  • nb_samples, n โ€” set the number of samples per each output frame, default is 1024.
  • density โ€” set the density (0.0 - 1.0) for the velvet noise generator, default is 0.05.

Examples

  • Generate 60 seconds of pink noise, with a 44.1 kHz sampling rate and an amplitude of 0.5:
anoisesrc=d=60:c=pink:r=44100:a=0.5

hilbert

Generate odd-tap Hilbert transform FIR coefficients ๐Ÿฆ‹.

The resulting stream can be used with the afir filter for phase-shifting the signal by 90 degrees.

This is used in many matrix coding schemes and for analytic signal generation. The process is often written as a multiplication by i (or j), the imaginary unit โœจ.

The filter accepts the following options:

  • sample_rate, s โ€” set sample rate, default is 44100.
  • taps, t โ€” set length of FIR filter, default is 22051.
  • nb_samples, n โ€” set number of samples per each frame.
  • win_func, w โ€” set window function to be used when generating FIR coefficients.

sinc

Generate a sinc kaiser-windowed low-pass, high-pass, band-pass, or band-reject FIR coefficients ๐Ÿ’….

The resulting stream can be used with the afir filter for filtering the audio signal.

The filter accepts the following options:

  • sample_rate, r โ€” set sample rate, default is 44100.
  • nb_samples, n โ€” set number of samples per each frame. Default is 1024.
  • hp โ€” set high-pass frequency. Default is 0.
  • lp โ€” set low-pass frequency. Default is 0. If high-pass frequency is lower than low-pass frequency and low-pass frequency is higher than 0 then filter will create band-pass filter coefficients, otherwise band-reject filter coefficients.
  • phase โ€” set filter phase response. Default is 50. Allowed range is from 0 to 100.
  • beta โ€” set Kaiser window beta.
  • att โ€” set stop-band attenuation. Default is 120dB, allowed range is from 40 to 180 dB.
  • round โ€” enable rounding, by default is disabled.
  • hptaps โ€” set number of taps for high-pass filter.
  • lptaps โ€” set number of taps for low-pass filter.

sine

Generate an audio signal made of a sine wave with amplitude 1/8 ๐ŸŽต.

The audio signal is bit-exact. Periodt.

The filter accepts the following options:

  • frequency, f โ€” set the carrier frequency. Default is 440 Hz.
  • beep_factor, b โ€” enable a periodic beep every second with frequency beep_factor times the carrier frequency. Default is 0, meaning the beep is disabled.
  • sample_rate, r โ€” specify the sample rate, default is 44100.
  • duration, d โ€” specify the duration of the generated audio stream.
  • samples_per_frame โ€” set the number of samples per output frame.

The expression can contain the following constants:

  • n โ€” the (sequential) number of the output audio frame, starting from 0.
  • pts โ€” the PTS (Presentation TimeStamp) of the output audio frame, expressed in TB units.
  • t โ€” the PTS of the output audio frame, expressed in seconds.
  • TB โ€” the timebase of the output audio frames.

Default is 1024.

Examples

  • Generate a simple 440 Hz sine wave:
sine
  • Generate a 220 Hz sine wave with a 880 Hz beep each second, for 5 seconds:
sine=220:4:d=5
sine=f=220:b=4:d=5
sine=frequency=220:beep_factor=4:duration=5
  • Generate a 1 kHz sine wave following "1602,1601,1602,1601,1602" NTSC pattern:
sine=1000:samples_per_frame='st(0,mod(n,5)); 1602-not(not(eq(ld(0),1)+eq(ld(0),3)))'

๐Ÿ”Š AUDIO SINKS ๐Ÿ”Š

Below is a description of the currently available audio sinks. The final destination girlies ๐Ÿ’–

abuffersink

Buffer audio frames, and make them available to the end of filter chain ๐Ÿซถ.

This sink is mainly intended for programmatic use, in particular through the interface defined in libavfilter/buffersink.h or the options system.

It accepts a pointer to an AVABufferSinkContext structure, which defines the incoming buffers' formats, to be passed as the opaque parameter to avfilter_init_filter for initialization.

anullsink

Null audio sink; do absolutely nothing with the input audio ๐Ÿ’€. It is mainly useful as a template and for use in analysis / debugging tools.


๐ŸŽฌ VIDEO FILTERS ๐ŸŽฌ

When you configure your FFmpeg build, you can disable any of the existing filters using --disable-filters. The configure output will show the video filters included in your build.

Below is a description of the currently available video filters. Buckle up bestie, this is the good stuff โœจ

addroi

Mark a region of interest in a video frame ๐ŸŽฏ.

The frame data is passed through unchanged, but metadata is attached to the frame indicating regions of interest which can affect the behaviour of later encoding. Multiple regions can be marked by applying the filter multiple times.

  • x โ€” region distance in pixels from the left edge of the frame.
  • y โ€” region distance in pixels from the top edge of the frame.
  • w โ€” region width in pixels.
  • h โ€” region height in pixels.

The parameters x, y, w and h are expressions, and may contain the following variables:

  • iw โ€” width of the input frame.
  • ih โ€” height of the input frame.
  • qoffset โ€” quantisation offset to apply within the region.

This must be a real value in the range -1 to +1. A value of zero indicates no quality change. A negative value asks for better quality (less quantisation), while a positive value asks for worse quality (greater quantisation) ๐Ÿ˜ญ.

The range is calibrated so that the extreme values indicate the largest possible offset โ€” if the rest of the frame is encoded with the worst possible quality, an offset of -1 indicates that this region should be encoded with the best possible quality anyway. Intermediate values are then interpolated in some codec-dependent way.

For example, in 10-bit H.264 the quantisation parameter varies between -12 and 51. A typical qoffset value of -1/10 therefore indicates that this region should be encoded with a QP around one-tenth of the full range better than the rest of the frame. So, if most of the frame were to be encoded with a QP of around 30, this region would get a QP of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3). An extreme value of -1 would indicate that this region should be encoded with the best possible quality regardless of the treatment of the rest of the frame โ€” that is, should be encoded at a QP of -12 ๐Ÿ‘‘

  • clear โ€” if set to true, remove any existing regions of interest marked on the frame before adding the new one.

Examples

  • Mark the centre quarter of the frame as interesting:
addroi=iw/4:ih/4:iw/2:ih/2:-1/10
  • Mark the 100-pixel-wide region on the left edge of the frame as very uninteresting (to be encoded at much lower quality than the rest of the frame):
addroi=0:0:100:ih:+1/5

alphaextract

Extract the alpha component from the input as a grayscale video ๐ŸŒธ. This is especially useful with the alphamerge filter. They're a matching set, fr fr.

alphamerge

Add or replace the alpha component of the primary input with the grayscale value of a second input ๐Ÿ’œ. This is intended for use with alphaextract to allow the transmission or storage of frame sequences that have alpha in a format that doesn't support an alpha channel. Sneaky, iconic, slay.

So like, to put full frames back together from a normal YUV-encoded video plus a separate video you made with alphaextract, you'd do something like:

movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]

amplify</p> ๐Ÿ’ฅ

It literally amplifies the differences between the current pixel and the pixels sitting in the exact same spot in adjacent frames. Like a hype machine for pixel variance, no cap.

This filter accepts the following options:

  • radius โ€” sets the frame radius. Default is 2. Allowed range is from 1 to 63. For example, a radius of 3 tells the filter to calculate the average of 7 frames. ๐Ÿซถ
  • factor โ€” sets the factor to amplify the difference. Default is 2. Allowed range is from 0 to 65535.
  • threshold โ€” sets the threshold for difference amplification. Any difference greater or equal to this value will not alter the source pixel. Default is 10. Allowed range is from 0 to 65535.
  • tolerance โ€” sets the tolerance for difference amplification. Any difference lower than this value will not alter the source pixel. Default is 0. Allowed range is from 0 to 65535.
  • low โ€” sets the lower limit for changing the source pixel. Default is 65535. Allowed range is from 0 to 65535. This option controls the maximum possible value that will decrease the source pixel value.
  • high โ€” sets the high limit for changing the source pixel. Default is 65535. Allowed range is from 0 to 65535. This option controls the maximum possible value that will increase the source pixel value.
  • planes โ€” sets which planes to filter. Default is all. Allowed range is from 0 to 15.

Commands ๐ŸŽฎ

This filter supports the following commands that correspond to the option of the same name:

  • factor
  • threshold
  • tolerance
  • low
  • high
  • planes

ass</p> โœจ

Same as the subtitles filter, except it does not require libavcodec and libavformat to work. The tradeoff? It's limited to ASS (Advanced Substation Alpha) subtitle files. Balanced, as all things should be ๐Ÿ’…

This filter accepts the following option in addition to the common options from the subtitles filter:

  • shaping โ€” sets the shaping engine.

Available values are:

  • auto โ€” the default libass shaping engine, which is the best available. ๐Ÿ‘‘
  • simple โ€” fast, font-agnostic shaper that can do only substitutions.
  • complex โ€” slower shaper using OpenType for substitutions and positioning.

The default is auto.


atadenoise</p> ๐Ÿงš

Applies an Adaptive Temporal Averaging Denoiser to the video input. Bye bye grain, hiiii clean frames ๐ŸŒธ

The filter accepts the following options:

  • 0a โ€” sets threshold A for the 1st plane. Default is 0.02. Valid range is 0 to 0.3.
  • 0b โ€” sets threshold B for the 1st plane. Default is 0.04. Valid range is 0 to 5.
  • 1a โ€” sets threshold A for the 2nd plane. Default is 0.02. Valid range is 0 to 0.3.
  • 1b โ€” sets threshold B for the 2nd plane. Default is 0.04. Valid range is 0 to 5.
  • 2a โ€” sets threshold A for the 3rd plane. Default is 0.02. Valid range is 0 to 0.3.
  • 2b โ€” sets threshold B for the 3rd plane. Default is 0.04. Valid range is 0 to 5.

Threshold A is designed to react on abrupt changes in the input signal, and threshold B is designed to react on continuous changes in the input signal. Iconic division of labour honestly.

  • s โ€” sets the number of frames the filter will use for averaging. Default is 9. Must be an odd number in the range [5, 129].
  • p โ€” sets what planes of the frame the filter will use for averaging. Default is all.
  • a โ€” sets what variant of algorithm the filter will use for averaging. Default is p (parallel). Alternatively it can be set to s (serial).

Parallel can be faster than serial, while the other way around is never true. Parallel will abort early on the first change being greater than the thresholds, while serial will keep processing the other side of frames if they're equal to or below the thresholds. She's efficient, ok? ๐Ÿ’…

  • 0s, 1s, 2s โ€” set sigma for the 1st plane, 2nd plane, or 3rd plane. Default is 32767. Valid range is from 0 to 32767. This option controls the weight for each pixel in the radius defined by size. The default value means every pixel has the same weight. Setting this option to 0 effectively disables filtering. โš ๏ธ

Commands ๐ŸŽฎ

This filter supports the same commands as the options, except option s. The command accepts the same syntax as the corresponding option.


avgblur</p> ๐ŸŒˆ

Applies the average blur filter. Soft focus vibes fr fr.

The filter accepts the following options:

  • sizeX โ€” sets the horizontal radius size.
  • planes โ€” sets which planes to filter. By default all planes are filtered.
  • sizeY โ€” sets the vertical radius size; if it's zero it'll be the same as sizeX. Default is 0.

Commands ๐ŸŽฎ

This filter supports the same commands as the options. The command accepts the same syntax as the corresponding option.

If the specified expression is not valid, it is kept at its current value.


backgroundkey</p> ๐Ÿช„

Turns a static background into transparency. Yup, it's giving green screen, but make it automatic โœจ

The filter accepts the following option:

  • threshold โ€” threshold for scene change detection.
  • similarity โ€” similarity percentage with the background.
  • blend โ€” sets the blend amount for pixels that are not similar.

Commands ๐ŸŽฎ

This filter supports all the above options as commands.


bbox</p> ๐Ÿ“ฆ

Computes the bounding box for the non-black pixels in the input frame luma plane.

This filter computes the bounding box containing all the pixels with a luma value greater than the minimum allowed value. The parameters describing the bounding box get printed on the filter log. Cute little coordinates report ๐ŸŽ€

The filter accepts the following option:

  • min_val โ€” sets the minimal luma value. Default is 16.

Commands ๐ŸŽฎ

This filter supports all the above options as commands.


bilateral</p> ๐Ÿฆ‹

Applies the bilateral filter โ€” spatial smoothing while preserving edges. Smooth and sharp, she contains multitudes ๐Ÿ’œ

The filter accepts the following options:

  • sigmaS โ€” sets sigma of the gaussian function used to calculate the spatial weight. Allowed range is 0 to 512. Default is 0.1.
  • sigmaR โ€” sets sigma of the gaussian function used to calculate the range weight. Allowed range is 0 to 1. Default is 0.1.
  • planes โ€” sets the planes to filter. Default is first only.

Commands ๐ŸŽฎ

This filter supports all the above options as commands.


bitplanenoise</p> ๐Ÿ”

Shows and measures bit plane noise. Detective era ๐Ÿ”Ž

The filter accepts the following options:

  • bitplane โ€” sets which plane to analyze. Default is 1.
  • filter โ€” filters out noisy pixels from the bitplane set above. Default is disabled.

blackdetect, blackdetect_vulkan</p> ๐Ÿ–ค

Detects video intervals that are (almost) completely black. Super useful for detecting chapter transitions, commercials, or invalid recordings. Like a little black-segment radar ๐Ÿ•ต๏ธโ€โ™€๏ธ

The filter outputs its detection analysis to both the log and the frame metadata. If a black segment of at least the specified minimum duration is found, a line with the start and end timestamps as well as the duration is printed to the log with level info. On top of that, a log line with level debug is printed per frame showing the black amount detected for that frame.

The filter also attaches metadata to the first frame of a black segment with key lavfi.black_start, and to the first frame after the black segment ends with key lavfi.black_end. The value is the frame's timestamp. This metadata gets added regardless of the minimum duration specified. She's thorough ๐Ÿ’…

The filter accepts the following options:

  • black_min_duration, d โ€” sets the minimum detected black duration expressed in seconds. It must be a non-negative floating point number.

Default value is 2.0.

  • picture_black_ratio_th, pic_th โ€” sets the threshold for considering a picture "black". Expresses the minimum value for the ratio:
<nb_black_pixels> / <nb_pixels>

for which a picture is considered black. Default value is 0.98.

  • pixel_black_th, pix_th โ€” sets the threshold for considering a pixel "black".

The threshold expresses the maximum pixel luma value for which a pixel is considered "black". The provided value is scaled according to the following equation:

<absolute_threshold> = <luma_minimum_value> + <pixel_black_th> * <luma_range_size>

luma_range_size and luma_minimum_value depend on the input video format โ€” the range is [0-255] for YUV full-range formats and [16-235] for YUV non full-range formats.

Default value is 0.10.

  • alpha โ€” if true, check the alpha channel instead of the luma channel. Detects frames which are (almost) transparent, instead of frames which are almost black.

Default value is disabled.

The following example sets the maximum pixel threshold to the minimum value, and detects only black intervals of 2 or more seconds:

blackdetect=d=2:pix_th=0.00

blackframe</p> ๐Ÿ’€

Detects frames that are (almost) completely black. Useful for detecting chapter transitions or commercials. Output lines consist of the frame number of the detected frame, the percentage of blackness, the position in the file if known or -1, and the timestamp in seconds. Receipts, basically ๐Ÿงพ

In order to display the output lines, you need to set the loglevel at least to the AV_LOG_INFO value.

This filter exports frame metadata lavfi.blackframe.pblack. The value represents the percentage of pixels in the picture that are below the threshold value.

It accepts the following parameters:

  • amount โ€” the percentage of the pixels that have to be below the threshold; it defaults to 98.
  • threshold, thresh โ€” the threshold below which a pixel value is considered black; it defaults to 32.

blend</p> ๐ŸŒธ

Blends two video frames into each other. Main character energy, merging two timelines โœจ

The blend filter takes two input streams and outputs one stream โ€” the first input is the "top" layer and the second input is the "bottom" layer. By default, the output terminates when the longest input terminates.

The tblend (time blend) filter takes two consecutive frames from one single stream, and outputs the result obtained by blending the new frame on top of the old frame.

A description of the accepted options follows.

  • c0_mode, c1_mode, c2_mode, c3_mode, all_mode โ€” set the blend mode for a specific pixel component, or for all pixel components in the case of all_mode. Default value is normal.

Available values for component modes are:

  • addition
  • and
  • average
  • bleach
  • burn
  • darken
  • difference
  • divide
  • dodge
  • exclusion
  • extremity
  • freeze
  • geometric
  • glow
  • grainextract
  • grainmerge
  • hardlight
  • hardmix
  • hardoverlay
  • harmonic
  • heat
  • interpolate
  • lighten
  • linearlight
  • multiply
  • multiply128
  • negation
  • normal
  • or
  • overlay
  • phoenix
  • pinlight
  • reflect
  • screen
  • softdifference
  • softlight
  • stain
  • subtract
  • vividlight
  • xor
  • c0_opacity, c1_opacity, c2_opacity, c3_opacity, all_opacity โ€” sets the blend opacity for one specific pixel component, or for all the pixel components if you use all_opacity. Heads up bestie: this one only does anything when you're using pixel-component blend modes ๐Ÿ’…
  • c0_expr, c1_expr, c2_expr, c3_expr, all_expr โ€” sets the blend expression for a specific pixel component, or for all of them with all_expr. And ooh, important: if you set these, the related mode options just get ignored, periodt. ๐Ÿ™ˆ

Your expressions get to use these variables:

  • N โ€” the sequential number of the filtered frame, starting from 0
  • X, Y โ€” the coordinates of the current sample
  • W, H โ€” the width and height of the currently filtered plane
  • SW, SH โ€” width and height scale for the plane being filtered ๐Ÿ’– it's the ratio between the dimensions of the current plane and the luma plane, so like for a yuv420p frame the values are 1,1 for the luma plane and 0.5,0.5 for the chroma planes
  • T โ€” time of the current frame, expressed in seconds
  • TOP, A โ€” value of the pixel component at the current location for the first video frame (top layer)
  • BOTTOM, B โ€” value of the pixel component at the current location for the second video frame (bottom layer)

The blend filter also supports the framesync options. ๐Ÿซถ

โœจ Examples โœจ

  • Apply a transition from the bottom layer to the top layer in the first 10 seconds:
blend=all_expr='A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))'
  • Apply a linear horizontal transition from the top layer to the bottom layer:
blend=all_expr='A*(X/W)+B*(1-X/W)'
  • Apply a 1x1 checkerboard effect:
blend=all_expr='if(eq(mod(X,2),mod(Y,2)),A,B)'
  • Apply an uncover-left effect:
blend=all_expr='if(gte(N*SW+X,W),A,B)'
  • Apply an uncover-down effect:
blend=all_expr='if(gte(Y-N*SH,0),A,B)'
  • Apply an uncover-up-left effect:
blend=all_expr='if(gte(T*SH*40+Y,H)*gte((T*40*SW+X)*W/H,W),A,B)'
  • Split the video diagonally and show the top and bottom layer on each side:
blend=all_expr='if(gt(X,Y*(W/H)),A,B)'
  • Display the differences between the current and the previous frame:
tblend=all_mode=grainextract

๐ŸŽฎ Commands ๐ŸŽฎ

This filter supports the same commands as options. Slay.


๐ŸŒธ blockdetect ๐ŸŒธ

Figures out how blocky your frames are โ€” and it does it without touching the input frames at all. Just vibes and measuring, no editing. ๐Ÿ‘‘

Based on Remco Muijs and Ihor Kirenko: "A no-reference blocking artifact measure for adaptive video processing." 2005 13th European signal processing conference.

The filter accepts the following options:

  • period_min, period_max โ€” set the minimum and maximum values for determining pixel grids (periods). Default values are [3,24].
  • planes โ€” set the planes to filter. Default is the first one only.

โœจ Examples โœจ

  • Determine blockiness for the first plane and search for periods within [8,32]:
blockdetect=period_min=8:period_max=32:planes=1

๐Ÿฆ‹ blurdetect ๐Ÿฆ‹

Measures how blurry your frames are, again with zero changes to the input frames. It's literally just looking. ๐Ÿ‘€

Based on Marziliano, Pina, et al. "A no-reference perceptual blur metric." Allows for a block-based abbreviation.

The filter accepts the following options:

  • low, high โ€” set the low and high threshold values used by the Canny thresholding algorithm.

The high threshold picks out the "strong" edge pixels, which then get connected through 8-connectivity with the "weak" edge pixels that the low threshold selected.

low and high values have to be in the range [0,1], and low should be lesser or equal to high. Respect the order, bestie. ๐Ÿ™

Default value for low is 20/255, and default value for high is 50/255.

  • radius โ€” define the radius to search around an edge pixel for local maxima.
  • block_pct โ€” determine blurriness only for the most significant blocks, given in percentage.
  • block_width โ€” determine blurriness for blocks of width block_width. If set to any value smaller than 1, no blocks are used and the whole image is processed as one no matter of block_height. It's giving "all or nothing". ๐Ÿ’€
  • block_height โ€” determine blurriness for blocks of height block_height. If set to any value smaller than 1, no blocks are used and the whole image is processed as one no matter of block_width.
  • planes โ€” set the planes to filter. Default is the first one only.

โœจ Examples โœจ

  • Determine blur for 80% of the most significant 32x32 blocks:
blurdetect=block_width=32:block_height=32:block_pct=80

๐ŸŽ€ bm3d ๐ŸŽ€

Denoises frames using the Block-Matching 3D algorithm. Iconic little denoiser. โœจ

The filter accepts the following options.

  • sigma โ€” set the denoising strength. Default value is 1. Allowed range is from 0 to 999.9. Ngl the denoising algorithm is very sensitive to sigma, so adjust it according to your source. Like, actually. ๐Ÿซถ
  • block โ€” set the local patch size. This sets dimensions in 2D.
  • bstep โ€” set the sliding step for processing blocks. Default value is 4. Allowed range is from 1 to 64. Smaller values allow processing more reference blocks and are slower. ๐Ÿ˜ญ
  • group โ€” set the maximal number of similar blocks for the 3rd dimension. Default value is 1. When set to 1, no block matching is done. Larger values allow more blocks in a single group. Allowed range is from 1 to 256.
  • range โ€” set the radius for search block matching. Default is 9. Allowed range is from 1 to INT32_MAX.
  • mstep โ€” set the step between two search locations for block matching. Default is 1. Allowed range is from 1 to 64. Smaller is slower. ๐Ÿ’€
  • thmse โ€” set the threshold of mean square error for block matching. Valid range is 0 to INT32_MAX.
  • hdthr โ€” set the thresholding parameter for hard thresholding in the 3D transformed domain. Larger values result in stronger hard-thresholding filtering in the frequency domain.
  • estim โ€” set the filtering estimation mode. Can be basic or final. Default is basic.
  • ref โ€” if enabled, the filter will use the 2nd stream for block matching. Default is disabled for the basic value of the estim option, and always enabled if the value of estim is final.
  • planes โ€” set the planes to filter. Default is all available except alpha.

โœจ Examples โœจ

  • Basic filtering with bm3d:
bm3d=sigma=3:block=4:bstep=2:group=1:estim=basic
  • Same as above, but filtering only luma:
bm3d=sigma=3:block=4:bstep=2:group=1:estim=basic:planes=1
  • Same as above, but with both estimation modes:
split[a][b],[a]bm3d=sigma=3:block=4:bstep=2:group=1:estim=basic[a],[b][a]bm3d=sigma=3:block=4:bstep=2:group=16:estim=final:ref=1
  • Same as above, but prefilter with the nlmeans filter instead:
split[a][b],[a]nlmeans=s=3:r=7:p=3[a],[b][a]bm3d=sigma=3:block=4:bstep=2:group=16:estim=final:ref=1

๐Ÿ’– boxblur ๐Ÿ’–

Applies a boxblur algorithm to the input video. Soft-focus main character energy. ๐ŸŒธ

It accepts the following parameters:

  • luma_radius, lr
  • luma_power, lp
  • chroma_radius, cr
  • chroma_power, cp
  • alpha_radius, ar
  • alpha_power, ap

A description of the accepted options follows. ๐Ÿ‘‡

  • luma_radius, lr / chroma_radius, cr / alpha_radius, ar โ€” set an expression for the box radius in pixels used for blurring the corresponding input plane.

The radius value must be a non-negative number, and must not be greater than the value of the expression min(w,h)/2 for the luma and alpha planes, and of min(cw,ch)/2 for the chroma planes. Cross that line and it's a no from me. ๐Ÿ™…

Default value for luma_radius is 2. If not specified, chroma_radius and alpha_radius default to the corresponding value set for luma_radius.

The expressions can contain the following constants:

  • w, h โ€” the input width and height in pixels
  • cw, ch โ€” the input chroma image width and height in pixels
  • hsub, vsub โ€” the horizontal and vertical chroma subsample values. For example, for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • luma_power, lp / chroma_power, cp / alpha_power, ap โ€” specify how many times the boxblur filter is applied to the corresponding plane.

Default value for luma_power is 2. If not specified, chroma_power and alpha_power default to the corresponding value set for luma_power.

A value of 0 will disable the effect. ๐Ÿ’€

โœจ Examples โœจ

  • Apply a boxblur filter with the luma, chroma, and alpha radii set to 2:
boxblur=luma_radius=2:luma_power=1
boxblur=2:1
  • Set the luma radius to 2, and the alpha and chroma radius to 0:
boxblur=2:1:cr=0:ar=0
  • Set the luma and chroma radii to a fraction of the video dimension:
boxblur=luma_radius=min(h\,w)/10:luma_power=1:chroma_radius=min(cw\,ch)/10:chroma_power=1

๐ŸŒˆ bwdif ๐ŸŒˆ

Deinterlaces the input video (bwdif stands for "Bob Weaver Deinterlacing Filter" โ€” yes that's its whole government name ๐ŸŽ€).

Motion adaptive deinterlacing based on yadif with the use of w3fdif and cubic interpolation algorithms. It accepts the following parameters:

  • mode โ€” the interlacing mode to adopt. It accepts one of the following values:
    • 0, send_frame โ€” output one frame for each frame.
    • 1, send_field โ€” output one frame for each field.

The default value is send_field.

  • parity โ€” the picture field parity assumed for the input interlaced video. It accepts one of the following values:
    • 0, tff โ€” assume the top field is first.
    • 1, bff โ€” assume the bottom field is first.
    • -1, auto โ€” enable automatic detection of field parity.

The default value is auto. If the interlacing is unknown or the decoder does not export this information, top field first will be assumed.

  • deint โ€” specify which frames to deinterlace. Accepts one of the following values:
    • 0, all โ€” deinterlace all frames.
    • 1, interlaced โ€” only deinterlace frames marked as interlaced.

...and the default? It's "all". Slay, moving on ๐Ÿ’…

ccrepack

Repacks CEA-708 closed captioning side data โœจ

Okay so this one is literally a fixer-upper for mess that commercial encoders leave behind in upstream malformed CEA-708 payloads. Specifically, it handles two iconic disasters:

  • The wrong number of tuples (i.e. an incorrect cc_count for the target FPS)
  • The tuples being in the wrong order (i.e. the CEA-608 tuples are not sitting at the first entries in the payload, which they should be)

No options, no fuss โ€” it just cleans up the vibe ๐Ÿงš


cas

Applies the Contrast Adaptive Sharpen filter to your video stream. Crisp it up, bestie ๐Ÿ”ฅ

It takes these options:

  • strength โ€” the sharpening strength. Default is 0.
  • planes โ€” which planes to filter. By default it filters all planes except the alpha plane.

Commands

It supports the same commands as options. Periodt.


chromahold

Strips all color info for every color except one ๐ŸŽ€ Like a "keep only this one, everything else goes gray" situation.

Options:

  • color โ€” the color that will not be replaced with neutral chroma. It's the chosen one, the main character.
  • similarity โ€” similarity percentage with the above color. 0.01 matches only the exact key color, while 1.0 matches literally everything.
  • blend โ€” blend percentage. 0.0 makes pixels either fully gray or not gray at all. Higher values result in more preserved color.
  • yuv โ€” signals that the color you passed is already in YUV instead of RGB.
Heads up: literal colors like "green" or "red" don't make sense with yuv enabled anymore. What it is good for is passing exact YUV values as hexadecimal numbers.

Commands

This filter supports the same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it's kept at its current value. No chaos, no crash ๐Ÿ’€


chromakey

YUV colorspace color/chroma keying โ€” the classic greenscreen moment ๐Ÿ’š

Options:

  • color โ€” the color which will be replaced with transparency.
  • similarity โ€” similarity percentage with the key color.

0.01 matches only the exact key color, while 1.0 matches everything.

  • blend โ€” blend percentage.

0.0 makes pixels either fully transparent, or not transparent at all.

Higher values result in semi-transparent pixels, with a higher transparency the more similar the pixels color is to the key color.

  • yuv โ€” signals that the color passed is already in YUV instead of RGB.
Same warning as its sibling: literal colors like "green" or "red" don't make sense with this enabled anymore. This is how you pass exact YUV values as hexadecimal numbers ๐Ÿ’œ

Commands

This filter supports the same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it's kept at its current value.

Examples

  • Make every green pixel in the input image transparent:
ffmpeg -i input.png -vf chromakey=green out.png
  • Overlay a greenscreen-video on top of a static black background:
ffmpeg -f lavfi -i color=c=black:s=1280x720 -i video.mp4 -shortest -filter_complex "[1:v]chromakey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mkv

chromanr

Reduces chrominance noise ๐ŸŒธ Your chroma is about to be sooo smoothed.

Options, in order:

  • thres โ€” sets the threshold for averaging chrominance values. A pixel gets used in the averaging if the sum of the absolute difference of the Y, U and V pixel components of the current pixel and the neighbour pixels is lower than this threshold. The luma component is left unchanged and is copied to the output. Default is 30. Allowed range is from 1 to 200.
  • sizew โ€” sets the horizontal radius of the rectangle used for averaging. Allowed range is from 1 to 100. Default is 5.
  • sizeh โ€” sets the vertical radius of the rectangle used for averaging. Allowed range is from 1 to 100. Default is 5.
  • stepw โ€” sets the horizontal step used when averaging. Default is 1. Allowed range is from 1 to 50. Mostly useful to speed-up filtering.
  • steph โ€” sets the vertical step used when averaging. Default is 1. Allowed range is from 1 to 50. Mostly useful to speed-up filtering.
  • threy โ€” sets the Y threshold for averaging chrominance values. This is your finer control for the max allowed difference between the Y components of the current pixel and the neighbour pixels. Default is 200. Allowed range is from 1 to 200.
  • threu โ€” sets the U threshold for averaging chrominance values. Finer control for the max allowed difference between the U components of the current pixel and the neighbour pixels. Default is 200. Allowed range is from 1 to 200.
  • threv โ€” sets the V threshold for averaging chrominance values. Finer control for the max allowed difference between the V components of the current pixel and the neighbour pixels. Default is 200. Allowed range is from 1 to 200.
  • distance โ€” sets the distance type used in calculations:
    • manhattan โ€” absolute difference.
    • euclidean โ€” difference squared.

Default distance type is manhattan. Iykyk ๐Ÿ“

Commands

This filter supports the same commands as options. The command accepts the same syntax of the corresponding option.


chromashift

Shifts chroma pixels horizontally and/or vertically ๐Ÿฆ‹ Little nudge to the color channels.

Options:

  • cbh โ€” sets the amount to shift chroma-blue horizontally.
  • cbv โ€” sets the amount to shift chroma-blue vertically.
  • crh โ€” sets the amount to shift chroma-red horizontally.
  • crv โ€” sets the amount to shift chroma-red vertically.
  • edge โ€” sets the edge mode. Can be smear, default, or warp.

Commands

This filter supports all of the above options as commands.


ciescope

Displays a CIE color diagram with your pixels overlaid onto it ๐ŸŒˆ It's giving science fair but make it cute.

Options:

  • system โ€” sets the color system. Possible values:
    • ntsc, 470m
    • ebu, 470bg
    • smpte
    • 240m
    • apple
    • widergb
    • cie1931
    • rec709, hdtv
    • uhdtv, rec2020
    • dcip3
  • cie โ€” sets the CIE system. Possible values:
    • xyy
    • ucs
    • luv
  • gamuts โ€” sets which gamuts to draw. See the system option for the available values.
  • size, s โ€” sets the ciescope size, by default set to 512.
  • intensity, i โ€” sets the intensity used to map input pixel values to the CIE diagram.
  • contrast โ€” sets the contrast used to draw the tongue colors that are out of the active color system gamut.
  • corrgamma โ€” corrects the gamma displayed on the scope, by default enabled.
  • showwhite โ€” shows the white point on the CIE diagram, by default disabled.
  • gamma โ€” sets the input gamma. Used only with XYZ input color space.
  • fill โ€” fills with CIE colors. By default is enabled.

codecview

Visualizes information exported by some codecs ๐Ÿ‘€

Some codecs can export information through frames using side-data or other means. For example, some MPEG based codecs export motion vectors through the export_mvs flag in the codec flags2 option.

This filter accepts the following option:

  • block โ€” displays the block partition structure using the luma plane.
  • mv โ€” sets which motion vectors to visualize. The available flags for mv are:
    • pf โ€” forward predicted MVs of P-frames
    • bf โ€” forward predicted MVs of B-frames
    • bb โ€” backward predicted MVs of B-frames
  • qp โ€” displays quantization parameters using the chroma planes.
  • mv_type, mvt โ€” sets the motion vectors type to visualize. This includes MVs from all frames unless specified by the frame_type option. The available flags for mv_type are:
    • fp โ€” forward predicted MVs
    • bp โ€” backward predicted MVs
  • frame_type, ft โ€” sets the frame type to visualize motion vectors of. The available flags for frame_type are:
    • if โ€” intra-coded frames (I-frames)
    • pf โ€” predicted frames (P-frames)
    • bf โ€” bi-directionally predicted frames (B-frames)

Examples

  • Visualize forward predicted MVs of all frames using ffplay:
ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv_type=fp
  • Visualize multi-directionals MVs of P and B-Frames using ffplay:
ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv=pf+bf+bb

colorbalance

Modifies the intensity of the primary colors (red, green and blue) of your input frames ๐ŸŽจ

The filter lets an input frame be adjusted in the shadows, midtones or highlights regions for the red-cyan, green-magenta or blue-yellow balance.

A positive adjustment value shifts the balance towards the primary color, and a negative value goes towards the complementary color. Simple as that, no cap.

Options:

  • rs, gs, bs โ€” adjust red, green and blue shadows (the darkest pixels).
  • rm, gm, bm โ€” adjust red, green and blue midtones (the medium pixels).
  • rh, gh, bh โ€” adjust red, green and blue highlights (the brightest pixels).

Allowed ranges for these options are [-1.0, 1.0]. Defaults are 0.

  • pl โ€” preserve lightness when changing color balance. Default is disabled.

Examples

  • Add a red color cast to the shadows:
colorbalance=rs=.3

Commands

This filter supports all of the above options as commands.


colorcontrast

Adjusts the color contrast between RGB components โœจ

Options:

  • rc โ€” sets the red-cyan contrast. Defaults is 0.0. Allowed range is from -1.0 to 1.0.
  • gm โ€” sets the green-magenta contrast. Defaults is 0.0. Allowed range is from -1.0 to 1.0.
  • by โ€” sets the blue-yellow contrast. Defaults is 0.0. Allowed range is from -1.0 to 1.0.
  • rcw, gmw, byw โ€” sets the weight of each rc, gm, by option value. Default value is 0.0. Allowed range is from 0.0 to 1.0. If all weights are 0.0, filtering is disabled. Iconic behavior honestly.
  • pl โ€” sets the amount of preserving lightness. Default value is 0.0. Allowed range is from 0.0 to 1.0.

Commands

This filter supports all of the above options as commands.


colorcorrect

Adjusts color white balance selectively for blacks and whites ๐Ÿ’œ This filter operates in YUV colorspace, fyi.

Options:

  • rl โ€” sets the red shadow spot. Allowed range is from -1.0 to 1.0. Default value is 0.
  • bl โ€” sets the blue shadow spot. Allowed range is from -1.0 to 1.0. Default value is 0.
  • rh โ€” sets the red highlight spot. Allowed range is from -1.0 to 1.0. Default value is 0.
  • bh โ€” sets the blue highlight spot. Allowed range is from -1.0 to 1.0. Default value is 0.
  • saturation โ€” sets the amount of saturation. Allowed range is from -3.0 to 3.0. Default value is 1.
  • analyze โ€” if set to anything other than manual, it will analyze every frame and use derived parameters for filtering the output frame. Possible values are:
    • manual
    • average
    • minmax
    • median

Default value is "manual".

Commands

This filter supports all of the above options as commands.

๐ŸŽจ colorchannelmixer

Adjust video input frames by re-mixing color channels. Basically you're doing chemistry on your pixels, bestie.

This filter modifies a color channel by adding the values associated to the other channels of the same pixels. For example if the value to modify is red, the output value will be:

<red>=<red>*<rr> + <blue>*<rb> + <green>*<rg> + <alpha>*<ra>

The filter accepts the following options:

  • rr, rg, rb, ra โ€” Adjust contribution of input red, green, blue and alpha channels for output red channel. Default is 1 for rr, and 0 for rg, rb and ra.
  • gr, gg, gb, ga โ€” Adjust contribution of input red, green, blue and alpha channels for output green channel. Default is 1 for gg, and 0 for gr, gb and ga.
  • br, bg, bb, ba โ€” Adjust contribution of input red, green, blue and alpha channels for output blue channel. Default is 1 for bb, and 0 for br, bg and ba.
  • ar, ag, ab, aa โ€” Adjust contribution of input red, green, blue and alpha channels for output alpha channel. Default is 1 for aa, and 0 for ar, ag and ab.

Allowed ranges for options are "[-2.0, 2.0]". Yes, you read that right โ€” you can go negative, go feral ๐Ÿซถ

  • pc โ€” Set preserve color mode. The accepted values are:
    • none โ€” Disable color preserving, this is default.
    • lum โ€” Preserve luminance.
    • max โ€” Preserve max value of RGB triplet.
    • avg โ€” Preserve average value of RGB triplet.
    • sum โ€” Preserve sum value of RGB triplet.
    • nrm โ€” Preserve normalized value of RGB triplet.
    • pwr โ€” Preserve power value of RGB triplet.
  • pa โ€” Set the preserve color amount when changing colors. Allowed range is from "[0.0, 1.0]". Default is 0.0, thus disabled.

๐ŸŒˆ Examples

  • Convert source to grayscale:
colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3
  • Simulate sepia tones (the aesthetic โœจ):
colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131

๐Ÿ•น Commands

This filter supports the all above options as commands. Every single one, no cap.


๐Ÿ”Ž colordetect

Analyze the video frames to determine the effective value range and alpha mode. It's giving detective energy, honestly ๐Ÿ‘‘

The filter accepts the following options:

  • mode โ€” Set of properties to detect. Unavailable properties, such as alpha mode for an input image without an alpha channel, will be ignored automatically.

Accepts a combination of the following flags:

  • color_range โ€” Detect if the source contains luma pixels outside the limited (MPEG) range, which indicates that this is a full range YUV source.
  • alpha_mode โ€” Detect if the source contains color values above the alpha channel, which indicates that the alpha channel is independent (straight), rather than premultiplied. Also detects if the alpha plane is fully opaque or not.
  • all โ€” Enable detection of all of the above properties. This is the default.

๐ŸŒธ colorize

Overlay a solid color on the video stream. A whole vibe, applied to every pixel.

The filter accepts the following options:

  • hue โ€” Set the color hue. Allowed range is from 0 to 360. Default value is 0.
  • saturation โ€” Set the color saturation. Allowed range is from 0 to 1. Default value is 0.5.
  • lightness โ€” Set the color lightness. Allowed range is from 0 to 1. Default value is 0.5.
  • mix โ€” Set the mix of source lightness. By default is set to 1.0. Allowed range is from 0.0 to 1.0.

๐Ÿ•น Commands

This filter supports the all above options as commands. Slay.


๐ŸŸฉ colorkey

RGB colorspace color keying. Think green screen, but make it a filter ๐Ÿ’š

This filter operates on 8-bit RGB format frames by setting the alpha component of each pixel which falls within the similarity radius of the key color to 0. The alpha value for pixels outside the similarity radius depends on the value of the blend option.

The filter accepts the following options:

  • color โ€” Set the color for which alpha will be set to 0 (full transparency). See "Color" section in the ffmpeg-utils manual. Default is "black".
  • similarity โ€” Set the radius from the key color within which other colors also have full transparency. The computed distance is related to the unit fractional distance in 3D space between the RGB values of the key color and the pixel's color. Range is 0.01 to 1.0. 0.01 matches within a very small radius around the exact key color, while 1.0 matches everything. Default is 0.01.
  • blend โ€” Set how the alpha value for pixels that fall outside the similarity radius is computed. 0.0 makes pixels either fully transparent or fully opaque. Higher values result in semi-transparent pixels, with greater transparency the more similar the pixel color is to the key color. Range is 0.0 to 1.0. Default is 0.0.

๐Ÿ’… Examples

  • Make every green pixel in the input image transparent:
ffmpeg -i input.png -vf colorkey=green out.png
  • Overlay a greenscreen-video on top of a static background image:
ffmpeg -i background.png -i video.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.3:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.flv

๐Ÿ•น Commands

This filter supports same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value. No crash, no drama ๐Ÿ˜Œ


๐Ÿ–ค colorhold

Remove all color information for all RGB colors except for certain one. Everyone gets gray-scaled except the chosen one โ€” main character privilege, honestly ๐Ÿ‘‘

The filter accepts the following options:

  • color โ€” The color which will not be replaced with neutral gray.
  • similarity โ€” Similarity percentage with the above color. 0.01 matches only the exact key color, while 1.0 matches everything.
  • blend โ€” Blend percentage. 0.0 makes pixels fully gray. Higher values result in more preserved color.

๐Ÿ•น Commands

This filter supports same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value.


๐Ÿ“Š colorlevels

Adjust video input frames using levels. It's basically the levels slider from your fave editing app, but in the terminal ๐ŸŽš

The filter accepts the following options:

  • rimin, gimin, bimin, aimin โ€” Adjust red, green, blue and alpha input black point. Allowed ranges for options are "[-1.0, 1.0]". Defaults are 0.
  • rimax, gimax, bimax, aimax โ€” Adjust red, green, blue and alpha input white point. Allowed ranges for options are "[-1.0, 1.0]". Defaults are 1.

Input levels are used to lighten highlights (bright tones), darken shadows (dark tones), change the balance of bright and dark tones.

  • romin, gomin, bomin, aomin โ€” Adjust red, green, blue and alpha output black point. Allowed ranges for options are "[0, 1.0]". Defaults are 0.
  • romax, gomax, bomax, aomax โ€” Adjust red, green, blue and alpha output white point. Allowed ranges for options are "[0, 1.0]". Defaults are 1.

Output levels allows manual selection of a constrained output level range.

  • preserve โ€” Set preserve color mode. The accepted values are:
    • none โ€” Disable color preserving, this is default.
    • lum โ€” Preserve luminance.
    • max โ€” Preserve max value of RGB triplet.
    • avg โ€” Preserve average value of RGB triplet.
    • sum โ€” Preserve sum value of RGB triplet.
    • nrm โ€” Preserve normalized value of RGB triplet.
    • pwr โ€” Preserve power value of RGB triplet.

โœจ Examples

  • Make video output darker:
colorlevels=rimin=0.058:gimin=0.058:bimin=0.058
  • Increase contrast:
colorlevels=rimin=0.039:gimin=0.039:bimin=0.039:rimax=0.96:gimax=0.96:bimax=0.96
  • Make video output lighter:
colorlevels=rimax=0.902:gimax=0.902:bimax=0.902
  • Increase brightness:
colorlevels=romin=0.5:gomin=0.5:bomin=0.5

๐Ÿ•น Commands

This filter supports the all above options as commands. Obsessed with the flexibility fr fr.


๐Ÿ—บ colormap

Apply custom color maps to video stream. This one's a whole three-stream situation, so buckle up ๐Ÿฆ‹

This filter needs three input video streams. First stream is video stream that is going to be filtered out. Second and third video stream specify color patches for source color to target color mapping.

The filter accepts the following options:

  • patch_size โ€” Set the source and target video stream patch size in pixels.
  • nb_patches โ€” Set the max number of used patches from source and target video stream. Default value is number of patches available in additional video streams. Max allowed number of patches is 64.
  • type โ€” Set the adjustments used for target colors. Can be "relative" or "absolute". Defaults is "absolute".
  • kernel โ€” Set the kernel used to measure color differences between mapped colors.

The accepted values are:

  • euclidean
  • weuclidean

Default is "euclidean".


๐Ÿ”„ colormatrix

Convert color matrix. Glow-up, but for color standards ๐Ÿ’ซ

The filter accepts the following options:

  • src, dst โ€” Specify the source and destination color matrix. Both values must be specified.

The accepted values are:

  • bt709 โ€” BT.709
  • fcc โ€” FCC
  • bt601 โ€” BT.601
  • bt470 โ€” BT.470
  • bt470bg โ€” BT.470BG
  • smpte170m โ€” SMPTE-170M
  • smpte240m โ€” SMPTE-240M
  • bt2020 โ€” BT.2020

For example to convert from BT.601 to SMPTE-240M, use the command:

colormatrix=bt601:smpte240m

๐ŸŒˆ colorspace

Convert colorspace, transfer characteristics or color primaries. Input video needs to have an even size. That's a hard requirement bestie, no negotiating ๐Ÿ™…โ€โ™€๏ธ

The filter accepts the following options:

  • all โ€” Specify all color properties at once.

The accepted values are:

  • bt470m โ€” BT.470M
  • bt470bg โ€” BT.470BG
  • bt601-6-525 โ€” BT.601-6 525
  • bt601-6-625 โ€” BT.601-6 625
  • bt709 โ€” BT.709
  • smpte170m โ€” SMPTE-170M
  • smpte240m โ€” SMPTE-240M
  • bt2020 โ€” BT.2020
  • space โ€” Specify output colorspace.

The accepted values are:

  • bt709 โ€” BT.709
  • fcc โ€” FCC
  • bt470bg โ€” BT.470BG or BT.601-6 625
  • smpte170m โ€” SMPTE-170M or BT.601-6 525
  • smpte240m โ€” SMPTE-240M
  • ycgco โ€” YCgCo
  • bt2020ncl โ€” BT.2020 with non-constant luminance
  • trc โ€” Specify output transfer characteristics.

The accepted values are:

  • bt709 โ€” BT.709
  • bt470m โ€” BT.470M
  • bt470bg โ€” BT.470BG
  • gamma22 โ€” Constant gamma of 2.2
  • gamma28 โ€” Constant gamma of 2.8
  • smpte170m โ€” SMPTE-170M, BT.601-6 625 or BT.601-6 525
  • smpte240m โ€” SMPTE-240M
  • srgb โ€” SRGB
  • iec61966-2-1 โ€” iec61966-2-1, literally what it says ๐ŸŽ€
  • iec61966-2-4 โ€” iec61966-2-4 โœจ
  • xvycc โ€” xvycc ๐Ÿ’…
  • bt2020-10 โ€” BT.2020 for 10-bits content ๐Ÿ”ฅ
  • bt2020-12 โ€” BT.2020 for 12-bits content ๐Ÿ”ฅ

So that's the rest of the trc roster, bestie โ€” no skips, all of them. Now the next option:

primaries โ€” okay so this one sets the output color primaries, no cap ๐ŸŽจ

Accepted values, and yes here's all of them:

  • bt709 โ€” BT.709 โญ
  • bt470m โ€” BT.470M
  • bt470bg โ€” BT.470BG or BT.601-6 625
  • smpte170m โ€” SMPTE-170M or BT.601-6 525
  • smpte240m โ€” SMPTE-240M
  • film โ€” film ๐ŸŽฌ
  • smpte431 โ€” SMPTE-431
  • smpte432 โ€” SMPTE-432
  • bt2020 โ€” BT.2020
  • jedec-p22 โ€” JEDEC P22 phosphors

range โ€” sets the output color range. The accepted values are:

  • tv โ€” TV (restricted) range ๐Ÿ“บ
  • mpeg โ€” MPEG (restricted) range
  • pc โ€” PC (full) range ๐Ÿ’ป
  • jpeg โ€” JPEG (full) range

format โ€” sets the output color format. Accepted values go like:

  • yuv420p โ€” YUV 4:2:0 planar 8-bits
  • yuv420p10 โ€” YUV 4:2:0 planar 10-bits
  • yuv420p12 โ€” YUV 4:2:0 planar 12-bits
  • yuv422p โ€” YUV 4:2:2 planar 8-bits
  • yuv422p10 โ€” YUV 4:2:2 planar 10-bits
  • yuv422p12 โ€” YUV 4:2:2 planar 12-bits
  • yuv444p โ€” YUV 4:4:4 planar 8-bits
  • yuv444p10 โ€” YUV 4:4:4 planar 10-bits
  • yuv444p12 โ€” YUV 4:4:4 planar 12-bits

fast โ€” this does a fast conversion which skips the gamma/primary correction. Translation: way less CPU ๐Ÿƒโ€โ™€๏ธ๐Ÿ’จ but it's mathematically incorrect, so bestie... know what you're signing up for, k? If you want output that's compatible with what the colormatrix filter makes, use fast=1.

dither โ€” sets the dithering mode. Accepted values:

  • none โ€” no dithering, we simply don't ๐Ÿ™…โ€โ™€๏ธ
  • fsb โ€” Floyd-Steinberg dithering

wpadapt โ€” whitepoint adaptation mode, and yes wpadapt is an adorable name, moving on. Accepted values:

  • bradford โ€” Bradford whitepoint adaptation
  • vonkries โ€” von Kries whitepoint adaptation
  • identity โ€” identity whitepoint adaptation (i.e. no whitepoint adaptation at all ๐Ÿ’€)

clipgamut โ€” controls how out-of-gamut colors get clipped when they show up as a result of colorspace conversion. Accepted values:

  • none โ€” no clipping of out of gamut colors.
  • rgb โ€” clips the RGB values to the [0, 1] range when building the gamma transfer LUTs.

iall โ€” overrides all input properties at once, queen behaviour ๐Ÿ‘‘. Same accepted values as all.

ispace โ€” overrides the input colorspace. Same accepted values as space.

iprimaries โ€” overrides the input color primaries. Same accepted values as primaries.

itrc โ€” overrides the input transfer characteristics. Same accepted values as trc.

irange โ€” overrides the input color range. Same accepted values as range.


Okay so here's the whole vibe of the filter: it converts the transfer characteristics, the color space and the color primaries over to whatever values you specified. If you didn't specify an output value, it gets a default based on the all property โ€” and if that property also isn't specified, the filter will log an error ๐Ÿ˜ญ๐Ÿ“ข.

The output color range and format default to the same value as the input color range and format. And lowkey important: the input transfer characteristics, color space, color primaries and color range should be set on the input data. If any of those are missing, the filter logs an error and no conversion will take place โ€” nothing happens, it just gives up ๐Ÿ™ˆ.

So like, for example, to convert the input to SMPTE-240M, you'd hit it with:

colorspace=smpte240m

๐Ÿ’œ colortemperature

Adjusts the color temperature in video to simulate variations in ambient color temperature. It's giving cozy lamp light vs. harsh office lighting, and we love that for us ๐Ÿซถ

The filter takes these options:

  • temperature โ€” set the temperature in Kelvin. Allowed range is from 1000 to 40000. Default is 6500 K ๐ŸŒก๏ธ
  • mix โ€” sets the mixing with the filtered output. Allowed range is from 0 to 1. Default is 1.
  • pl โ€” sets the amount of preserving lightness. Allowed range is from 0 to 1. Default is 0.

Commands

This filter supports the same commands as options ๐Ÿ’…


๐Ÿฆ‹ convolution

Applies a convolution of 3x3, 5x5, 7x7 or horizontal/vertical up to 49 elements. Yes bestie, it's the math one. It slays though, for real.

The filter takes these options:

  • 0m, 1m, 2m, 3m โ€” set the matrix for each plane. The matrix is a sequence of 9, 25 or 49 signed integers in square mode, and from 1 to 49 odd number of signed integers in row mode.
  • 0rdiv, 1rdiv, 2rdiv, 3rdiv โ€” set the multiplier for the calculated value for each plane. If unset or 0, it will be 1/sum of all matrix elements.
  • 0bias, 1bias, 2bias, 3bias โ€” set the bias for each plane. This value gets added to the result of the multiplication. Useful for making the overall image brighter or darker. Default is 0.0.
  • 0mode, 1mode, 2mode, 3mode โ€” set the matrix mode for each plane. Can be square, row or column. Default is square.

Commands

This filter supports all of the above options as commands โœจ

Examples

  • Apply sharpen:
convolution="0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0"
  • Apply blur:
convolution="1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9"
  • Apply edge enhance:
convolution="0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128"
  • Apply edge detect:
convolution="0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128"
  • Apply laplacian edge detector which includes diagonals:
convolution="1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:5:5:5:1:0:128:128:0"
  • Apply emboss:
convolution="-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2"

๐Ÿงš convolve

Applies a 2D convolution of the video stream in the frequency domain, using the second stream as the impulse. Two inputs, one very fancy math moment ๐ŸŒˆ

Options:

  • planes โ€” set which planes to process.
  • impulse โ€” set which impulse video frames will be processed, can be first or all. Default is all.
The convolve filter also supports the framesync options ๐Ÿ‘€

๐Ÿ“ copy

Copies the input video source unchanged to the output. That's it, that's the filter ๐Ÿ’… mainly useful for testing purposes.


๐ŸŽ€ coreimage

Video filtering on the GPU using Apple's CoreImage API on OSX. Fancy Apple behaviour, we respect it ๐ŸŽโœจ

Hardware acceleration here is based on an OpenGL context. Usually that means it gets processed by video hardware โ€” but heads up: software-based OpenGL implementations exist, so there's no guarantee of hardware processing. It depends on the respective OSX ๐Ÿ˜ญ

Apple provides a lot of filters and image generators with a huge variety of options. You have to reference the filter by its name along with its options.

The coreimage filter accepts these options:

  • list_filters โ€” lists all available filters and generators along with all their respective options, plus possible minimum and maximum values and the default values. Like this:
list_filters=true
  • filter โ€” specify all filters by their respective name and options. Use list_filters to figure out all the valid filter names and options. Numerical options are specified by a float value and are automatically clamped to their respective value range. Vector and color options have to be specified by a list of space separated float values. Character escaping has to be done. There's a special option name default available for using default options for a filter.

It is required to specify either default or at least one of the filter options. All omitted options are used with their default values. The syntax of the filter string is as follows:

filter=<NAME>@<OPTION>=<VALUE>[@<OPTION>=<VALUE>][@...][#<NAME>@<OPTION>=<VALUE>[@<OPTION>=<VALUE>][@...]][#...]
  • output_rect โ€” specify a rectangle where the output of the filter chain is copied into the input image. It's given by a list of space separated float values:
output_rect=x\ y\ width\ height

If it's not given, the output rectangle equals the dimensions of the input image. The output rectangle gets automatically cropped at the borders of the input image. Negative values are valid for each component, bestie ๐Ÿซถ

output_rect=25\ 25\ 100\ 100

Several filters can be chained for successive processing without GPU-HOST transfers, which allows for fast processing of complex filter chains ๐Ÿ”ฅ Currently only filters with zero (generators) or exactly one (filters) input image and one output image are supported. Also, transition filters are not yet usable as intended โ€” sad, but true ๐Ÿ™ˆ

Some filters generate output images with additional padding depending on the respective filter kernel. That padding is automatically removed so the filter output has the same size as the input image. Iconic, no notes.

For image generators, the size of the output image is determined by the previous output image of the filter chain, or the input image of the whole filterchain, respectively. The generators do not use the pixel information of this image to generate their output. However โ€” and this is the cute part โ€” the generated output gets blended onto this image, resulting in partial or complete coverage of the output image ๐ŸŒธ

You can use the coreimagesrc video source for generating input images which are fed directly into the filter chain. If you use it, you don't need to provide input images from another video source or an input video at all ๐Ÿ’…

Examples

  • List all filters available:
coreimage=list_filters=true
  • Use the CIBoxBlur filter with default options to blur an image:
coreimage=filter=CIBoxBlur@default
  • Use a filter chain with CISepiaTone at default values and CIVignetteEffect with its center at 100x100 and a radius of 50 pixels:
coreimage=filter=CIBoxBlur@default#CIVignetteEffect@inputCenter=100\ 100@inputRadius=50
  • Use nullsrc and CIQRCodeGenerator to create a QR code for the FFmpeg homepage, given as a complete and escaped command-line for Apple's standard bash shell:
ffmpeg -f lavfi -i nullsrc=s=100x100,coreimage=filter=CIQRCodeGenerator@inputMessage=https\\\\\://FFmpeg.org/@inputCorrectionLevel=H -frames:v 1 QRCode.png

โญ corr

Obtains the correlation between two input videos. Two inputs, bestie โ€” this filter takes two input videos ๐Ÿซถ

Both input videos must have the same resolution and pixel format for this filter to work right โ€” no cap, it will not vibe otherwise. It also assumes both inputs have the same number of frames, which get compared one by one.

The per-component, average, min and max correlation it gets is printed out through the logging system.

The filter stashes the calculated correlation of each frame in frame metadata.

This filter also supports the framesync options. โœจ

In the example below, the input file main.mpg being processed gets compared with the reference file ref.mpg.

ffmpeg -i main.mpg -i ref.mpg -lavfi corr -f null -

cover_rect

Cover a rectangular object ๐ŸŽ€

It accepts the following options:

  • cover โ€” filepath of the optional cover image, needs to be in yuv420.
  • mode โ€” set the covering mode.

It accepts the following values:

  • cover โ€” cover it by the supplied image
  • blur โ€” cover it by interpolating the surrounding pixels

Default value is blur. ๐Ÿ’…

Examples

  • Cover a rectangular object by the supplied image of a given video using ffmpeg:
ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv

crop

Crop the input video to given dimensions. โœ‚๏ธ iconic behavior honestly.

It accepts the following parameters:

  • w, out_w โ€” the width of the output video. Defaults to iw. This expression is evaluated only once during the filter configuration, or when the w or out_w command is sent.
  • h, out_h โ€” the height of the output video. Defaults to ih. This expression is evaluated only once during the filter configuration, or when the h or out_h command is sent.
  • x โ€” the horizontal position, in the input video, of the left edge of the output video. Defaults to (in_w-out_w)/2. This expression is evaluated per-frame.
  • y โ€” the vertical position, in the input video, of the top edge of the output video. Defaults to (in_h-out_h)/2. This expression is evaluated per-frame.
  • keep_aspect โ€” if set to 1 it will force the output display aspect ratio to be the same as the input, by changing the output sample aspect ratio. Defaults to 0.
  • exact โ€” enable exact cropping. If enabled, subsampled videos will be cropped at exact width/height/x/y as specified and will not be rounded to the nearest smaller value. Defaults to 0.

The out_w, out_h, x, y parameters are expressions containing the following constants:

  • x, y โ€” the computed values for x and y. They are evaluated for each new frame.
  • in_w, in_h โ€” the input width and height.
  • iw, ih โ€” these are the same as in_w and in_h.
  • out_w, out_h โ€” the output (cropped) width and height.
  • ow, oh โ€” these are the same as out_w and out_h.
  • a โ€” same as iw / ih
  • sar โ€” input sample aspect ratio
  • dar โ€” input display aspect ratio, it is the same as (iw / ih) * sar
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • n โ€” the number of the input frame, starting from 0.
  • pos โ€” the position in the file of the input frame, NAN if unknown; deprecated, do not use ๐Ÿ’€
  • t โ€” the timestamp expressed in seconds. It's NAN if the input timestamp is unknown.

The expression for out_w may depend on the value of out_h, and the expression for out_h may depend on out_w โ€” but they cannot depend on x and y, because x and y get evaluated after out_w and out_h. Order matters bestie, it's giving causality.

The x and y parameters specify the expressions for the position of the top-left corner of the output (non-cropped) area. They're evaluated for each frame. If the evaluated value isn't valid, it gets approximated to the nearest valid value.

The expression for x may depend on y, and the expression for y may depend on x. Mutual dependency, we love to see it. ๐Ÿซถ

Examples

  • Crop area with size 100x100 at position (12,34).
crop=100:100:12:34

Using named options, the example above becomes:

crop=w=100:h=100:x=12:y=34
  • Crop the central input area with size 100x100:
crop=100:100
  • Crop the central input area with size 2/3 of the input video:
crop=2/3*in_w:2/3*in_h
  • Crop the input video central square:
crop=out_w=in_h
crop=in_h
  • Delimit the rectangle with the top-left corner placed at position 100:100 and the right-bottom corner corresponding to the right-bottom corner of the input image.
crop=in_w-100:in_h-100:100:100
  • Crop 10 pixels from the left and right borders, and 20 pixels from the top and bottom borders
crop=in_w-2*10:in_h-2*20
  • Keep only the bottom right quarter of the input image:
crop=in_w/2:in_h/2:in_w/2:in_h/2
  • Crop height for getting Greek harmony:
crop=in_w:1/PHI*in_w
  • Apply trembling effect:
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
  • Apply erratic camera effect depending on timestamp:
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(t*10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(t*13)
  • Set x depending on the value of y:
crop=in_w/2:in_h/2:y:10+10*sin(n/10)

Commands

This filter supports the following commands:

  • w, out_w, h, out_h, x, y โ€” set width/height of the output video and the horizontal/vertical position in the input video. The command accepts the same syntax as the corresponding option.

If the specified expression isn't valid, it's kept at its current value.


cropdetect

Auto-detect the crop size. ๐Ÿ”โœจ

It calculates the necessary cropping parameters and prints the recommended parameters via the logging system. The detected dimensions correspond to the non-black (or video) area of the input video, according to mode.

It accepts the following parameters:

  • mode โ€” depending on mode, crop detection is based on either the mere black value of surrounding pixels or a combination of motion vectors and edge pixels.
    • black โ€” detect black pixels surrounding the playing video. For fine control use option limit.
    • mvedges โ€” detect the playing video by the motion vectors inside the video and scanning for edge pixels typically forming the border of a playing video.
  • limit โ€” set a higher black value threshold, which can optionally be specified from nothing (0) to everything (255 for 8-bit based formats). An intensity value greater than the set value is considered non-black. It defaults to 24. You can also specify a value between 0.0 and 1.0 which will be scaled depending on the bitdepth of the pixel format.
  • round โ€” the value which the width/height should be divisible by. Defaults to 16. The offset is automatically adjusted to center the video. Use 2 to get only even dimensions (needed for 4:2:2 video). 16 is best when encoding to most video codecs.
  • skip โ€” set the number of initial frames for which evaluation is skipped. Default is 2. Range is 0 to INT_MAX.
  • reset_count, reset โ€” set the counter that determines after how many frames cropdetect will reset the previously detected largest video area and start over to detect the current optimal crop area. Default value is 0.

This can be useful when channel logos distort the video area. 0 indicates 'never reset', and returns the largest area encountered during playback.

  • mv_threshold โ€” set motion in pixel units as threshold for motion detection. It defaults to 8.
  • low, high โ€” set low and high threshold values used by the Canny thresholding algorithm.

The high threshold selects the "strong" edge pixels, which are then connected through 8-connectivity with the "weak" edge pixels selected by the low threshold.

low and high threshold values must be chosen in the range [0,1], and low should be lesser or equal to high.

Default value for low is 5/255, and default value for high is 15/255. ๐ŸŽ€

Examples

  • Find video area surrounded by black borders:
ffmpeg -i file.mp4 -vf cropdetect,metadata=mode=print -f null -
  • Find an embedded video area, generate motion vectors beforehand:
ffmpeg -i file.mp4 -vf mestimate,cropdetect=mode=mvedges,metadata=mode=print -f null -
  • Find an embedded video area, use motion vectors from decoder:
ffmpeg -flags2 +export_mvs -i file.mp4 -vf cropdetect=mode=mvedges,metadata=mode=print -f null -

Commands

This filter supports the following commands:

  • limit โ€” the command accepts the same syntax as the corresponding option. If the specified expression isn't valid, it's kept at its current value.

cue

Delay video filtering until a given wallclock timestamp. โฐ The filter first passes on preroll amount of frames, then it buffers at most buffer amount of frames and waits for the cue. After reaching the cue it forwards the buffered frames and also any subsequent frames coming in on its input.

The filter can be used to synchronize the output of multiple ffmpeg processes for realtime output devices like decklink. By putting the delay in the filtering chain and pre-buffering frames, the process can pass on data to output almost immediately after the target wallclock timestamp is reached.

Perfect frame accuracy cannot be guaranteed, but the result is good enough for some use cases. ๐Ÿ™ˆ
  • cue โ€” the cue timestamp expressed in a UNIX timestamp in microseconds. Default is 0.
  • preroll โ€” the duration of content to pass on as preroll, expressed in seconds. Default is 0.
  • buffer โ€” the maximum duration of content to buffer before waiting for the cue, expressed in seconds. Default is 0.

curves

Apply color adjustments using curves. ๐ŸŒˆ

This filter is similar to the Adobe Photoshop and GIMP curves tools. Each component (red, green and blue) has its values defined by N key points tied from each other using a smooth curve. The x-axis represents the pixel values from the input frame, and the y-axis the new pixel values to be set for the output frame.

By default, a component curve is defined by the two points (0;0) and (1;1). This creates a straight line where each original pixel value is "adjusted" to its own value, which means no change to the image. ๐Ÿ’… slay, doing nothing flawlessly.

okay so this filter lets you redefine those two points and add even more, bestie. a new curve gets defined to pass smoothly through all these new coordinates. the new points need to be strictly increasing over the x-axis, and their x and y values must be in the [0;1] interval. the curve is formed by using a natural or monotonic cubic spline interpolation, depending on the interp option (default: "natural"). the "natural" spline produces a smoother curve in general while the monotonic ("pchip") spline guarantees the transitions between the specified points to be monotonic. if the computed curves happened to go outside the vector spaces, the values will be clipped accordingly. no cap, it just clips them ๐Ÿ’…

It accepts these options (yes, literally all of them):

  • preset โ€” select one of the available color presets. this option can be used in addition to the r, g, b parameters; in this case, the later options take priority on the preset values. available presets are:
    • none
    • color_negative
    • cross_process
    • darker
    • increase_contrast
    • lighter
    • linear_contrast
    • medium_contrast
    • negative
    • strong_contrast
    • vintage

default is "none".

  • master, m โ€” set the master key points. these points define a second pass mapping. it's sometimes called a "luminance" or "value" mapping. it can be used with r, g, b or all since it acts like a post-processing LUT. main character energy fr โœจ
  • red, r โ€” set the key points for the red component.
  • green, g โ€” set the key points for the green component.
  • blue, b โ€” set the key points for the blue component.
  • all โ€” set the key points for all components (not including master). can be used in addition to the other key points component options. in this case, the unset component(s) will fallback on this all setting.
  • psfile โ€” specify a Photoshop curves file (".acv") to import the settings from. photoshop but make it terminal ๐ŸŽ€
  • plot โ€” save Gnuplot script of the curves in specified file.
  • interp โ€” specify the kind of interpolation. available algorithms are:
    • natural โ€” natural cubic spline using a piece-wise cubic polynomial that is twice continuously differentiable.
    • pchip โ€” monotonic cubic spline using a piecewise cubic Hermite interpolating polynomial (PCHIP).

to avoid some filtergraph syntax conflicts, each key points list needs to be defined using the following syntax: "x0/y0 x1/y1 x2/y2 ...". iykyk ๐ŸŒธ

๐Ÿ’ฌ Commands

this filter supports same commands as options.

โœจ Examples

  • increase slightly the middle level of blue:
curves=blue='0/0 0.5/0.58 1/1'
  • vintage effect:
curves=r='0/0.11 .42/.51 1/0.95':g='0/0 0.50/0.48 1/1':b='0/0.22 .49/.44 1/0.8'

here we obtain the following coordinates for each component:

  • red: (0;0.11) (0.42;0.51) (1;0.95)
  • green: (0;0) (0.50;0.48) (1;1)
  • blue: (0;0.22) (0.49;0.44) (1;0.80)
  • the previous example can also be achieved with the associated built-in preset:
curves=preset=vintage
  • or simply:
curves=vintage
  • use a Photoshop preset and redefine the points of the green component:
curves=psfile='MyCurvesPresets/purple.acv':green='0/0 0.45/0.53 1/1'
  • check out the curves of the "cross_process" profile using ffmpeg and gnuplot:
ffmpeg -f lavfi -i color -vf curves=cross_process:plot=/tmp/curves.plt -frames:v 1 -f null -
gnuplot -p /tmp/curves.plt

๐Ÿ•ต๏ธโ€โ™€๏ธ datascope

video data analysis filter. it's giving forensic girlie ๐Ÿ’–

this filter shows hexadecimal pixel values of part of video.

it accepts these options:

  • size, s โ€” set output video size.
  • x โ€” set x offset from where to pick pixels.
  • y โ€” set y offset from where to pick pixels.
  • mode โ€” set scope mode, can be one of the following:
    • mono โ€” draw hexadecimal pixel values with white color on black background.
    • color โ€” draw hexadecimal pixel values with input video pixel color on black background.
    • color2 โ€” draw hexadecimal pixel values on color background picked from input video, the text color is picked in such way so it's always visible.
  • axis โ€” draw rows and columns numbers on left and top of video.
  • opacity โ€” set background opacity.
  • format โ€” set display number format. can be "hex", or "dec". default is "hex".
  • components โ€” set pixel components to display. by default all pixel components are displayed.

๐Ÿ’ฌ Commands

this filter supports same commands as options excluding the size option.


๐ŸŒ€ dblur

apply Directional blur filter. motion blur but make it intentional ๐Ÿฆ‹

it accepts these options:

  • angle โ€” set angle of directional blur. default is 45.
  • radius โ€” set radius of directional blur. default is 5.
  • planes โ€” set which planes to filter. by default all planes are filtered.

๐Ÿ’ฌ Commands

this filter supports same commands as options. the command accepts the same syntax of the corresponding option.

if the specified expression is not valid, it is kept at its current value.


๐Ÿงผ dctdnoiz

denoise frames using 2D DCT (frequency domain filtering). fancy math denoise, slay โœจ

โš ๏ธ this filter is not designed for real time, bestie. plan accordingly. ๐Ÿ’€

it accepts these options:

  • sigma, s โ€” set the noise sigma constant.

this sigma defines a hard threshold of 3 * sigma; every DCT coefficient (absolute value) below this threshold will be dropped.

if you need a more advanced filtering, see expr.

default is 0.

  • overlap โ€” set number overlapping pixels for each block. since the filter can be slow, you may want to reduce this value, at the cost of a less effective filter and the risk of various artefacts.

if the overlapping value doesn't permit processing the whole input width or height, a warning will be displayed and according borders won't be denoised.

default value is blocksize-1, which is the best possible setting.

  • expr, e โ€” set the coefficient factor expression.

for each coefficient of a DCT block, this expression will be evaluated as a multiplier value for the coefficient.

if this option is set, the sigma option will be ignored.

the absolute value of the coefficient can be accessed through the c variable.

  • n โ€” set the blocksize using the number of bits. 1<<n defines the blocksize, which is the width and height of the processed blocks.

the default value is 3 (8x8) and can be raised to 4 for a blocksize of 16x16. note that changing this setting has huge consequences on the speed processing. also, a larger block size does not necessarily mean a better de-noising. ngl, bigger is not always better here ๐Ÿ˜ญ

โœจ Examples

  • apply a denoise with a sigma of 4.5:
dctdnoiz=4.5
  • the same operation can be achieved using the expression system:
dctdnoiz=e='gte(c, 4.5*3)'
  • violent denoise using a block size of "16x16":
dctdnoiz=15:n=4

๐ŸŒˆ deband

remove banding artifacts from input video. it works by replacing banded pixels with average value of referenced pixels. bye bye ugly bands ๐Ÿ‘‹

it accepts these options:

  • 1thr, 2thr, 3thr, 4thr โ€” set banding detection threshold for each plane. default is 0.02. valid range is 0.00003 to 0.5. if difference between current pixel and reference pixel is less than threshold, it will be considered as banded.
  • range, r โ€” banding detection range in pixels. default is 16. if positive, random number in range 0 to set value will be used. if negative, exact absolute value will be used. the range defines square of four pixels around current pixel.
  • direction, d โ€” set direction in radians from which four pixels will be compared. if positive, random direction from 0 to set direction will be picked. if negative, exact absolute value will be picked. for example direction 0, -PI or -2*PI radians will pick only pixels on same row and -PI/2 will pick only pixels on same column.
  • blur, b โ€” if enabled, current pixel is compared with average value of all four surrounding pixels. the default is enabled. if disabled current pixel is compared with all four surrounding pixels. the pixel is considered banded if only all four differences with surrounding pixels are less than threshold.
  • coupling, c โ€” if enabled, current pixel is changed if and only if all pixel components are banded, e.g. banding detection threshold is triggered for all color components. the default is disabled.

๐Ÿ’ฌ Commands

this filter supports the all above options as commands.


๐Ÿงฑ deblock

remove blocking artifacts from input video. smooth those blocky edges, periodt ๐Ÿงš

it accepts these options:

  • filter โ€” set filter type, can be weak or strong. default is strong. this controls what kind of deblocking is applied.
  • block โ€” set size of block, allowed range is from 4 to 512. default is 8.
  • alpha, beta, gamma, delta โ€” set blocking detection thresholds. allowed range is 0 to 1. defaults are: 0.098 for alpha and 0.05 for the rest. using higher threshold gives more deblocking strength. setting alpha controls threshold detection at exact edge of block. remaining options control threshold detection near the edge. each one for below/above or left/right. setting any of those to 0 disables deblocking.
  • planes โ€” set planes to filter. default is to filter all available planes.

โœจ Examples

  • deblock using weak filter and block size of 4 pixels:
deblock=filter=weak:block=4
  • deblock using strong filter, block size of 4 pixels and custom thresholds for deblocking more edges:
deblock=filter=strong:block=4:alpha=0.12:beta=0.07:gamma=0.06:delta=0.05
  • similar as above, but filter only first plane:
deblock=filter=strong:block=4:alpha=0.12:beta=0.07:gamma=0.06:delta=0.05:planes=1
  • similar as above, but filter only second and third plane:
deblock=filter=strong:block=4:alpha=0.12:beta=0.07:gamma=0.06:delta=0.05:planes=6

๐Ÿ’ฌ Commands

this filter supports the all above options as commands.


๐Ÿ—‘๏ธ decimate

drop duplicated frames at regular intervals. bye duplicate frames, we don't know her ๐Ÿ’…

it accepts these options:

  • cycle โ€” set the number of frames from which one will be dropped. setting this to N means one frame in every batch of N frames will be dropped. default is 5.
  • dupthresh โ€” the "is this a dupe?" threshold ๐Ÿ’… if a frame's difference metric comes out less than or equal to this number, bestie, it gets declared a duplicate. Default is 1.1.
  • scthresh โ€” sets the scene change threshold. Default is 15.
  • blockx, blocky โ€” the size of the x and y-axis blocks used during the metric calculations. Bigger blocks = better noise suppression but worse detection of tiny movements (trade-off city ๐Ÿ˜ญ). Must be a power of two. Default is 32.
  • ppsrc โ€” marks the main input as a pre-processed input and activates the clean source input stream. This is the whole slay: you get to pre-process the input with whatever filters you want to help the metrics calculation, while keeping the frame selection lossless. When set to 1, the first stream is the pre-processed input and the second stream is the clean source from where the kept frames are chosen. Default is 0.
  • chroma โ€” sets whether chroma is considered in the metric calculations or not. Default is 1.
  • mixed โ€” sets whether the input only partially contains content to be decimated. Default is "false". Heads up: if enabled, the video output stream will be in variable frame rate. ๐Ÿ‘€

๐ŸŒ€ deconvolve

Applies a 2D deconvolution of the video stream in the frequency domain, using the second stream as the impulse. Big brain energy fr fr.

The filter accepts the following options:

  • planes โ€” set which planes to process.
  • impulse โ€” set which impulse video frames will be processed. Can be first or all. Default is all.
  • noise โ€” sets the noise used when doing divisions. Default is 0.0000001. Super useful when width and height are not the same and not power of 2, or if the stream prior to convolving had noise in it. ๐Ÿซถ

The deconvolve filter also supports the framesync options.


โœจ dedot

Reduces cross-luminance (aka dot-crawl) and cross-color (aka rainbows ๐ŸŒˆ) from the video. Iconic little cleanup crew.

It accepts the following options:

  • m โ€” set the mode of operation. Can be a combination of dotcrawl for cross-luminance reduction and/or rainbows for cross-color reduction.
  • lt โ€” set the spatial luma threshold. Lower values increase the reduction of cross-luminance.
  • tl โ€” set the tolerance for temporal luma. Higher values increase the reduction of cross-luminance.
  • tc โ€” set the tolerance for chroma temporal variation. Higher values increase the reduction of cross-color.
  • ct โ€” set the temporal chroma threshold. Lower values increase the reduction of cross-color.

๐ŸŽˆ deflate

Applies a deflate effect to the video. The way this works is it replaces the pixel with the local (3x3) average, taking into account only values lower than the pixel. So it's like a squeeze, but make it โœจaestheticโœจ.

It accepts the following options:

  • threshold0, threshold1, threshold2, threshold3 โ€” limit the maximum change for each plane. Default is 65535. If 0, that plane will remain unchanged.

Commands

This filter supports all the above options as commands. ๐Ÿ’…


๐ŸŒธ deflicker

Removes temporal frame luminance variations. Bye-bye flicker, you will not be missed.

It accepts the following options:

  • size, s โ€” set the moving-average filter size in frames. Default is 5. Allowed range is 2 - 129.
  • mode, m โ€” set the averaging mode for smoothing out those temporal luminance variations.

Available values are:

  • am โ€” Arithmetic mean
  • gm โ€” Geometric mean
  • hm โ€” Harmonic mean
  • qm โ€” Quadratic mean
  • cm โ€” Cubic mean
  • pm โ€” Power mean
  • median โ€” Median
  • bypass โ€” do not actually modify the frame. So useful when you only want the metadata and nothing else. Main character behaviour honestly.

๐Ÿ–ฅ๏ธ deinterlace_d3d12

Deinterlaces the input video using D3D12 hardware-accelerated video processing. GPU go brrr โšก

This filter uses the DirectX 12 Video Processor to perform deinterlacing on the GPU, supporting both simple bob and driver-defined advanced (motion-adaptive) algorithms. It requires the input to be in d3d12 hardware pixel format.

The filter automatically queries the hardware for the required number of temporal reference frames (if needed) and manages a frame queue to supply them. It's very much doing the most so you don't have to. ๐Ÿซถ

It accepts the following options:

  • method โ€” the deinterlacing method. It accepts one of the following values:
    • default โ€” select the best deinterlacing method available on the hardware. If the driver supports custom, that method is used; otherwise it falls back to bob. This is the default.
    • bob โ€” bob deinterlacing. Each field is independently scaled to full frame height. Simple and fast, but may produce visible bob artifacts on moving content. ๐Ÿ˜ฌ
    • custom โ€” driver-defined advanced deinterlacing. The exact algorithm is hardware-specific and typically employs motion-adaptive techniques with temporal reference frames for higher quality.

The default value is "default".

  • mode โ€” specify the interlacing mode. It accepts one of the following values:
    • frame โ€” send one frame for each frame. The output frame rate equals the input frame rate. This is the default.
    • field โ€” send one frame for each field. The output frame rate is double the input frame rate. ๐Ÿ”ฅ

The default value is "frame".

  • deint โ€” specify which frames to deinterlace. It accepts one of the following values:
    • all โ€” deinterlace all frames. This is the default.
    • interlaced โ€” only deinterlace frames marked as interlaced; progressive frames are passed through unchanged.

The default value is "all".

Examples

  • Deinterlace an interlaced video using software decoding and the best available hardware deinterlacing method:
ffmpeg -init_hw_device d3d12va=d3d12 -filter_hw_device d3d12 -i input.ts \
       -vf "format=nv12,hwupload,deinterlace_d3d12=method=default,hwdownload,format=nv12" \
       -c:v libx264 -crf 18 output.mp4
  • Deinterlace at field rate (double the frame rate) using bob method with hardware decoding (full d3d12 pipeline):
ffmpeg -hwaccel d3d12va -hwaccel_output_format d3d12 -i input.ts \
       -vf "deinterlace_d3d12=method=bob:mode=field" \
       -c:v h264_d3d12va output.mp4
  • Deinterlace only interlaced frames, passing progressive frames through:
ffmpeg -init_hw_device d3d12va=d3d12 -filter_hw_device d3d12 -i input.ts \
       -vf "format=nv12,hwupload,deinterlace_d3d12=deint=interlaced,hwdownload,format=nv12" \
       -c:v libx264 -crf 18 output.mp4

๐ŸŽ€ dejudder

Removes judder produced by partially interlaced telecined content. Ngl this one's a vibe-saver.

Judder can get introduced, for instance, by the pullup filter. If the original source was partially telecined content, then the output of pullup,dejudder will have a variable frame rate. It may change the recorded frame rate of the container. Aside from that change, this filter will not affect constant frame rate video. Periodt.

The option available in this filter is:

  • cycle โ€” specify the length of the window over which the judder repeats.

Accepts any integer greater than 1. Useful values are:

  • 4 โ€” if the original was telecined from 24 to 30 fps (Film to NTSC).
  • 5 โ€” if the original was telecined from 25 to 30 fps (PAL to NTSC).
  • 20 โ€” if a mixture of the two.

The default is 4.


Suppresses a TV station logo by a simple interpolation of the surrounding pixels. Just set a rectangle covering the logo and watch it disappear (and sometimes something even uglier appear โ€” your mileage may vary ๐Ÿ˜ญ๐Ÿ™ˆ).

It accepts the following parameters:

  • x, y โ€” specify the top left corner coordinates of the logo. They must be specified.
  • w, h โ€” specify the width and height of the logo to clear. They must be specified.
  • show โ€” when set to 1, a green rectangle is drawn on the screen to simplify finding the right x, y, w, and h parameters. The default value is 0.

The rectangle is drawn on the outermost pixels which will be (partly) replaced with interpolated values. The values of the next pixels immediately outside this rectangle in each direction will be used to compute the interpolated pixel values inside the rectangle. Sneaky but genius. ๐Ÿ’…

Examples

  • Set a rectangle covering the area with top left corner coordinates 0,0 and size 100x77:
delogo=x=0:y=0:w=100:h=77

๐ŸŒง๏ธ derain

Removes the rain in the input image/video by applying derain methods based on convolutional neural networks. Supported models:

Training as well as model generation scripts are provided in the repository at <https://github.com/XueweiMeng/derain_filter.git>.

The filter accepts the following options:

  • filter_type โ€” specify which filter to use. This option accepts the following values:
    • derain โ€” Derain filter. To conduct a derain filter, you need to use a derain model.
    • dehaze โ€” Dehaze filter. To conduct a dehaze filter, you need to use a dehaze model.

Default value is derain.

  • dnn_backend โ€” specify which DNN backend to use for model loading and execution. This option accepts the following values:
    • tensorflow โ€” TensorFlow backend. To enable this backend you need to install the TensorFlow for C library (see <https://www.tensorflow.org/install/lang_c>) and configure FFmpeg with --enable-libtensorflow.
  • model โ€” set the path to the model file specifying the network architecture and its parameters. Note that different backends use different file formats. TensorFlow can load files for only its format.
To get full functionality (such as async execution), please use the dnn_processing filter. ๐Ÿ’–

๐Ÿฆ‹ deshake

Attempts to fix small changes in horizontal and/or vertical shift. This filter helps remove camera shake from hand-holding a camera, bumping a tripod, moving on a vehicle, etc. Basically it's the "my hands said ๐Ÿซจ" filter.

The filter accepts the following options:

  • x, y, w, h โ€” specify a rectangular area where to limit the search for motion vectors. If desired, the search for motion vectors can be limited to a rectangular area of the frame defined by its top left corner, width and height. These parameters have the same meaning as the drawbox filter, which can be used to visualise the position of the bounding box.

This is useful when simultaneous movement of subjects within the frame might be confused for camera motion by the motion vector search. iykyk ๐Ÿ‘‘

If any or all of x, y, w and h are set to -1, then the full frame is used. That lets later options be set without specifying the bounding box for the motion vector search. Default? Search the whole frame, periodt. ๐Ÿ’…

  • rx, ry โ€” specify the maximum extent of movement in the x and y directions, in the range 0-64 pixels. Default is 16.
  • edge โ€” specify how to generate pixels to fill blanks at the edge of the frame. Available values are:
    • blank, 0 โ€” fill zeroes at blank locations
    • original, 1 โ€” original image at blank locations
    • clamp, 2 โ€” extruded edge value at blank locations
    • mirror, 3 โ€” mirrored edge at blank locations

Default value is mirror.

  • blocksize โ€” specify the blocksize to use for motion search. Range 4-128 pixels, default 8.
  • contrast โ€” specify the contrast threshold for blocks. Only blocks with more than the specified contrast (difference between darkest and lightest pixels) will be considered. Range 1-255, default 125.
  • search โ€” specify the search strategy. Available values are:
    • exhaustive, 0 โ€” set exhaustive search
    • less, 1 โ€” set less exhaustive search

Default value is exhaustive.

  • filename โ€” if set, then a detailed log of the motion search is written to the specified file.

despill ๐Ÿ’…

Remove unwanted contamination of foreground colors, caused by reflected color of greenscreen or bluescreen. Iconic cleanup behavior, no cap.

This filter accepts the following options:

  • type โ€” set what type of despill to use.
  • mix โ€” set how spillmap will be generated.
  • expand โ€” set how much to get rid of still remaining spill.
  • red โ€” controls amount of red in spill area.
  • green โ€” controls amount of green in spill area. Should be -1 for greenscreen.
  • blue โ€” controls amount of blue in spill area. Should be -1 for bluescreen.
  • brightness โ€” controls brightness of spill area, preserving colors.
  • alpha โ€” modify alpha from generated spillmap.

Commands โœจ

This filter supports the all above options as commands. ๐Ÿซถ


detelecine ๐ŸŽ€

Apply an exact inverse of the telecine operation. It requires a predefined pattern specified using the pattern option which must be the same as that passed to the telecine filter.

This filter accepts the following options:

  • first_field
    • top, t โ€” top field first
    • bottom, b โ€” bottom field first. The default value is "top".
  • pattern โ€” a string of numbers representing the pulldown pattern you wish to apply. The default value is 23.
  • start_frame โ€” a number representing position of the first frame with respect to the telecine pattern. This is to be used if the stream is cut. The default value is 0.

dilation ๐ŸŒธ

Apply dilation effect to the video.

This filter replaces the pixel by the local(3x3) maximum.

It accepts the following options:

  • threshold0, threshold1, threshold2, threshold3 โ€” limit the maximum change for each plane, default is 65535. If 0, plane will remain unchanged.
  • coordinates โ€” flag which specifies the pixel to refer to. Default is 255 i.e. all eight pixels are used.

Flags to local 3x3 coordinates maps like this:

1 2 3
4   5
6 7 8

Commands โœจ

This filter supports the all above options as commands. ๐Ÿ’–


displace ๐Ÿฆ‹

Displace pixels as indicated by second and third input stream.

It takes three input streams and outputs one stream, the first input is the source, and second and third input are displacement maps.

The second input specifies how much to displace pixels along the x-axis, while the third input specifies how much to displace pixels along the y-axis. If one of displacement map streams terminates, last frame from that displacement map will be used.

Note that once generated, displacements maps can be reused over and over again. Reuse king behavior fr fr.

A description of the accepted options follows.

  • edge โ€” set displace behavior for pixels that are out of range.

Available values are:

  • blank โ€” missing pixels are replaced by black pixels.
  • smear โ€” adjacent pixels will spread out to replace missing pixels.
  • wrap โ€” out of range pixels are wrapped so they point to pixels of other side.
  • mirror โ€” out of range pixels will be replaced with mirrored pixels.

Default is smear.

Examples ๐ŸŒˆ

  • Add ripple effect to rgb input of video size hd720:
ffmpeg -i INPUT -f lavfi -i nullsrc=s=hd720,lutrgb=128:128:128 -f lavfi -i nullsrc=s=hd720,geq='r=128+30*sin(2*PI*X/400+T):g=128+30*sin(2*PI*X/400+T):b=128+30*sin(2*PI*X/400+T)' -lavfi '[0][1][2]displace' OUTPUT
  • Add wave effect to rgb input of video size hd720:
ffmpeg -i INPUT -f lavfi -i nullsrc=hd720,geq='r=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):g=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):b=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T))' -lavfi '[1]split[x][y],[0][x][y]displace' OUTPUT

dnn_classify ๐Ÿ‘‘

Do classification with deep neural networks based on bounding boxes.

The filter accepts the following options:

  • dnn_backend โ€” specify which DNN backend to use for model loading and execution. This option accepts only openvino now, tensorflow backends will be added.
  • model โ€” set path to model file specifying network architecture and its parameters. Note that different backends use different file formats.
  • input โ€” set the input name of the dnn network.
  • output โ€” set the output name of the dnn network.
  • confidence โ€” set the confidence threshold (default: 0.5).
  • labels โ€” set path to label file specifying the mapping between label id and name. Each label name is written in one line, tailing spaces and empty lines are skipped. The first line is the name of label id 0, and the second line is the name of label id 1, etc. The label id is considered as name if the label file is not provided.
  • backend_configs โ€” set the configs to be passed into backend.

For tensorflow backend, you can set its configs with sess_config options, please use tools/python/tf_sess_config.py to get the configs for your system.


dnn_detect ๐Ÿ”ฅ

Do object detection with deep neural networks.

The filter accepts the following options:

  • dnn_backend โ€” specify which DNN backend to use for model loading and execution. This option accepts only openvino now, tensorflow backends will be added.
  • model โ€” set path to model file specifying network architecture and its parameters. Note that different backends use different file formats.
  • input โ€” set the input name of the dnn network.
  • output โ€” set the output name of the dnn network.
  • confidence โ€” set the confidence threshold (default: 0.5).
  • labels โ€” set path to label file specifying the mapping between label id and name. Each label name is written in one line, tailing spaces and empty lines are skipped. The first line is the name of label id 0 (usually it is 'background'), and the second line is the name of label id 1, etc. The label id is considered as name if the label file is not provided.
  • backend_configs โ€” set the configs to be passed into backend. To use async execution, set async (default: set). Roll back to sync execution if the backend does not support async.

dnn_processing ๐Ÿ’œ

Do image processing with deep neural networks. It works together with another filter which converts the pixel format of the Frame to what the dnn network requires.

The filter accepts the following options:

  • dnn_backend โ€” specify which DNN backend to use for model loading and execution. This option accepts the following values:
    • tensorflow โ€” TensorFlow backend. To enable this backend you need to install the TensorFlow for C library (see <https://www.tensorflow.org/install/lang_c>) and configure FFmpeg with --enable-libtensorflow
    • openvino โ€” OpenVINO backend. To enable this backend you need to build and install the OpenVINO for C library (see <https://github.com/openvinotoolkit/openvino/blob/master/build-instruction.md>) and configure FFmpeg with --enable-libopenvino (--extra-cflags=-I... --extra-ldflags=-L... might be needed if the header files and libraries are not installed into system path)
    • torch โ€” Libtorch backend. To enable this backend you need to build and install Libtroch for C++ library. Please download cxx11 ABI version (see <https://pytorch.org/get-started/locally>) and configure FFmpeg with:
--enable-libtorch --extra-cflags=-I/libtorch_root/libtorch/include --extra-cflags=-I/libtorch_root/libtorch/include/torch/csrc/api/include --extra-ldflags=-L/libtorch_root/libtorch/lib/
  • model โ€” set path to model file specifying network architecture and its parameters. Note that different backends use different file formats. TensorFlow, OpenVINO and Libtorch backend can load files for only its format.
  • input โ€” set the input name of the dnn network.
  • output โ€” set the output name of the dnn network.
  • backend_configs โ€” set the configs to be passed into backend. To use async execution, set async (default: set). Roll back to sync execution if the backend does not support async.

For tensorflow backend, you can set its configs with sess_config options, please use tools/python/tf_sess_config.py to get the configs of TensorFlow backend for your system.

Examples ๐ŸŒŸ

  • Remove rain in rgb24 frame with can.pb (see derain filter):
./ffmpeg -i rain.jpg -vf format=rgb24,dnn_processing=dnn_backend=tensorflow:model=can.pb:input=x:output=y derain.jpg
  • Handle the Y channel with srcnn.pb (see sr filter) for frame with yuv420p (planar YUV formats supported):
./ffmpeg -i 480p.jpg -vf format=yuv420p,scale=w=iw*2:h=ih*2,dnn_processing=dnn_backend=tensorflow:model=srcnn.pb:input=x:output=y -y srcnn.jpg
  • Handle the Y channel with espcn.pb (see sr filter), which changes frame size, for format yuv420p (planar YUV formats supported), please use tools/python/tf_sess_config.py to get the configs of TensorFlow backend for your system.
./ffmpeg -i 480p.jpg -vf format=yuv420p,dnn_processing=dnn_backend=tensorflow:model=espcn.pb:input=x:output=y:backend_configs=sess_config=0x10022805320e09cdccccccccccec3f20012a01303801 -y tmp.espcn.jpg

๐ŸŽจ drawbox

Okay bestie, this one literally draws a colored box on top of your input image. Like a highlighter but for video. Iconic.

It accepts the following parameters:

  • x, y โ€” the expressions that specify the top left corner coordinates of the box. Defaults to 0. ๐Ÿซถ
  • width, w / height, h โ€” the expressions that specify the width and height of the box; if 0 they're interpreted as the input width and height. Defaults to 0.
  • color, c โ€” specify the color of the box to write. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual. If the special value invert is used, the box edge color is the same as the video with inverted luma. ๐Ÿฆ‹
  • thickness, t โ€” the expression that sets the thickness of the box edge. A value of fill will create a filled box. Default value is 3. See below for the list of accepted constants.
  • replace โ€” applicable if the input has alpha. With value 1, the pixels of the painted box will overwrite the video's color and alpha pixels. Default is 0, which composites the box onto the input, leaving the video's alpha intact.

The parameters for x, y, w and h and t are expressions containing the following constants:

  • dar โ€” the input display aspect ratio, it is the same as (w / h) * sar.
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example for the pixel format yuv422p hsub is 2 and vsub is 1.
  • in_h, ih / in_w, iw โ€” the input width and height.
  • sar โ€” the input sample aspect ratio.
  • x, y โ€” the x and y offset coordinates where the box is drawn.
  • w, h โ€” the width and height of the drawn box.
  • box_source โ€” box source can be set as side_data_detection_bboxes if you want to use box data in detection bboxes of side data.

If box_source is set, the x, y, width and height will be ignored and still use box data in detection bboxes of side data. So please do not use this parameter if you were not sure about the box source. ๐Ÿ™ˆ

  • t โ€” the thickness of the drawn box.

These constants allow the x, y, w, h and t expressions to refer to each other, so you may for example specify y=x/dar or h=w/dar. Mutual reference slay โœจ

Examples

  • Draw a black box around the edge of the input image:
drawbox
  • Draw a box with color red and an opacity of 50%:
drawbox=10:20:200:60:red@0.5

The previous example can be specified as:

drawbox=x=10:y=20:w=200:h=60:color=red@0.5
  • Fill the box with pink color:
drawbox=x=10:y=10:w=100:h=100:color=pink@0.5:t=fill
  • Draw a 2-pixel red 2.40:1 mask:
drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red

Commands

This filter supports same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value. (No crashing, no drama, okay? ๐Ÿ’…)


๐Ÿ“ˆ drawgraph

Draws a graph using input video metadata. It's giving "data visualization but make it a filter". Obsessed.

It accepts the following parameters:

  • m1 โ€” set 1st frame metadata key from which metadata values will be used to draw a graph.
  • fg1 โ€” set 1st foreground color expression.
  • m2 โ€” set 2nd frame metadata key from which metadata values will be used to draw a graph.
  • fg2 โ€” set 2nd foreground color expression.
  • m3 โ€” set 3rd frame metadata key from which metadata values will be used to draw a graph.
  • fg3 โ€” set 3rd foreground color expression.
  • m4 โ€” set 4th frame metadata key from which metadata values will be used to draw a graph.
  • fg4 โ€” set 4th foreground color expression.
  • min โ€” set minimal value of metadata value.
  • max โ€” set maximal value of metadata value.
  • bg โ€” set graph background color. Default is white. ๐Ÿค
  • mode โ€” set graph mode. Available values for mode is:
    • bar
    • dot
    • line

Default is line.

  • slide โ€” set slide mode. Available values for slide is:
    • frame โ€” draw new frame when right border is reached.
    • replace โ€” replace old columns with new ones.
    • scroll โ€” scroll from right to left.
    • rscroll โ€” scroll from left to right.
    • picture โ€” draw single picture.

Default is frame.

  • size โ€” set size of graph video. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. The default value is 900x256.
  • rate, r โ€” set the output frame rate. Default value is 25.

The foreground color expressions can use the following variables:

  • MIN โ€” minimal value of metadata value.
  • MAX โ€” maximal value of metadata value.
  • VAL โ€” current metadata key value.

The color is defined as 0xAABBGGRR.

Example using metadata from signalstats filter:

signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255

Example using metadata from ebur128 filter:

ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-120:max=5

๐Ÿ”ฒ drawgrid

Draws a grid on the input image. Grid layout era ๐ŸŽ€

It accepts the following parameters:

  • x, y โ€” the expressions that specify the coordinates of some point of grid intersection (meant to configure offset). Both default to 0.
  • width, w / height, h โ€” the expressions that specify the width and height of the grid cell, if 0 they're interpreted as the input width and height, respectively, minus thickness, so image gets framed. Default to 0.
  • color, c โ€” specify the color of the grid. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual. If the special value invert is used, the grid color is the same as the video with inverted luma.
  • thickness, t โ€” the expression that sets the thickness of the grid line. Default value is 1. See below for the list of accepted constants.
  • replace โ€” applicable if the input has alpha. With 1 the pixels of the painted grid will overwrite the video's color and alpha pixels. Default is 0, which composites the grid onto the input, leaving the video's alpha intact.

The parameters for x, y, w and h and t are expressions containing the following constants:

  • dar โ€” the input display aspect ratio, it is the same as (w / h) * sar.
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example for the pixel format yuv422p hsub is 2 and vsub is 1.
  • in_h, ih / in_w, iw โ€” the input grid cell width and height.
  • sar โ€” the input sample aspect ratio.
  • x, y โ€” the x and y coordinates of some point of grid intersection (meant to configure offset).
  • w, h โ€” the width and height of the drawn cell.
  • t โ€” the thickness of the drawn cell.

These constants allow the x, y, w, h and t expressions to refer to each other, so you may for example specify y=x/dar or h=w/dar. Same mutual-referencing bestie energy as drawbox ๐Ÿ’–

Examples

  • Draw a grid with cell 100x100 pixels, thickness 2 pixels, with color red and an opacity of 50%:
drawgrid=width=100:height=100:thickness=2:color=red@0.5
  • Draw a white 3x3 grid with an opacity of 50%:
drawgrid=w=iw/3:h=ih/3:t=2:c=white@0.5

Commands

This filter supports same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value.


โœ๏ธ drawtext

Draw a text string, or text from a specified file, on top of a video, using the libfreetype library. Literally the main character of text overlays. ๐Ÿ‘‘

To enable compilation of this filter, you need to configure FFmpeg with --enable-libfreetype and --enable-libharfbuzz. To enable default font fallback and the font option you need to configure FFmpeg with --enable-libfontconfig. To enable the text_shaping option, you need to configure FFmpeg with --enable-libfribidi.

Heads up: those are compile-time configure flags, bestie. If they weren't baked in, the filter isn't there. No cap.

Syntax

It accepts the following parameters:

  • box โ€” used to draw a box around text using the background color. The value must be either 1 (enable) or 0 (disable). The default value of box is 0.
  • boxborderw โ€” set the width of the border to be drawn around the box using boxcolor. The value must be specified using one of the following formats:
    • boxborderw=10 โ€” set the width of all the borders to 10
    • boxborderw=10|20 โ€” set the width of the top and bottom borders to 10 and the width of the left and right borders to 20
    • boxborderw=10|20|30 โ€” set the width of the top border to 10, the width of the bottom border to 30 and the width of the left and right borders to 20
    • boxborderw=10|20|30|40 โ€” set the borders width to 10 (top), 20 (right), 30 (bottom), 40 (left)

The default value of boxborderw is 0.

  • boxcolor โ€” the color to be used for drawing box around text. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual. The default value of boxcolor is white.
  • line_spacing โ€” set the line spacing in pixels. The default value of line_spacing is 0.
  • text_align โ€” set the vertical and horizontal alignment of the text with respect to the box boundaries. The value is combination of flags, one for the vertical alignment (T=top, M=middle, B=bottom) and one for the horizontal alignment (L=left, C=center, R=right). Please note that tab characters are only supported with the left horizontal alignment. (Yeah, tabs are picky like that ๐Ÿ˜ญ)
  • y_align โ€” specify what the y value is referred to. Possible values are:
    • text โ€” the top of the highest glyph of the first text line is placed at y
    • baseline โ€” the baseline of the first text line is placed at y
    • font โ€” the baseline of the first text line is placed at y plus the ascent (in pixels) defined in the font metrics

The default value of y_align is text for backward compatibility.

  • borderw โ€” set the width of the border to be drawn around the text using bordercolor. The default value of borderw is 0.
  • bordercolor โ€” set the color to be used for drawing border around text. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual. The default value of bordercolor is black.
  • expansion โ€” select how the text is expanded. Can be either none, strftime (deprecated) or normal (default). See the drawtext_expansion, Text expansion section below for details.
  • basetime โ€” set a start time for the count. Value is in microseconds. Only applied in the deprecated strftime expansion mode. To emulate in normal expansion mode use the pts function, supplying the start time (in seconds) as the second argument.
Ngl, strftime is deprecated-deprecated. If you're reaching for basetime, maybe consider the pts function route instead โ€” that's straight from the manual, not me being creative ๐Ÿ’€
  • fix_bounds โ€” bestie, when this one's true it checks your text coords and nudges them so your text doesn't get clipped off the edge. Very protective, very demure ๐Ÿ’…
  • fontcolor โ€” the color used for drawing the font, periodt. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual.

The default value of fontcolor is black.

  • fontcolor_expr โ€” a string that gets expanded the same way as text to get a dynamic fontcolor value. By default this option is empty and just vibes, unprocessed. When you set it, it overrides the fontcolor option. Main character energy fr fr โœจ
  • font โ€” the font family used for drawing text. By default Sans. Iconic, classic, never misses.
  • fontfile โ€” the font file used for drawing text. The path must be included, no shortcuts. This parameter is mandatory if the fontconfig support is disabled. Not optional, ngl ๐Ÿ™ˆ
  • alpha โ€” draw the text applying alpha blending. The value can be a number between 0.0 and 1.0. The expression accepts the same variables x, y as well. The default value is 1. Please see fontcolor_expr. She's transparent, she's layered, she contains multitudes ๐Ÿ’–
  • fontsize โ€” the font size used for drawing text. The default value of fontsize is 16.
  • text_shaping โ€” if set to 1, attempt to shape the text (for example, reverse the order of right-to-left text and join Arabic characters) before drawing it. Otherwise, just draw the text exactly as given. By default 1 (if supported). Globalize that text, queen ๐ŸŒˆ
  • ft_load_flags โ€” the flags used for loading the fonts.

The flags map the corresponding flags supported by libfreetype, and are a combination of the following values:

  • default
  • no_scale
  • no_hinting
  • render
  • no_bitmap
  • vertical_layout
  • force_autohint
  • crop_bitmap
  • pedantic
  • ignore_global_advance_width
  • no_recurse
  • ignore_transform
  • monochrome
  • linear_design
  • no_autohint

Default value is default.

For more information consult the documentation for the FT_LOAD_* libfreetype flags. Like, go read the source, iykyk ๐Ÿซถ

  • shadowcolor โ€” the color used for drawing a shadow behind the drawn text. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual.

The default value of shadowcolor is black. Spooky little silhouette ๐Ÿ’€

  • boxw โ€” set the width of the box to be drawn around text. The default value of boxw is computed automatically to match the text width. She fits, she's tailored ๐ŸŽ€
  • boxh โ€” set the height of the box to be drawn around text. The default value of boxh is computed automatically to match the text height.
  • shadowx, shadowy โ€” the x and y offsets for the text shadow position with respect to the position of the text. They can be either positive or negative values. The default value for both is 0.
  • start_number โ€” the starting frame number for the n/frame_num variable. The default value is 0.
  • tabsize โ€” the size in number of spaces to use for rendering the tab. Default value is 4.
  • timecode โ€” set the initial timecode representation in hh:mm:ss[:;.]ff format. It can be used with or without text parameter. timecode_rate option must be specified. Clock is ticking bestie โฐ
  • timecode_rate, rate, r โ€” set the timecode frame rate (timecode only). Value will be rounded to nearest integer. Minimum value is 1. Drop-frame timecode is supported for frame rates 30 & 60. Only those two, don't try it ๐Ÿ’…
  • tc24hmax โ€” if set to 1, the output of the timecode option will wrap around at 24 hours. Default is 0 (disabled). Midnight reset, very Cinderella ๐Ÿ•›
  • text โ€” the text string to be drawn. The text must be a sequence of UTF-8 encoded characters. This parameter is mandatory if no file is specified with the parameter textfile.
  • textfile โ€” a text file containing text to be drawn. The text must be a sequence of UTF-8 encoded characters.

This parameter is mandatory if no text string is specified with the parameter text.

If both text and textfile are specified, an error is thrown. Pick a lane, bestie ๐Ÿ˜ญ

  • text_source โ€” text source should be set as side_data_detection_bboxes if you want to use text data in detection bboxes of side data.

If text source is set, text and textfile will be ignored and still use text data in detection bboxes of side data. So please do not use this parameter if you are not sure about the text source. Genuinely, heed the warning ๐Ÿ™

  • reload โ€” the textfile will be reloaded at specified frame interval. Be sure to update textfile atomically, or it may be read partially, or even fail. Range is 0 to INT_MAX. Default is 0. Atomic updates only, we don't do race conditions here ๐Ÿ’€
  • x, y โ€” the expressions which specify the offsets where text will be drawn within the video frame. They are relative to the top/left border of the output image.

The default value of x and y is 0.

See below for the list of accepted constants and functions.

The parameters for x and y are expressions containing the following constants and functions:

  • dar โ€” input display aspect ratio, it is the same as (w / h) * sar.
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example for the pixel format yuv422p hsub is 2 and vsub is 1.
  • line_h, lh โ€” the height of each text line.
  • main_h, h, H โ€” the input height.
  • main_w, w, W โ€” the input width.
  • max_glyph_a, ascent โ€” the maximum distance from the baseline to the highest/upper grid coordinate used to place a glyph outline point, for all the rendered glyphs. It is a positive value, due to the grid's orientation with the Y axis upwards.
  • max_glyph_d, descent โ€” the maximum distance from the baseline to the lowest grid coordinate used to place a glyph outline point, for all the rendered glyphs. This is a negative value, due to the grid's orientation, with the Y axis upwards.
  • max_glyph_h โ€” maximum glyph height, that is the maximum height for all the glyphs contained in the rendered text, it is equivalent to ascent - descent.
  • max_glyph_w โ€” maximum glyph width, that is the maximum width for all the glyphs contained in the rendered text.
  • font_a โ€” the ascent size defined in the font metrics.
  • font_d โ€” the descent size defined in the font metrics.
  • top_a โ€” the maximum ascender of the glyphs of the first text line.
  • bottom_d โ€” the maximum descender of the glyphs of the last text line.
  • n โ€” the number of input frame, starting from 0.
  • rand(min, max) โ€” return a random number included between min and max. Chaos, but make it bounded ๐ŸŽฒ
  • sar โ€” the input sample aspect ratio.
  • t โ€” timestamp expressed in seconds, NAN if the input timestamp is unknown.
  • text_h, th โ€” the height of the rendered text.
  • text_w, tw โ€” the width of the rendered text.
  • x, y โ€” the x and y offset coordinates where the text is drawn.

These parameters allow the x and y expressions to refer to each other, so you can for example specify y=x/dar. Mutual reference, they're literally each other's reference ๐Ÿ’ž

  • pict_type โ€” a one character description of the current frame's picture type.
  • pkt_pos โ€” the current packet's position in the input file or stream (in bytes, from the start of the input). A value of -1 indicates this info is not available.
  • duration โ€” the current packet's duration, in seconds.
  • pkt_size โ€” the current packet's size (in bytes).

๐Ÿฆ‹ Text expansion ๐Ÿฆ‹

If expansion is set to strftime, the filter recognizes sequences accepted by the strftime C function in the provided text and expands them accordingly. Check the documentation of strftime. This feature is deprecated in favor of normal expansion with the gmtime or localtime expansion functions. Old news, bestie, retired ๐ŸŒธ

If expansion is set to none, the text is printed verbatim. No thoughts, just text.

If expansion is set to normal (which is the default), the following expansion mechanism is used.

The backslash character \, followed by any character, always expands to the second character.

Sequences of the form %{...} are expanded. The text between the braces is a function name, possibly followed by arguments separated by ':'. If the arguments contain special characters or delimiters (':' or '}'), they should be escaped.

Note that they probably must also be escaped as the value for the text option in the filter argument string and as the filter argument in the filtergraph description, and possibly also for the shell, that makes up to four levels of escaping; using a text file with the textfile option avoids these problems. Four levels of escaping is genuinely unhinged, save yourself ๐Ÿ˜ญ

The following functions are available:

  • expr, e โ€” the expression evaluation result.

It must take one argument specifying the expression to be evaluated, which accepts the same constants and functions as the x and y values. Note that not all constants should be used, for example the text size is not known when evaluating the expression, so the constants text_w and text_h will have an undefined value. She's not ready yet, be patient ๐Ÿงš

  • expr_int_format, eif โ€” evaluate the expression's value and output as formatted integer.

The first argument is the expression to be evaluated, just as for the expr function. The second argument specifies the output format. Allowed values are x, X, d and u. They are treated exactly as in the printf function. The third parameter is optional and sets the number of positions taken by the output. It can be used to add padding with zeros from the left. Zero-padding slay โœจ

  • gmtime โ€” the time at which the filter is running, expressed in UTC. It can accept an argument: a strftime C function format string. The format string is extended to support the variable %[1-6]N which prints fractions of the second with optionally specified number of digits.
  • localtime โ€” the time at which the filter is running, expressed in the local time zone. It can accept an argument: a strftime C function format string. The format string is extended to support the variable %[1-6]N which prints fractions of the second with optionally specified number of digits. Same as gmtime but she's got a hometown ๐Ÿ’œ
  • metadata โ€” frame metadata. Takes one or two arguments.

The first argument is mandatory and specifies the metadata key.

The second argument is optional and specifies a default value, used when the metadata key is not found or empty.

Available metadata can be identified by inspecting entries starting with TAG included within each frame section printed by running ffprobe -show_frames.

String metadata generated in filters leading to the drawtext filter are also available.

  • n, frame_num โ€” the frame number, starting from 0.
  • pict_type โ€” a one character description of the current picture type.
  • pts โ€” the timestamp of the current frame. It can take up to three arguments.

Okay so real talk โ€” the first argument here is the format of the timestamp, and it defaults to "flt", which is seconds as a decimal number with microsecond accuracy. If you want "hms" instead, that's a formatted [-]HH:MM:SS.mmm timestamp with millisecond accuracy. And "gmtime" gives you the timestamp of the frame formatted as UTC time, while "localtime" gives you the timestamp of the frame formatted as local time zone time. Pick your fighter ๐Ÿ’…

The second argument is an offset that gets added to the timestamp.

If you set the format to "hms", you can slide in a third argument "24HH" to present the hour part of the formatted timestamp in 24h format (00-23). Iconic.

And if the format is "localtime" or "gmtime", a third argument may be supplied: a "strftime" C function format string. By default, YYYY-MM-DD HH:MM:SS format will be used. No cap ๐Ÿซถ

โœจ Commands โœจ

This filter supports altering parameters via commands:

  • reinit โ€” alter existing filter parameters.

The syntax for the argument is the same as for filter invocation, e.g.

fontsize=56:fontcolor=green:text='Hello World'

Full filter invocation with sendcmd would look like this:

sendcmd=c='56.0 drawtext reinit fontsize=56\:fontcolor=green\:text=Hello\\ World'

If the entire argument can't be parsed or applied as valid values then the filter will continue with its existing parameters. It's giving "we tried, we're still cute" ๐ŸŽ€

The following options are also supported as commands:

  • *<x>
  • *<y>
  • *<alpha>
  • *<fontsize>
  • *<fontcolor>
  • *<boxcolor>
  • *<bordercolor>
  • *<shadowcolor>
  • *<box>
  • *<boxw>
  • *<boxh>
  • *<boxborderw>
  • *<line_spacing>
  • *<text_align>
  • *<shadowx>
  • *<shadowy>
  • *<borderw>

๐ŸŒธ Examples ๐ŸŒธ

  • Draw "Test Text" with font FreeSerif, using the default values for the optional parameters.
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'"
  • Draw 'Test Text' with font FreeSerif of size 24 at position x=100 and y=50 (counting from the top-left corner of the screen), text is yellow with a red box around it. Both the text and the box have an opacity of 20%.
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text':\
          x=100: y=50: fontsize=24: fontcolor=yellow@0.2: box=1: boxcolor=red@0.2"

Note that the double quotes are not necessary if spaces are not used within the parameter list.

  • Show the text at the center of the video frame:
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"
  • Show the text at a random position, switching to a new position every 30 seconds:
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
  • Show a text line sliding from right to left in the last row of the video frame. The file LONG_LINE is assumed to contain a single line with no newlines.
drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
  • Show the content of file CREDITS off the bottom of the frame and scroll up.
drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t"
  • Draw a single green letter "g", at the center of the input video. The glyph baseline is placed at half screen height.
drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"
  • Show text for 1 second every 3 seconds:
drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t\,3)\,1):text='blink'"
  • Use fontconfig to set the font. Note that the colons need to be escaped.
drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'
  • Draw "Test Text" with font size dependent on height of the video.
drawtext="text='Test Text': fontsize=h/30: x=(w-text_w)/2: y=(h-text_h*2)"
  • Print the date of a real-time encoding (see documentation for the "strftime" C function):
drawtext='fontfile=FreeSans.ttf:text=%{localtime\:%a %b %d %Y}'
  • Show text fading in and out (appearing/disappearing):
#!/bin/sh
DS=1.0 # display start
DE=10.0 # display end
FID=1.5 # fade in duration
FOD=5 # fade out duration
ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 }"
  • Horizontally align multiple separate texts. Note that max_glyph_a and the fontsize value are included in the y offset.
drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a,
drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a
  • Plot special lavf.image2dec.source_basename metadata onto each frame if such metadata exists. Otherwise, plot the string "NA". Note that image2 demuxer must have option -export_path_metadata 1 for the special metadata fields to be available for filters.
drawtext="fontsize=20:fontcolor=white:fontfile=FreeSans.ttf:text='%{metadata\:lavf.image2dec.source_basename\:NA}':x=10:y=10"

For more information about libfreetype, check: http://www.freetype.org/.

For more information about fontconfig, check: http://freedesktop.org/software/fontconfig/fontconfig-user.html.

For more information about libfribidi, check: http://fribidi.org/.

For more information about libharfbuzz, check: https://github.com/harfbuzz/harfbuzz.


๐Ÿฆ‹ drawvg ๐Ÿฆ‹

Draw vector graphics on top of video frames, by executing a script written in a custom language called VGS (Vector Graphics Script). Bestie, it's a whole little language, and it's adorable.

The documentation for the language can be found in drawvg - Language Reference. A version of this reference with rendered examples can be found at the https://ayosec.github.io/ffmpeg-drawvg/playground/docs/langref.html.

Graphics are rendered using the https://cairographics.org/.

To enable compilation of this filter, you need to configure FFmpeg with --enable-cairo. No cairo, no graphics, them's the rules ๐ŸŽ€

Parameters

Either "script" or "file" must be set. Like, actually must. Pick one ๐Ÿ’…

  • s, script โ€” script source to draw the graphics.
  • file โ€” path of the file to load the script source.

๐ŸŒˆ Pixel Formats ๐ŸŒˆ

Since Cairo only supports RGB images, if the input video is something else (like YUV 4:2:0), before executing the script the video is converted to a format compatible with Cairo. Then, you have to use either the format filter, or the -pix_fmt option, to convert it to the expected format in the output. Don't skip that step, or the vibe check will fail ๐Ÿ˜ญ

โœจ Examples โœจ

  • Draw the outline of an ellipse.
ffmpeg -i input.webm \
    -vf 'drawvg=ellipse (w/2) (h/2) (w/3) (h/3) stroke' \
    -pix_fmt yuv420p \
    output.webm
  • Draw a square rotating in the middle of the frame.

The script for drawvg is in a file "draw.vgs":

translate (w/2) (h/2)
rotate t
rect -100 -100 200 200
setcolor red@0.5
fill

Then:

ffmpeg -i input.webm -vf 'drawvg=file=draw.vgs,format=yuv420p' output.webm

๐Ÿ’€ edgedetect ๐Ÿ’€

Detect and draw edges. The filter uses the Canny Edge Detection algorithm. It literally finds the edges of things and she's so good at it โœจ

The filter accepts the following options:

  • low, high โ€” set low and high threshold values used by the Canny thresholding algorithm.

The high threshold selects the "strong" edge pixels, which are then connected through 8-connectivity with the "weak" edge pixels selected by the low threshold.

low and high threshold values must be chosen in the range [0,1], and low should be lesser or equal to high. Keep that order, bestie, don't be chaotic ๐Ÿ™ˆ

Default value for low is "20/255", and default value for high is "50/255".

  • mode โ€” define the drawing mode.
    • wires โ€” draw white/gray wires on black background.
    • colormix โ€” mix the colors to create a paint/cartoon effect.
    • canny โ€” apply Canny edge detector on all selected planes.

Default value is wires.

  • planes โ€” select planes for filtering. By default all available planes are filtered.

๐ŸŒธ Examples ๐ŸŒธ

  • Standard edge detection with custom values for the hysteresis thresholding:
edgedetect=low=0.1:high=0.4
  • Painting effect without thresholding:
edgedetect=mode=colormix:high=0

๐Ÿ‘‘ elbg ๐Ÿ‘‘

Apply a posterize effect using the ELBG (Enhanced LBG) algorithm.

For each input image, the filter will compute the optimal mapping from the input to the output given the codebook length, that is the number of distinct output colors. So cute, so palette-y ๐ŸŽจ

This filter accepts the following options.

  • codebook_length, l โ€” set codebook length. The value must be a positive integer, and represents the number of distinct output colors. Default value is 256.
  • nb_steps, n โ€” set the maximum number of iterations to apply for computing the optimal mapping. The higher the value the better the result and the higher the computation time. Default value is 1. Lowkey a tradeoff, highkey worth it.
  • seed, s โ€” set a random seed, must be an integer included between 0 and UINT32_MAX. If not specified, or if explicitly set to -1, the filter will try to use a good random seed on a best effort basis.
  • pal8 โ€” set pal8 output pixel format. This option does not work with codebook length greater than 256. Default is disabled.
  • use_alpha โ€” include alpha values in the quantization calculation. Allows creating palettized output images (e.g. PNG8) with multiple alpha smooth blending. Translucent slay ๐Ÿซถ

๐ŸŽ€ entropy ๐ŸŽ€

Measure graylevel entropy in histogram of color channels of video frames.

It accepts the following parameters:

  • mode โ€” can be either normal or diff. Default is normal.

diff mode measures entropy of histogram delta values, absolute differences between neighbour histogram values.


โญ epx โญ

Apply the EPX magnification filter which is designed for pixel art. Pixel artists stay winning, no cap ๐Ÿ’…

It accepts the following option:

  • n โ€” set the scaling dimension: 2 for "2xEPX", 3 for "3xEPX". Default is 3.

๐Ÿ“ eq ๐Ÿ“

Set brightness, contrast, saturation and approximate gamma adjustment. The glow-up filter, fr fr โœจ

The filter accepts the following options:

  • contrast โ€” set the contrast expression. The value must be a float value in range -1000.0 to 1000.0. The default value is "1".
  • brightness โ€” set the brightness expression. The value must be a float value in range -1.0 to 1.0. The default value is "0".
  • saturation โ€” sets the saturation expression, bestie ๐Ÿ’… the value has to be a float in range 0.0 to 3.0, and the default is "1".
  • gamma โ€” sets the gamma expression, float in range 0.1 to 10.0, default "1".
  • gamma_r โ€” gamma expression for red specifically ๐ŸŒน float in range 0.1 to 10.0, default "1".
  • gamma_g โ€” gamma expression for green ๐Ÿ float in range 0.1 to 10.0, default "1".
  • gamma_b โ€” gamma expression for blue ๐Ÿซ float in range 0.1 to 10.0, default "1".
  • gamma_weight โ€” sets the gamma weight expression, and this one's kinda iconic ngl โœจ it reduces the effect of a high gamma value on bright image areas, like keeping them from getting overamplified and just plain white. Value must be a float in range 0.0 to 1.0. At 0.0 the gamma correction is turned all the way down, at 1.0 it's left at full strength. Default is "1".
  • eval โ€” tells the filter when to evaluate the expressions for brightness, contrast, saturation and gamma. It takes these values:
    • init โ€” only evaluate expressions once, during filter initialization or when a command is processed.
    • frame โ€” evaluate expressions for every single incoming frame.

Default value is init.

The expressions accept these parameters:

  • n โ€” frame count of the input frame, starting from 0.
  • pos โ€” byte position of the corresponding packet in the input file, NAN if unspecified. deprecated, do not use ๐Ÿšฉ
  • r โ€” frame rate of the input video, NAN if the input frame rate is unknown.
  • t โ€” timestamp expressed in seconds, NAN if the input timestamp is unknown.

๐Ÿ’ฌ Commands

The filter supports these commands, so you can hot-swap values at runtime, no cap:

  • contrast โ€” set the contrast expression.
  • brightness โ€” set the brightness expression.
  • saturation โ€” set the saturation expression.
  • gamma โ€” set the gamma expression.
  • gamma_r โ€” set the gamma_r expression.
  • gamma_g โ€” set the gamma_g expression.
  • gamma_b โ€” set the gamma_b expression.
  • gamma_weight โ€” set the gamma_weight expression.

The command accepts the same syntax as the corresponding option ๐Ÿซถ

If the specified expression is not valid, it's kept at its current value. No crash, no drama ๐Ÿ’…

๐ŸŒธ erosion

Applies an erosion effect to the video. This filter replaces the pixel with the local 3x3 minimum โ€” that's the whole vibe, it eats away at bright stuff ๐Ÿ“

It accepts the following options:

  • threshold0, threshold1, threshold2, threshold3 โ€” limit the maximum change for each plane, default is 65535. If 0, that plane stays unchanged.
  • coordinates โ€” flag specifying which pixels to refer to. Default is 255, i.e. all eight pixels are used ๐ŸŒˆ

The flags map onto local 3x3 coordinates like this:

    1 2 3
    4   5
    6 7 8

๐Ÿ’ฌ Commands

This filter supports all of the above options as commands โœจ


๐Ÿฆ‹ estdif

Deinterlaces the input video โ€” "estdif" stands for "Edge Slope Tracing Deinterlacing Filter", and yes it's a whole acronym moment ๐Ÿ‘‘

Spatial-only filter that uses an edge slope tracing algorithm to interpolate missing lines. It accepts the following parameters:

  • mode โ€” the interlacing mode to adopt. Takes one of these:
    • frame โ€” output one frame for each frame.
    • field โ€” output one frame for each field.

Default value is "field".

  • parity โ€” the picture field parity assumed for the input interlaced video. Takes one of these:
    • tff โ€” assume the top field is first.
    • bff โ€” assume the bottom field is first.
    • auto โ€” enable automatic detection of field parity.

Default value is "auto". If the interlacing is unknown, or the decoder doesn't export this information, top field first will be assumed ๐Ÿ‘€

  • deint โ€” which frames to deinterlace. Takes one of these:
    • all โ€” deinterlace all frames.
    • interlaced โ€” only deinterlace frames marked as interlaced.

Default value is "all".

  • rslope โ€” search radius for edge slope tracing. Default value is 1. Allowed range is 1 to 15.
  • redge โ€” search radius for best edge matching. Default value is 2. Allowed range is 0 to 15.
  • ecost โ€” edge cost for edge matching. Default value is 2. Allowed range is 0 to 50.
  • mcost โ€” middle cost for edge matching. Default value is 1. Allowed range is 0 to 50.
  • dcost โ€” distance cost for edge matching. Default value is 1. Allowed range is 0 to 50.
  • interp โ€” the interpolation used. Default is 4-point interpolation. Takes one of these:
    • 2p โ€” two-point interpolation.
    • 4p โ€” four-point interpolation.
    • 6p โ€” six-point interpolation.

๐Ÿ’ฌ Commands

This filter supports the same commands as options ๐Ÿซถ


โญ exposure

Adjusts the exposure of the video stream, literally just vibes calibration ๐ŸŒž

The filter accepts the following options:

  • exposure โ€” set the exposure correction in EV. Allowed range is from -3.0 to 3.0 EV. Default value is 0 EV.
  • black โ€” set the black level correction. Allowed range is from -1.0 to 1.0. Default value is 0.

๐Ÿ’ฌ Commands

This filter supports the same commands as options โœจ


๐ŸŽ€ extractplanes

Extracts color channel components from the input video stream into separate grayscale video streams โ€” one stream per plane, so organized ๐Ÿ’…

The filter accepts the following option:

  • planes โ€” set the plane(s) to extract.

Available values for planes are:

  • y
  • u
  • v
  • a
  • r
  • g
  • b
Choosing planes that aren't available in the input will result in an error. That means you cannot select "r", "g", "b" planes with "y", "u", "v" planes at the same time โ€” pick a lane bestie ๐Ÿ˜ญ

๐ŸŒˆ Examples

  • Extract luma, u and v color channel components from the input video frame into 3 grayscale outputs:
ffmpeg -i video.avi -filter_complex 'extractplanes=y+u+v[y][u][v]' -map '[y]' y.avi -map '[u]' u.avi -map '[v]' v.avi

๐Ÿงš fade

Applies a fade-in/fade-out effect to the input video โ€” the classic โœจ

It accepts the following parameters:

  • type, t โ€” the effect type, either "in" for a fade-in or "out" for a fade-out. Default is "in".
  • start_frame, s โ€” the number of the frame to start applying the fade effect at. Default is 0.
  • nb_frames, n โ€” the number of frames the fade effect lasts. At the end of the fade-in effect, the output video will have the same intensity as the input video. At the end of the fade-out transition, the output video will be filled with the selected color. Default is 25.
  • alpha โ€” if set to 1, fade only the alpha channel, if one exists on the input. Default value is 0.
  • start_time, st โ€” the timestamp (in seconds) of the frame to start applying the fade effect. If both start_frame and start_time are specified, the fade will start at whichever comes last. Default is 0.
  • duration, d โ€” the number of seconds the fade effect has to last. At the end of the fade-in effect the output video will have the same intensity as the input video; at the end of the fade-out transition the output video will be filled with the selected color. If both duration and nb_frames are specified, duration is used. Default is 0 (nb_frames is used by default).
  • color, c โ€” the color of the fade. Default is "black".

๐Ÿ“ Examples

  • Fade in the first 30 frames of video:
fade=in:0:30

The command above is equivalent to:

fade=t=in:s=0:n=30
  • Fade out the last 45 frames of a 200-frame video:
fade=out:155:45
fade=type=out:start_frame=155:nb_frames=45
  • Fade in the first 25 frames and fade out the last 25 frames of a 1000-frame video:
fade=in:0:25, fade=out:975:25
  • Make the first 5 frames yellow, then fade in from frame 5-24:
fade=in:5:20:color=yellow
  • Fade in alpha over first 25 frames of video:
fade=in:0:25:alpha=1
  • Make the first 5.5 seconds black, then fade in for 0.5 seconds:
fade=t=in:st=5.5:d=0.5

๐Ÿ” feedback

Applies the feedback video filter โ€” this one's got main character energy because it has two outputs and two inputs ๐Ÿ‘‘

This filter passes cropped input frames to the 2nd output. From there it can be filtered with other video filters. After the filter receives a frame from the 2nd input, that frame is combined on top of the original frame from the 1st input and passed to the 1st output.

Typical usage is filtering only part of a frame โ€” chef's kiss for that ๐Ÿซถ

The filter accepts the following options:

  • x, y โ€” set the top-left crop position.
  • w, h โ€” set the crop size.

๐ŸŒธ Examples

  • Blur only the top-left rectangular part of a video frame of size 100x100 with the gblur filter:
[in][blurin]feedback=x=0:y=0:w=100:h=100[out][blurout];[blurout]gblur=8[blurin]
  • Draw a black box on the top-left part of a video frame of size 100x100 with the drawbox filter:
[in][blurin]feedback=x=0:y=0:w=100:h=100[out][blurout];[blurout]drawbox=x=0:y=0:w=100:h=100:t=100[blurin]
  • Pixelize a rectangular part of a video frame of size 100x100 with the pixelize filter:
[in][blurin]feedback=x=320:y=240:w=100:h=100[out][blurout];[blurout]pixelize[blurin]

๐Ÿ’œ fftdnoiz

Denoises frames using 3D FFT (frequency domain filtering) โ€” big brain math filter ๐Ÿง โœจ

The filter accepts the following options:

  • sigma โ€” set the noise sigma constant. This sets the denoising strength. Default value is 1. Allowed range is from 0 to 30. Using very high sigma with low overlap may give blocking artifacts ๐Ÿ’€
  • amount โ€” set the amount of denoising. By default all detected noise is reduced. Default value is 1. Allowed range is from 0 to 1.
  • block โ€” set the size of the block in pixels. Default is 32, can be 8 to 256.
  • overlap โ€” set the block overlap. Default is 0.5. Allowed range is from 0.2 to 0.8.
  • method โ€” set the denoising method. Default is "wiener", can also be "hard".
  • prev โ€” set the number of previous frames to use for denoising. By default it's set to 0.
  • next โ€” set the number of next frames to use for denoising. By default it's set to 0.
  • planes โ€” set which planes will be filtered. By default, all available planes are filtered except alpha.

๐ŸŒˆ fftfilt

Apply arbitrary expressions to samples in frequency domain โœจ

  • dc_Y โ€” tweaks the dc value (aka the gain) of the luma plane of the image ๐ŸŽš๏ธ. Takes an integer in the range 0 to 1000. Default is 0, no cap.
  • dc_U โ€” same deal but for the 1st chroma plane ๐Ÿ’œ. Integer in range 0 to 1000, default 0.
  • dc_V โ€” and this one's for the 2nd chroma plane ๐Ÿฉท. Integer in range 0 to 1000, default 0.
  • weight_Y โ€” sets the frequency domain weight expression for the luma plane โœจ.
  • weight_U โ€” sets the frequency domain weight expression for the 1st chroma plane.
  • weight_V โ€” sets the frequency domain weight expression for the 2nd chroma plane.
  • eval โ€” decides when the expressions get evaluated โฐ. It takes these values:
    • init โ€” evaluate expressions only once, during the filter initialization.
    • frame โ€” evaluate expressions for each incoming frame.

Default value is init.

The filter also accepts the following variables ๐Ÿซถ:

  • X, Y โ€” the coordinates of the current sample.
  • W, H โ€” the width and height of the image.
  • N โ€” the number of the input frame, starting from 0.
  • WS, HS โ€” the size of the FFT array for horizontal and vertical processing.

๐ŸŒˆ Examples

  • High-pass:
fftfilt=dc_Y=128:weight_Y='squish(1-(Y+X)/100)'
  • Low-pass:
fftfilt=dc_Y=0:weight_Y='squish((Y+X)/100-1)'
  • Sharpen:
fftfilt=dc_Y=0:weight_Y='1+squish(1-(Y+X)/100)'
  • Blur:
fftfilt=dc_Y=0:weight_Y='exp(-4 * ((Y+X)/(W+H)))'

๐Ÿƒ field

Extracts a single field out of an interlaced image, using stride arithmetic so it doesn't waste CPU time ๐Ÿ”ฅ. The output frames get marked as non-interlaced, capisce?

The filter accepts these options:

  • type โ€” says whether to pull the top field (if the value is 0 or "top") or the bottom field (if the value is 1 or "bottom") ๐Ÿ™ˆ.

๐Ÿงš fieldhint

Builds new frames by copying the top and bottom fields from surrounding frames โ€” and which frames those are comes straight out of a hint file, as numbers ๐Ÿ’ซ.

  • hint โ€” sets the file containing the hints: absolute/relative frame numbers.

There's gotta be one line for each frame in the clip, no exceptions bestie. Each line must contain two numbers separated by a comma, optionally followed by "-" or "+". The numbers on each line can't be out of [N-1,N+1] where N is the current frame number for "absolute" mode โ€” or out of the [-1, 1] range for "relative" mode. First number tells it which frame to pick up the top field from, second number tells it which frame to pick up the bottom field from ๐Ÿ‘‘.

If it's optionally followed by "+" the output frame gets marked as interlaced; else if followed by "-" the output frame gets marked as progressive; else it gets marked the same as the input frame. If it's optionally followed by "t" the output frame uses only the top field, or in the case of "b" it uses only the bottom field. And if a line starts with "#" or ";" that line is skipped, periodt.

  • mode โ€” can be the item "absolute" or "relative" or "pattern". Default is "absolute". The "pattern" mode is the same as "relative" mode, except at the last entry of the file โ€” if there are more frames to process than the "hint" file has, it seeks back to the start ๐Ÿ”.

Example of the first several lines of a "hint" file for "relative" mode:

0,0 - # first frame
1,0 - # second frame, use third's frame top field and second's frame bottom field
1,0 - # third frame, use fourth's frame top field and third's frame bottom field
1,0 -
0,0 -
0,0 -
1,0 -
1,0 -
1,0 -
0,0 -
0,0 -
1,0 -
1,0 -
1,0 -
0,0 -

๐ŸŽฌ fieldmatch

Field matching filter for inverse telecine ๐Ÿซก. It's meant to reconstruct the progressive frames from a telecined stream. Important thing though: the filter does not drop duplicated frames, so to get a complete inverse telecine, fieldmatch needs to be followed by a decimation filter such as decimate in the filtergraph โ€” it's a two-step situation, not a solo act.

Why split the field matching and the decimation like that? Notably because you might want to slip a de-interlacing filter fallback in between the two ๐Ÿ‘€. If the source has mixed telecined and real interlaced content, fieldmatch won't be able to match fields for the interlaced parts. But those leftover combed frames will be marked as interlaced, and so they can be de-interlaced by a later filter such as yadif before decimation. Chef's kiss.

On top of the various configuration options, fieldmatch can take an optional second stream, activated through the ppsrc option ๐Ÿ’…. If enabled, the frame reconstruction will be based on the fields and frames from this second stream. That lets the first input be pre-processed to help the filter's various algorithms, while keeping the output lossless (assuming the fields are matched properly, iykyk). Typically a field-aware denoiser, or brightness/contrast adjustments, can help.

Heads up: this filter uses the same algorithms as TIVTC/TFM (AviSynth project) and VIVTC/VFM (VapourSynth project). The latter is a light clone of TFM, which is what fieldmatch is based on. While the semantics and usage are very close, some behaviour and option names can differ ๐Ÿซ .

The decimate filter currently only works for constant frame rate input. If your input has mixed telecined (30fps) and progressive content with a lower framerate like 24fps, use the following filterchain to produce the necessary cfr stream: dejudder,fps=30000/1001,fieldmatch,decimate โญ.

The filter accepts the following options:

  • order โ€” specifies the assumed field order of the input stream. Available values are:
    • auto โ€” auto detect parity (use FFmpeg's internal parity value).
    • bff โ€” assume bottom field first.
    • tff โ€” assume top field first.

Note that it's sometimes recommended not to trust the parity announced by the stream ๐Ÿ™ˆ. Default value is auto.

  • mode โ€” sets the matching mode or strategy to use. pc mode is the safest in the sense that it won't risk creating jerkiness due to duplicate frames when possible โ€” but if there are bad edits or blended fields, it'll end up outputting combed frames when a good match might actually exist. On the other hand, pcn_ub mode is the most risky in terms of creating jerkiness, but will almost always find a good frame if there is one ๐ŸŽฏ. The other values are all somewhere in between pc and pcn_ub in terms of risking jerkiness and creating duplicate frames versus finding good matches in sections with bad edits, orphaned fields, blended fields, etc.

More details about p/c/n/u/b are available in the p/c/n/u/b meaning section.

Available values are:

  • pc โ€” 2-way matching (p/c)
  • pc_n โ€” 2-way matching, and trying 3rd match if still combed (p/c + n)
  • pc_u โ€” 2-way matching, and trying a 3rd match (same order) if still combed (p/c + u)
  • pc_n_ub โ€” 2-way matching, trying 3rd match if still combed, and trying 4th/5th matches if still combed (p/c + n + u/b)
  • pcn โ€” 3-way matching (p/c/n)
  • pcn_ub โ€” 3-way matching, and trying 4th/5th matches if all 3 of the original matches are detected as combed (p/c/n + u/b)

The parenthesis at the end indicate the matches that would be used for that mode assuming order=tff (and field on auto or top).

In terms of speed, pc mode is by far the fastest and pcn_ub is the slowest ๐ŸŒ.

Default value is pc_n.

  • ppsrc โ€” marks the main input stream as a pre-processed input, and enables the secondary input stream as the clean source to pick the fields from. See the filter introduction for more details. It's similar to the clip2 feature from VFM/TFM.

Default value is 0 (disabled).

  • field โ€” sets the field to match from. It's recommended to set this to the same value as order, unless you're experiencing matching failures with that setting. In certain circumstances, changing the field that's used to match from can have a huge impact on matching performance ๐Ÿ˜ฎ. Available values are:
    • auto โ€” automatic (same value as order).
    • bottom โ€” match from the bottom field.
    • top โ€” match from the top field.

Default value is auto.

  • mchroma โ€” sets whether or not chroma is included during the match comparisons. In most cases it's recommended to leave this enabled. You should set this to 0 only if your clip has bad chroma problems such as heavy rainbowing or other artifacts ๐ŸŒˆ. Setting it to 0 could also be used to speed things up at the cost of some accuracy.

Default value is 1.

  • y0, y1 โ€” these define an exclusion band which excludes the lines between y0 and y1 from being included in the field matching decision. An exclusion band can be used to ignore subtitles, a logo, or other things that might interfere with the matching ๐Ÿ™…. y0 sets the starting scan line and y1 sets the ending line; all lines in between y0 and y1 (including y0 and y1) get ignored. Setting y0 and y1 to the same value disables the feature. y0 and y1 default to 0.
  • scthresh โ€” sets the scene change detection threshold as a percentage of maximum change on the luma plane. Good values are in the "[8.0, 14.0]" range. Scene change detection is only relevant in case combmatch=sc. The range for scthresh is "[0.0, 100.0]".

Default value is 12.0.

  • combmatch โ€” when combatch (yep, the page spells it that way in this one spot ๐Ÿ™ˆ) is not none, fieldmatch will take into account the combed scores of matches when deciding what match to use as the final match. Available values are:
    • none โ€” no final matching based on combed scores.
    • sc โ€” combed scores are only used when a scene change is detected.
    • full โ€” use combed scores all the time.

Default is sc.

  • combdbg โ€” forces fieldmatch to calculate the combed metrics for certain matches and print them ๐Ÿ“Š. This setting is known as micout in TFM/VFM vocabulary. Available values are:
    • none โ€” no forced calculation.
    • pcn โ€” force p/c/n calculations.
    • pcnub โ€” force p/c/n/u/b calculations.

Default value is none.

cthresh

okay so this is the area combing threshold used for combed frame detection. Basically it controls how "strong" or "visible" the combing has to be before the filter is like "yep, that's combed ๐Ÿ’€". Larger values = combing must be more visible to get detected. Smaller values = combing can be less visible or strong and still get caught. Valid settings run from -1 (literally every pixel gets detected as combed, chaos) all the way to 255 (no pixel will ever be detected as combed, nothing happens ever). It's basically a pixel difference value, bestie. A good range is "[8, 12]".

Default value is 9.


chroma

This one sets whether or not chroma is considered in the combed frame decision ๐ŸŽจ. Only disable this if your source has chroma problems (rainbowing, etc.) that are causing problems for the combed frame detection with chroma enabled. Actually, using chroma=0 is usually more reliable, except for the case where there is chroma only combing in the source.

Default value is 0.


blockx, blocky

Respectively set the x-axis and y-axis size of the window used during combed frame detection. This has to do with the size of the area in which combpel pixels are required to be detected as combed for a frame to be declared combed. See the combpel parameter description for more info. Possible values are any number that is a power of 2 starting at 4 and going up to 512.

Default value is 16.


combpel

The number of combed pixels inside any of the blocky by blockx size blocks on the frame for the frame to be detected as combed. So like โ€” while cthresh controls how "visible" the combing must be, this setting controls "how much" combing there must be in any localized area (a window defined by the blockx and blocky settings) on the frame. Minimum value is 0 and maximum is "blocky x blockx" (at which point no frames will ever be detected as combed, like ever, fr). This setting is known as MI in TFM/VFM vocabulary.

Default value is 80.


p/c/n/u/b meaning

p/c/n

We assume the following telecined stream:

        Top fields:     1 2 2 3 4
        Bottom fields:  1 2 3 4 4

The numbers correspond to the progressive frame the fields relate to. Here, the first two frames are progressive, the 3rd and 4th are combed, and so on.

When "fieldmatch" is configured to run a matching from bottom (field=bottom) this is how this input stream get transformed:

        Input stream:
                        T     1 2 2 3 4
                        B     1 2 3 4 4   <-- matching reference

        Matches:              c c n n c

        Output stream:
                        T     1 2 3 4 4
                        B     1 2 3 4 4

As a result of the field matching, we can see that some frames get duplicated ๐Ÿ‘€. To perform a complete inverse telecine, you need to rely on a decimation filter after this operation. See for instance the decimate filter.

The same operation now matching from top fields (field=top) looks like this:

        Input stream:
                        T     1 2 2 3 4   <-- matching reference
                        B     1 2 3 4 4

        Matches:              c c p p c

        Output stream:
                        T     1 2 2 3 4
                        B     1 2 2 3 4

In these examples, we can see what p, c and n mean; basically, they refer to the frame and field of the opposite parity:

  • <p matches the field of the opposite parity in the previous frame>
  • <c matches the field of the opposite parity in the current frame>
  • <n matches the field of the opposite parity in the next frame>

u/b

The u and b matching are a bit special in the sense that they match from the opposite parity flag ๐Ÿฆ‹. In the following examples, we assume that we are currently matching the 2nd frame (Top:2, bottom:2). According to the match, a 'x' is placed above and below each matched fields.

With bottom matching (field=bottom):

        Match:           c         p           n          b          u

                         x       x               x        x          x
          Top          1 2 2     1 2 2       1 2 2      1 2 2      1 2 2
          Bottom       1 2 3     1 2 3       1 2 3      1 2 3      1 2 3
                         x         x           x        x              x

        Output frames:
                         2          1          2          2          2
                         2          2          2          1          3

With top matching (field=top):

        Match:           c         p           n          b          u

                         x         x           x        x              x
          Top          1 2 2     1 2 2       1 2 2      1 2 2      1 2 2
          Bottom       1 2 3     1 2 3       1 2 3      1 2 3      1 2 3
                         x       x               x        x          x

        Output frames:
                         2          2          2          1          2
                         2          1          3          2          2

Examples

Simple IVTC of a top field first telecined stream, iconic behaviour honestly:

        fieldmatch=order=tff:combmatch=none, decimate

Advanced IVTC, with fallback on yadif for still combed frames (the safety net era โœจ):

        fieldmatch=order=tff:combmatch=full, yadif=deint=interlaced, decimate

fieldorder

Transform the field order of the input video ๐Ÿ”„.

It accepts the following parameters:

order

The output field order. Valid values are tff for top field first or bff for bottom field first.

The default value is tff.

The transformation is done by shifting the picture content up or down by one line, and filling the remaining line with appropriate picture content. This method is consistent with most broadcast field order converters ๐ŸŽ€.

If the input video is not flagged as being interlaced, or it is already flagged as being of the required output field order, then this filter does not alter the incoming video. Like, it just minds its own business, no cap.

It is very useful when converting to or from PAL DV material, which is bottom field first.

For example:

        ffmpeg -i in.vob -vf "fieldorder=bff" out.dv

fillborders

Fill borders of the input video, without changing video stream dimensions ๐Ÿ’…. Sometimes video can have garbage at the four edges and you may not want to crop video input to keep size multiple of some number.

This filter accepts the following options:

  • left โ€” Number of pixels to fill from left border.
  • right โ€” Number of pixels to fill from right border.
  • top โ€” Number of pixels to fill from top border.
  • bottom โ€” Number of pixels to fill from bottom border.
  • mode โ€” Set fill mode. It accepts the following values:
    • smear โ€” fill pixels using outermost pixels
    • mirror โ€” fill pixels using mirroring (half sample symmetric)
    • fixed โ€” fill pixels with constant value
    • reflect โ€” fill pixels using reflecting (whole sample symmetric)
    • wrap โ€” fill pixels using wrapping
    • fade โ€” fade pixels to constant value
    • margins โ€” fill pixels at top and bottom with weighted averages pixels near borders

Default is smear.

  • color โ€” Set color for pixels in fixed or fade mode. Default is black.

Commands

This filter supports same commands as options ๐Ÿซถ. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value. (No drama, it just stays put.)


find_rect

Find a rectangular object in the input video ๐Ÿ”.

The object to search for must be specified as a gray8 image specified with the object option.

For each possible match, a score is computed. If the score reaches the specified threshold, the object is considered found.

If the input video contains multiple instances of the object, the filter will find only one of them. (Yeah, just one. Pick a favourite, I guess ๐Ÿ’€.)

When an object is found, the following metadata entries are set in the matching frame:

  • lavfi.rect.w โ€” width of object
  • lavfi.rect.h โ€” height of object
  • lavfi.rect.x โ€” x position of object
  • lavfi.rect.y โ€” y position of object
  • lavfi.rect.score โ€” match score of the found object

It accepts the following options:

  • object โ€” Filepath of the object image, needs to be in gray8.
  • threshold โ€” Detection threshold, expressed as a decimal number in the range 0-1. A threshold value of 0.01 means only exact matches, a threshold of 0.99 means almost everything matches. Default value is 0.5.
  • mipmaps โ€” Number of mipmaps, default is 3.
  • xmin, ymin, xmax, ymax โ€” Specifies the rectangle in which to search.
  • discard โ€” Discard frames where object is not detected. Default is disabled.

Examples

  • Cover a rectangular object by the supplied image of a given video using ffmpeg:
        ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv
  • Find the position of an object in each frame using ffprobe and write it to a log file:
        ffprobe -f lavfi movie=test.mp4,find_rect=object=object.pgm:threshold=0.3 \
          -show_entries frame=pkt_pts_time:frame_tags=lavfi.rect.x,lavfi.rect.y \
          -of csv -o find_rect.csv

floodfill

Flood area with values of same pixel components with another values ๐ŸŒŠ. Like a paint bucket but make it video.

It accepts the following options:

  • x โ€” Set pixel x coordinate.
  • y โ€” Set pixel y coordinate.
  • s0 โ€” Set source #0 component value.
  • s1 โ€” Set source #1 component value.
  • s2 โ€” Set source #2 component value.
  • s3 โ€” Set source #3 component value.
  • d0 โ€” Set destination #0 component value.
  • d1 โ€” Set destination #1 component value.
  • d2 โ€” Set destination #2 component value.
  • d3 โ€” Set destination #3 component value.

format

Convert the input video to one of the specified pixel formats ๐ŸŽจ. Libavfilter will try to pick one that is suitable as input to the next filter.

It accepts the following parameters:

  • pix_fmts โ€” A '|'-separated list of pixel format names, such as "pix_fmts=yuv420p|monow|rgb24".
  • color_spaces โ€” A '|'-separated list of color space names, such as "color_spaces=bt709|bt470bg|bt2020nc".
  • color_ranges โ€” A '|'-separated list of color range names, such as "color_ranges=tv|pc".
  • alpha_modes โ€” A '|'-separated list of color range names, such as "alpha_modes=straight|premultiplied".

Examples

  • Convert the input video to the yuv420p format
        format=pix_fmts=yuv420p

Convert the input video to any of the formats in the list

        format=pix_fmts=yuv420p|yuv444p|yuv410p

๐ŸŽฌ fps โ€” lock it to one frame rate, bestie

Converts the video to a specified constant frame rate by duplicating or dropping frames as necessary. It's giving "you WILL be 25fps whether you like it or not" energy ๐Ÿ’…

It accepts the following parameters:

  • fps โ€” the desired output frame rate โœจ It accepts expressions containing the following constants:
    • source_fps โ€” the input's frame rate
    • ntsc โ€” NTSC frame rate of 30000/1001
    • pal โ€” PAL frame rate of 25.0
    • film โ€” film frame rate of 24.0
    • ntsc_film โ€” NTSC-film frame rate of 24000/1001

The default is 25.

  • start_time โ€” assume the first PTS should be the given value, in seconds. This allows for padding/trimming at the start of stream ๐ŸŽ€ By default, no assumption is made about the first frame's expected PTS, so no padding or trimming is done. For example, this could be set to 0 to pad the beginning with duplicates of the first frame if a video stream starts after the audio stream, or to trim any frames with a negative PTS.
  • round โ€” timestamp (PTS) rounding method. Possible values are:
    • zero โ€” round towards 0
    • inf โ€” round away from 0
    • down โ€” round towards -infinity
    • up โ€” round towards +infinity
    • near โ€” round to nearest

The default is near.

  • eof_action โ€” action performed when reading the last frame. Possible values are:
    • round โ€” use the same timestamp rounding method as used for other frames
    • pass โ€” pass through last frame if input duration has not been reached yet

The default is round.

Alternatively, the options can be specified as a flat string: fps[:start_time[:round]].

See also the setpts filter ๐Ÿ‘€

Examples

  • A typical usage in order to set the fps to 25:
fps=fps=25
  • Sets the fps to 24, using abbreviation and rounding method to round to nearest:
fps=fps=film:round=near

๐Ÿ•ถ๏ธ framepack โ€” two views walk into a stereoscopic video

Packs two different video streams into a stereoscopic video, setting proper metadata on supported codecs ๐ŸŽ€ The two views should have the same size and framerate, and processing will stop when the shorter video ends. Quick note bestie: you may conveniently adjust view properties with the scale and fps filters ๐Ÿ’–

It accepts the following parameters:

  • format โ€” the desired packing format. Supported values are:
    • sbs โ€” the views are next to each other (default)
    • tab โ€” the views are on top of each other
    • lines โ€” the views are packed by line
    • columns โ€” the views are packed by column
    • frameseq โ€” the views are temporally interleaved

Some examples:

# Convert left and right views into a frame-sequential video
ffmpeg -i LEFT -i RIGHT -filter_complex framepack=frameseq OUTPUT

# Convert views into a side-by-side video with the same output resolution as the input
ffmpeg -i LEFT -i RIGHT -filter_complex [0:v]scale=w=iw/2[left],[1:v]scale=w=iw/2[right],[left][right]framepack=sbs OUTPUT

๐ŸŒˆ framerate โ€” change the frame rate by inventing new frames

Change the frame rate by interpolating new video output frames from the source frames โœจ so it's not just dropping stuff, it's manifesting whole new frames out of thin air, main character energy fr fr.

โš ๏ธ Heads up: this filter is not designed to function correctly with interlaced media. If you wish to change the frame rate of interlaced media then you are required to deinterlace before this filter and re-interlace after this filter. No shortcuts, bestie ๐Ÿ˜ญ

A description of the accepted options follows.

  • fps โ€” specify the output frames per second. This option can also be specified as a value alone. The default is 50.
  • interp_start โ€” specify the start of a range where the output frame will be created as a linear interpolation of two frames. The range is [0-255], the default is 15.
  • interp_end โ€” specify the end of a range where the output frame will be created as a linear interpolation of two frames. The range is [0-255], the default is 240.
  • scene โ€” specify the level at which a scene change is detected as a value between 0 and 100 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. The default is 8.2.
  • flags โ€” specify flags influencing the filter process. Available value for flags is:
    • scene_change_detect, scd โ€” enable scene change detection using the value of the option scene. This flag is enabled by default โœ…

๐Ÿ“ธ framestep โ€” the sampler

Select one frame every N-th frame. We're on a diet, we're skipping frames ๐Ÿฆ‹

This filter accepts the following option:

  • step โ€” select frame after every step frames. Allowed values are positive integers higher than 0. Default value is 1.

๐ŸงŠ freezedetect โ€” catches your video just standing there

Detect frozen video ๐Ÿ‘€

This filter logs a message and sets frame metadata when it detects that the input video has no significant change in content during a specified duration. Video freeze detection calculates the mean average absolute difference of all the components of video frames and compares it to a noise floor.

The printed times and duration are expressed in seconds โฑ๏ธ The lavfi.freezedetect.freeze_start metadata key is set on the first frame whose timestamp equals or exceeds the detection duration and it contains the timestamp of the first frame of the freeze. The lavfi.freezedetect.freeze_duration and lavfi.freezedetect.freeze_end metadata keys are set on the first frame after the freeze ๐Ÿ’–

The filter accepts the following options:

  • noise, n โ€” set noise tolerance. Can be specified in dB (in case dB is appended to the specified value) or as a difference ratio between 0 and 1. Default is -60dB, or 0.001.
  • duration, d โ€” set freeze duration until notification (default is 2 seconds).

๐Ÿฅถ freezeframes โ€” actual freeze-frame, and yes it's dramatic

Freeze video frames ๐ŸงŠ

This filter freezes video frames using frame from 2nd input.

The filter accepts the following options:

  • first โ€” set number of first frame from which to start freeze.
  • last โ€” set number of last frame from which to end freeze.
  • replace โ€” set number of frame from 2nd input which will be used instead of replaced frames.

๐ŸŽจ frei0r โ€” plug in those frei0r effects

Apply a frei0r effect to the input video โœจ

To enable the compilation of this filter, you need to install the frei0r header and configure FFmpeg with --enable-frei0r. Like, you gotta build it in, it's not just there ๐Ÿซถ

It accepts the following parameters:

  • filter_name โ€” the name of the frei0r effect to load. If the environment variable FREI0R_PATH is defined, the frei0r effect is searched for in each of the directories specified by the colon-separated list in FREI0R_PATH. Otherwise, the standard frei0r paths are searched, in this order: HOME/.frei0r-1/lib/, /usr/local/lib/frei0r-1/, /usr/lib/frei0r-1/.
  • filter_params โ€” a |-separated list of parameters to pass to the frei0r effect.

A frei0r effect parameter can be a boolean (its value is either y or n), a double, a color (specified as R/G/B, where R, G, and B are floating point numbers between 0.0 and 1.0, inclusive) or a color description as specified in the Color section in the ffmpeg-utils manual, a position (specified as X/Y, where X and Y are floating point numbers) and/or a string ๐Ÿ’…

The number and types of parameters depend on the loaded effect. If an effect parameter is not specified, the default value is set.

Examples

  • Apply the distort0r effect, setting the first two double parameters:
frei0r=filter_name=distort0r:filter_params=0.5|0.01
  • Apply the colordistance effect, taking a color as the first parameter:
frei0r=colordistance:0.2/0.3/0.4
frei0r=colordistance:violet
frei0r=colordistance:0x112233
  • Apply the perspective effect, specifying the top left and top right image positions:
frei0r=perspective:0.2/0.2|0.8/0.2

For more information, see <http://frei0r.dyne.org> ๐ŸŒ

Commands

This filter supports the filter_params option as commands ๐Ÿ‘‘


โšก fspp โ€” fast and simple postprocessing

Apply fast and simple postprocessing. It is a faster version of spp ๐ŸŽ๏ธ

It splits (I)DCT into horizontal/vertical passes. Unlike the simple post-processing filter, one of them is performed once per block, not per pixel. This allows for much higher speed. Slay, efficiency ๐Ÿ’…

The filter accepts the following options:

  • quality โ€” set quality. This option defines the number of levels for averaging. It accepts an integer in the range 4-5. Default value is 4.
  • qp โ€” force a constant quantization parameter. It accepts an integer in range 0-63. If not set, the filter will use the QP from the video stream (if available).
  • strength โ€” set filter strength. It accepts an integer in range -15 to 32. Lower values mean more details but also more artifacts, while higher values make the image smoother but also blurrier. Default value is 0 โˆ’ PSNR optimal.
  • use_bframe_qp โ€” enable the use of the QP from the B-Frames if set to 1. Using this option may cause flicker since the B-Frames have often larger QP. Default is 0 (not enabled).

๐Ÿ—บ๏ธ fsync โ€” sync frames with an external map file

Synchronize video frames with an external mapping from a file ๐ŸŽ€

For each input PTS given in the map file it either drops or creates as many frames as necessary to recreate the sequence of output frames given in the map file. Literally frame-by-frame matchmaking ๐Ÿ’–

This filter is useful to recreate the output frames of a framerate conversion by the fps filter, recorded into a map file using the ffmpeg option -stats_mux_pre, and do further processing to the corresponding frames e.g. quality comparison.

Each line of the map file must contain three items per input frame, the input PTS (decimal), the output PTS (decimal) and the output TIMEBASE (decimal/decimal), separated by a space. This file format corresponds to the output of -stats_mux_pre_fmt="{ptsi} {pts} {tb}" โœจ

The filter assumes the map file is sorted by increasing input PTS.

The filter accepts the following options:

  • file, f โ€” the filename of the map file to be used.

Example:

# Convert a video to 25 fps and record a MAP_FILE file with the default format of this filter
ffmpeg -i INPUT -vf fps=fps=25 -stats_mux_pre MAP_FILE -stats_mux_pre_fmt "{ptsi} {pts} {tb}" OUTPUT

# Sort MAP_FILE by increasing input PTS
sort -n MAP_FILE

# Use INPUT, OUTPUT and the MAP_FILE from above to compare the corresponding frames in INPUT and OUTPUT via SSIM
ffmpeg -i INPUT -i OUTPUT -filter_complex '[0:v]fsync=file=MAP_FILE[ref];[1:v][ref]ssim' -f null -

๐ŸŒซ๏ธ gblur โ€” the classic Gaussian blur

Apply Gaussian blur filter ๐Ÿฆ‹ soft focus, dreamy vibes, it's giving main character glow-up โœจ

The filter accepts the following options:

  • sigma โ€” set horizontal sigma, standard deviation of Gaussian blur. Default is 0.5.
  • steps โ€” how many steps the Gaussian approximation gets. Default is 1. More steps = more accurate, obviously.
  • planes โ€” which planes get filtered. By default, all of them get filtered, no one's left out ๐Ÿ’…
  • sigmaV โ€” vertical sigma. If it's negative it just copies whatever "sigma" is set to. Default is -1.

๐Ÿซถ Commands

This filter supports the same commands as options โ€” the command takes the exact same syntax as the corresponding option, fr fr.

If the expression you pass isn't valid, it's kept at its current value. No crash, no drama, it just stays where it was.

๐ŸŒˆ geq

Apply a generic equation to each and every pixel. Yes, you're literally doing math on pixels. Main character behaviour.

The filter accepts the following options:

  • lum_expr, lum โ€” set the luma expression.
  • cb_expr, cb โ€” set the chrominance blue expression.
  • cr_expr, cr โ€” set the chrominance red expression.
  • alpha_expr, a โ€” set the alpha expression.
  • red_expr, r โ€” set the red expression.
  • green_expr, g โ€” set the green expression.
  • blue_expr, b โ€” set the blue expression.

So here's how the colorspace gets picked โ€” it literally depends on which options you use. If you specify one of lum_expr, cb_expr, or cr_expr, the filter auto-selects a YCbCr colorspace. If you specify one of red_expr, green_expr, or blue_expr, it selects an RGB colorspace instead. It just knows โœจ

If one of the chrominance expressions isn't defined, it falls back on the other one. If there's no alpha expression specified, it evaluates to an opaque value. And if none of the chrominance expressions are specified at all? They all evaluate to the luma expression.

The expressions can use these variables and functions:

  • N โ€” the sequential number of the filtered frame, starting from 0.
  • X, Y โ€” the coordinates of the current sample.
  • W, H โ€” the width and height of the image.
  • SW, SH โ€” width and height scale depending on the currently filtered plane. It's the ratio between the corresponding luma plane's number of pixels and the current plane's ones. Like for YUV4:2:0 the values are "1,1" for the luma plane, and "0.5,0.5" for the chroma planes.
  • T โ€” time of the current frame, in seconds.

Then the pixel-poking functions:

  • p(x, y) โ€” returns the value of the pixel at location (x,y) of the current plane.
  • lum(x, y) โ€” returns the value of the pixel at location (x,y) of the luma plane.
  • cb(x, y) โ€” returns the value of the pixel at location (x,y) of the blue-difference chroma plane. Returns 0 if there's no such plane.
  • cr(x, y) โ€” returns the value of the pixel at location (x,y) of the red-difference chroma plane. Returns 0 if there's no such plane.
  • r(x, y), g(x, y), b(x, y) โ€” return the value of the pixel at location (x,y) of the red / green / blue component. Returns 0 if there's no such component.
  • alpha(x, y) โ€” returns the value of the pixel at location (x,y) of the alpha plane. Returns 0 if there's no such plane.

And the cumulative ones, iykyk:

  • psum(x,y), lumsum(x, y), cbsum(x,y), crsum(x,y), rsum(x,y), gsum(x,y), bsum(x,y), alphasum(x,y) โ€” sum of sample values in the rectangle from (0,0) to (x,y). This is how you get sums of samples inside a rectangle. Same functions as above, just with the sum postfix.
  • interpolation โ€” set one of the interpolation methods:
    • nearest, n
    • bilinear, b

Default is bilinear.

For these functions, if x and y land outside the area, the value gets automatically clipped to the closer edge. The math will not let you fall off the map ๐Ÿ’€
โš ๏ธ Heads up bestie: this filter can use multiple threads, and in that case each slice gets its own expression state. If you want only a single expression state because your expressions depend on previous state, then you should limit the number of filter threads to 1.

๐Ÿฆ‹ Examples

  • Flip the image horizontally:
geq=p(W-X\,Y)
  • Generate a bidimensional sine wave, with angle "PI/3" and a wavelength of 100 pixels:
geq=128 + 100*sin(2*(PI/100)*(cos(PI/3)*(X-50*T) + sin(PI/3)*Y)):128:128
  • Generate a fancy enigmatic moving light:
nullsrc=s=256x256,geq=random(1)/hypot(X-cos(N*0.07)*W/2-W/2\,Y-sin(N*0.09)*H/2-H/2)^2*1000000*sin(N*0.02):128:128
  • Generate a quick emboss effect:
format=gray,geq=lum_expr='(p(X,Y)+(256-p(X-4,Y-4)))/2'
  • Modify RGB components depending on pixel position:
geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)'
  • Create a radial gradient that's the same size as the input (also check out the vignette filter, bestie):
geq=lum=255*gauss((X/W-0.5)*3)*gauss((Y/H-0.5)*3)/gauss(0)/gauss(0),format=gray

๐ŸŽ€ gradfun

Fixes the banding artifacts that sometimes sneak into nearly flat regions when you truncate to 8-bit color depth. It interpolates the gradients that should be where the bands are, then dithers them. It's giving restoration era ๐Ÿ’…

It's designed for playback only. Do not use it prior to lossy compression, because compression tends to lose the dither and bring the bands right back. Like, don't do that. Seriously.

It accepts the following parameters:

  • strength โ€” the maximum amount by which the filter will change any one pixel. This is also the threshold for detecting nearly flat regions. Acceptable values range from .51 to 64; the default value is 1.2. Out-of-range values get clipped to the valid range.
  • radius โ€” the neighborhood to fit the gradient to. A larger radius makes for smoother gradients, but it also prevents the filter from modifying pixels near detailed regions. Acceptable values are 8-32; the default value is 16. Out-of-range values get clipped to the valid range.

Alternatively, you can specify the options as a flat string: strength[:radius]

๐ŸŒธ Examples

  • Apply the filter with a 3.5 strength and radius of 8:
gradfun=3.5:8
  • Specify the radius, omitting the strength (which falls back to the default value):
gradfun=radius=8

๐Ÿ‘‘ graphmonitor

Shows you various filtergraph stats. With this filter you can debug a complete filtergraph โ€” especially issues with links filling up with queued frames. Lowkey a lifesaver for debugging.

The filter accepts the following options:

  • size, s โ€” set video output size. Default is hd720.
  • opacity, o โ€” set video opacity. Default is 0.9. Allowed range is from 0 to 1.
  • mode, m โ€” set output mode flags. Available values for flags are:
    • full โ€” no filtering at all. Default.
    • compact โ€” show only filters with queued frames.
    • nozero โ€” show only filters with non-zero stats.
    • noeof โ€” show only filters with non-eof stat.
    • nodisabled โ€” show only filters that are enabled in timeline.
  • flags, f โ€” set flags which enable which stats are shown in video. Available values for flags are:
    • none โ€” all flags turned off.
    • all โ€” all flags turned on.
    • queue โ€” display number of queued frames in each link.
    • frame_count_in โ€” display number of frames taken from filter.
    • frame_count_out โ€” display number of frames given out from filter.
    • frame_count_delta โ€” display delta number of frames between the above two values.
    • pts โ€” display current filtered frame pts.
    • pts_delta โ€” display pts delta between current and previous frame.
    • time โ€” display current filtered frame time.
    • time_delta โ€” display time delta between current and previous frame.
    • timebase โ€” display time base for filter link.
    • format โ€” display used format for filter link.
    • size โ€” display video size or number of audio channels in case of audio used by filter link.
    • rate โ€” display video frame rate or sample rate in case of audio used by filter link.
    • eof โ€” display link output status.
    • sample_count_in โ€” display number of samples taken from filter.
    • sample_count_out โ€” display number of samples given out from filter.
    • sample_count_delta โ€” display delta number of samples between the above two values.
    • disabled โ€” show the timeline filter status.
  • rate, r โ€” set the upper limit for the video rate of the output stream. Default value is 25. This guarantees the output video frame rate will not be higher than this value.

๐Ÿ’œ grayworld

A color constancy filter that applies color correction based on the grayworld assumption. Obsessed with how it just knows what colors should be ๐Ÿซถ

See: https://www.researchgate.net/publication/275213614_A_New_Color_Correction_Method_for_Underwater_Imaging

The algorithm uses linear light, so your input data should be linearized beforehand (and possibly correctly tagged). Like so:

ffmpeg -i INPUT -vf zscale=transfer=linear,grayworld,zscale=transfer=bt709,format=yuv420p OUTPUT

โญ greyedge

A color constancy variation filter that estimates scene illumination via the grey edge algorithm, then corrects the scene colors accordingly. It's giving detective energy ๐Ÿ”

See: https://staff.science.uva.nl/th.gevers/pub/GeversTIP07.pdf

The filter accepts the following options:

  • difford โ€” the order of differentiation to be applied on the scene. Must be chosen in the range [0,2] and the default value is 1.
  • minknorm โ€” the Minkowski parameter used for calculating the Minkowski distance. Must be chosen in the range [0,20] and the default value is 1. Set it to 0 to get the max value instead of calculating the Minkowski distance.
  • sigma โ€” the standard deviation of the Gaussian blur applied on the scene. Must be chosen in the range [0,1024.0] and the default value is 1. floor( sigma * break_off_sigma(3) ) can't be equal to 0 if difford is greater than 0. No cap on that rule, it's real.

๐Ÿงš Examples

  • Grey Edge:
greyedge=difford=1:minknorm=5:sigma=2
  • Max Edge:
greyedge=difford=1:minknorm=0:sigma=2

๐Ÿ’– guided

Applies a guided filter for edge-preserving smoothing, dehazing and so on. Literally so versatile.

The filter accepts the following options:

  • radius โ€” set the box radius in pixels. Allowed range is 1 to 20. Default is 3.
  • eps โ€” set the regularization parameter (with square). Allowed range is 0 to 1. Default is 0.01.
  • mode โ€” set the filter mode. Can be "basic" or "fast". Default is "basic".
  • sub โ€” set the subsampling ratio for "fast" mode. Range is 2 to 64. Default is 4. No subsampling occurs in "basic" mode.
  • guidance โ€” set the guidance mode. Can be "off" or "on". Default is "off". If "off", a single input is required. If "on", two inputs of the same resolution and pixel format are required โ€” the second input serves as the guidance.
  • planes โ€” set the planes to filter. Default is first only.

๐Ÿ’… Commands

This filter supports all the above options as commands. Slay.

๐ŸŒˆ Examples

  • Edge-preserving smoothing with the guided filter:
ffmpeg -i in.png -vf guided out.png
ffmpeg -i in.png -i guidance.png -filter_complex guided=guidance=on out.png

๐Ÿ’ซ haldclut

Slap a Hald CLUT onto a video stream. Iconic behavior honestly.

First input = the video stream you're processing. Second input = the Hald CLUT. And that CLUT input can be a plain little picture or a whole entire video stream. Both valid bestie ๐Ÿ’…

This filter takes these options:

  • clut โ€” picks which CLUT video frames get processed from that second input stream. Values are first or all. Default is all.
  • shortest โ€” force it to stop when the shortest input stops. Default is 0.
  • repeatlast โ€” keep applying that last CLUT after the stream ends. A value of 0 disables the filter once the last frame of the CLUT is hit. Default is 1.

haldclut also has the exact same interpolation options as lut3d (they literally share the same internals, besties ๐Ÿค).

This filter also supports the framesync options.

Want more tea about Hald CLUT? It's on Eskil Steenberg's website (he's the Hald CLUT author btw ๐Ÿ‘‘) at <http://www.quelsolaar.com/technology/clut.html>.

Commands

This filter supports the interp option as commands.

Workflow examples

Hald CLUT video stream ๐ŸŽฌ

Generate an identity Hald CLUT stream that's been altered with various effects:

ffmpeg -f lavfi -i haldclutsrc=8 -vf "hue=H=2*PI*t:s=sin(2*PI*t)+1, curves=cross_process" -t 10 -c:v ffv1 clut.nut
Note: make sure you use a lossless codec. Do not skip this, I'm begging ๐Ÿ˜ญ

Then use it with haldclut to apply it on some random stream:

ffmpeg -f lavfi -i mandelbrot -i clut.nut -filter_complex '[0][1] haldclut' -t 20 mandelclut.mkv

So the Hald CLUT gets applied to the first 10 seconds (that's the duration of clut.nut), and after that the latest picture of that CLUT stream gets applied to all the remaining frames of the mandelbrot stream. It just vibes on through โœจ

Hald CLUT with preview ๐ŸŽ€

A Hald CLUT is supposed to be a squared image of Level*Level*Level by Level*Level*Level pixels. For a given Hald CLUT, FFmpeg will select the biggest possible square starting at the top left of the picture. The leftover padding pixels (bottom or right) get ignored. Which means โ€” you can use that area to add a preview of the Hald CLUT ๐Ÿ‘€

Typically, the following generated Hald CLUT will be supported by the haldclut filter:

ffmpeg -f lavfi -i haldclutsrc=8 -vf "
   pad=iw+320 [padded_clut];
   smptebars=s=320x256, split [a][b];
   [padded_clut][a] overlay=W-320:h, curves=color_negative [main];
   [main][b] overlay=W-320" -frames:v 1 clut.png

It contains the original and a preview of what the CLUT does: SMPTE color bars are displayed on the right-top, and below them the same color bars but processed by the color changes. So cute, so useful ๐Ÿงš

Then you can visualize the effect of this Hald CLUT with:

ffplay input.mkv -vf "movie=clut.png, [in] haldclut"

๐Ÿชž hflip

Flip the input video horizontally. Mirror mode, basically.

For example, to horizontally flip the input video with ffmpeg:

ffmpeg -i in.avi -vf "hflip" out.avi

๐ŸŒˆ histeq

This filter applies a global color histogram equalization on a per-frame basis.

Use it to correct video that's got a compressed range of pixel intensities. The filter redistributes pixel intensities so their distribution across the intensity range is all equalized. Think of it as an "automatically adjusting contrast filter". Honestly it's only useful for correcting degraded or poorly captured source video โ€” don't come at it for anything else, it's not that girl for general use.

The filter accepts these options:

  • strength โ€” sets how much equalization gets applied. As strength goes down, the distribution of pixel intensities inches closer and closer to the input frame's. Must be a float in the range [0,1] and defaults to 0.200.
  • intensity โ€” sets the maximum intensity that can be generated, and scales the output values appropriately. Set strength how you want it, then limit intensity if you need to so things don't get washed out ๐Ÿ’€ Must be a float in the range [0,1] and defaults to 0.210.
  • antibanding โ€” sets the antibanding level. If enabled, the filter randomly varies the luminance of output pixels by a small amount so you don't get banding of the histogram. Possible values are none, weak or strong. Defaults to none.

๐Ÿ“Š histogram

Compute and draw a color distribution histogram for the input video. Data visualization era ๐ŸŽจ

The computed histogram is a representation of the color component distribution in an image.

The standard histogram displays the color components distribution in an image. It displays a color graph for each color component โ€” shows the distribution of the Y, U, V, A or R, G, B components (depends on the input format) in the current frame. And below each graph there's a color component scale meter. Chef's kiss layout.

The filter accepts these options:

  • level_height โ€” set the height of the level. Default value is 200. Allowed range is [50, 2048].
  • scale_height โ€” set the height of the color scale. Default value is 12. Allowed range is [0, 40].
  • display_mode โ€” set the display mode. Takes these values:
    • stack โ€” per color component graphs are placed below each other.
    • parade โ€” per color component graphs are placed side by side.
    • overlay โ€” presents information identical to what's in parade, except the graphs representing color components are superimposed directly over one another.

Default is stack.

  • levels_mode โ€” set the mode. Can be either linear or logarithmic. Default is linear.
  • components โ€” set which color components to display. Default is 7.
  • fgopacity โ€” set the foreground opacity. Default is 0.7.
  • bgopacity โ€” set the background opacity. Default is 0.5.
  • colors_mode โ€” set the colors mode. It accepts these values:
    • whiteonblack
    • blackonwhite
    • whiteongray
    • blackongray
    • coloronblack
    • coloronwhite
    • colorongray
    • blackoncolor
    • whiteoncolor
    • grayoncolor

Default is whiteonblack.

Examples

  • Calculate and draw histogram:
ffplay -i input -vf histogram

๐Ÿงผ hqdn3d

This is a high precision/quality 3d denoise filter. Its whole goal: reduce image noise, produce smooth images, and make still images really still. It should also enhance compressibility. Glow-up for your footage ngl โœจ

It accepts these optional parameters:

  • luma_spatial โ€” a non-negative floating point number that specifies spatial luma strength. Defaults to 4.0.
  • chroma_spatial โ€” a non-negative floating point number that specifies spatial chroma strength. Defaults to 3.0*luma_spatial/4.0.
  • luma_tmp โ€” a floating point number that specifies luma temporal strength. Defaults to 6.0*luma_spatial/4.0.
  • chroma_tmp โ€” a floating point number that specifies chroma temporal strength. Defaults to luma_tmp*chroma_spatial/luma_spatial.

Commands

This filter supports the same commands as options. The command accepts the same syntax as the corresponding option.

If the expression you specified isn't valid, it's kept at its current value. No drama, it just stays put ๐Ÿ™ˆ


โฌ‡๏ธ hwdownload

Download hardware frames to system memory. Like bringing your pics back down to earth.

The input must be in hardware frames, and the output a non-hardware format. Heads up though โ€” not all formats will be supported on the output. You may need to insert an additional format filter immediately following in the graph to get the output in a supported format. iykyk ๐Ÿซถ


๐Ÿ—บ๏ธ hwmap

Map hardware frames to system memory, or to another device. Very "who's translating for who" energy.

This filter has several different modes of operation, and which one gets used depends on the input and output formats:

  • Hardware frame input, normal frame output
    • Map the input frames to system memory and pass them to the output. If the original hardware frame is needed later (say, after overlaying something else on part of it), the hwmap filter can be used again in the next mode to retrieve it.
  • Normal frame input, hardware frame output
    • If the input is actually a software-mapped hardware frame, then unmap it โ€” that is, return the original hardware frame.
    • Otherwise, a device must be provided. Create new hardware surfaces on that device for the output, then map them back to the software format at the input and give those frames to the preceding filter. This then acts like the hwupload filter, but it may be able to avoid an additional copy when the input is already in a compatible format. Efficiency slay ๐Ÿ’…
  • Hardware frame input and output
    • A device must be supplied for the output, either directly or with the derive_device option. The input and output devices must be of different types and compatible โ€” the exact meaning of that is system-dependent, but typically it means they must refer to the same underlying hardware context (for example, refer to the same graphics card).
    • If the input frames were originally created on the output device, then unmap to retrieve the original frames.
    • Otherwise, map the frames to the output device โ€” create new hardware frames on the output corresponding to the frames on the input.

The following additional parameters are accepted:

  • mode โ€” set the frame mapping mode. Some combination of:
    • read โ€” the mapped frame should be readable.
    • write โ€” the mapped frame should be writeable.
    • overwrite โ€” the mapping will always overwrite the entire frame.
      • This may improve performance in some cases, since the original contents of the frame don't need to be loaded.
    • direct โ€” the mapping must not involve any copying.
      • Indirect mappings to copies of frames get created in some cases where either direct mapping isn't possible or it would have unexpected properties. Setting this flag ensures the mapping is direct, and it will fail if that's not possible. No cap, it'll just die ๐Ÿ’€

Defaults to read+write if you don't specify.

  • derive_device type โ€” rather than using the device supplied at initialisation, instead derive a new device of type type from the device the input frames exist on. Cute little device nepo baby ๐ŸŽ€
  • reverse โ€” in a hardware-to-hardware mapping, map in reverse: create frames in the sink and map them back to the source. This may be necessary in some cases where a mapping in one direction is required but only the opposite direction is supported by the devices being used. Backwards but make it work ๐ŸŒธ

quick content warning before we go any further โ€” this option is dangerous. It can break the filter that comes before it in undefined ways if that filter has any extra constraints on its output. Do not touch it unless you fully, completely understand what using it implies. Like, fr fr. ๐Ÿ’€


hwupload ๐Ÿซถ

Uploads system memory frames onto hardware surfaces. Iconic behaviour.

The device you're uploading to has to be supplied when the filter gets initialised. If you're rolling with ffmpeg, you pick the right device using the -filter_hw_device option, or with the derive_device option. And here's the vibe check: the input and output devices must be of different types and also compatible with each other. What "compatible" means is system-dependent, but like, typically it means they both gotta refer to the same underlying hardware context โ€” for example, the same graphics card.

The following additional parameters are accepted:

  • derive_device type โ€” instead of using the device handed over at initialisation, derive a brand new device of type type from the device that the input frames currently exist on. โœจ

hwupload_cuda ๐Ÿ’…

Uploads system memory frames to a CUDA device. Same energy, CUDA flavoured.

It accepts the following optional parameters:

  • device โ€” the number of the CUDA device to use.

hqx ๐ŸŽ€

Applies a high-quality magnification filter that was literally designed for pixel art. This one was originally created by Maxim Stepin, we stan. ๐Ÿ‘‘

It accepts the following option:

  • n โ€” sets the scaling dimension: 2 for hq2x, 3 for hq3x, and 4 for hq4x. Default is 3.

hstack ๐ŸŒˆ

Stacks input videos horizontally. Side by side, bestie, like a duo pic.

All streams must be of the same pixel format and the same height.

Fun fact: this filter is faster than using the overlay and pad filters to create the same output. Efficiency ate. ๐Ÿ”ฅ

The filter accepts the following option:

  • inputs โ€” sets the number of input streams. Default is 2.
  • shortest โ€” if set to 1, forces the output to terminate when the shortest input terminates. Default value is 0.

hsvhold ๐Ÿฆ‹

Turns a certain HSV range into gray values.

This filter measures the color difference between the HSV color you set in the options and the ones it measures in the video stream. Depending on your options, output colors can be changed to be gray or not. It's giving selective desaturation.

The filter accepts the following options:

  • hue โ€” sets the hue value that'll be used in the color difference calculation. Allowed range is from -360 to 360. Default value is 0.
  • sat โ€” sets the saturation value used in the color difference calculation. Allowed range is from -1 to 1. Default value is 0.
  • val โ€” sets the value used in the color difference calculation. Allowed range is from -1 to 1. Default value is 0.
  • similarity โ€” sets the similarity percentage with the key color. Allowed range is from 0 to 1. Default value is 0.01.

0.00001 matches only the exact key color, while 1.0 matches literally everything.

  • blend โ€” blend percentage. Allowed range is from 0 to 1. Default value is 0.

0.0 makes pixels either fully gray or not gray at all.

Higher values result in more gray pixels, and a pixel is grayer the more similar its color is to the key color. ๐ŸŒธ

hsvkey ๐Ÿงš

Turns a certain HSV range into transparency.

This filter measures color difference between the HSV color set in the options and the ones measured in the video stream. Depending on your options, output colors can be changed to transparent by adding an alpha channel. Poof, gone. ๐Ÿ’จ

The filter accepts the following options:

  • hue โ€” sets the hue value used in the color difference calculation. Allowed range is from -360 to 360. Default value is 0.
  • sat โ€” sets the saturation value used in the color difference calculation. Allowed range is from -1 to 1. Default value is 0.
  • val โ€” sets the value used in the color difference calculation. Allowed range is from -1 to 1. Default value is 0.
  • similarity โ€” sets the similarity percentage with the key color. Allowed range is from 0 to 1. Default value is 0.01.

0.00001 matches only the exact key color, while 1.0 matches everything.

  • blend โ€” blend percentage. Allowed range is from 0 to 1. Default value is 0.

0.0 makes pixels either fully transparent or not transparent at all.

Higher values result in semi-transparent pixels, and a pixel is more transparent the more similar its color is to the key color.

hue ๐Ÿ’œ

Modifies the hue and/or the saturation of the input. Glow-up for your colors.

It accepts the following parameters:

  • h โ€” specify the hue angle as a number of degrees. It accepts an expression, and defaults to "0".
  • s โ€” specify the saturation in the [-10,10] range. It accepts an expression and defaults to "1".
  • H โ€” specify the hue angle as a number of radians. It accepts an expression, and defaults to "0".
  • b โ€” specify the brightness in the [-10,10] range. It accepts an expression and defaults to "0".
Heads up bestie: h and H are mutually exclusive, you can't specify them at the same time. Pick a lane. ๐Ÿ™ˆ

The b, h, H and s option values are expressions containing the following constants:

  • n โ€” frame count of the input frame, starting from 0.
  • pts โ€” presentation timestamp of the input frame, expressed in time base units.
  • r โ€” frame rate of the input video, NAN if the input frame rate is unknown.
  • t โ€” timestamp expressed in seconds, NAN if the input timestamp is unknown.
  • tb โ€” time base of the input video.

Examples โœจ

  • Set the hue to 90 degrees and the saturation to 1.0:
hue=h=90:s=1
  • Same command but expressing the hue in radians:
hue=H=PI/2:s=1
  • Rotate hue and make the saturation swing between 0 and 2 over a period of 1 second:
hue="H=2*PI*t: s=sin(2*PI*t)+1"
  • Apply a 3 seconds saturation fade-in effect starting at 0:
hue="s=min(t/3\,1)"

The general fade-in expression can be written as:

hue="s=min(0\, max((t-START)/DURATION\, 1))"
  • Apply a 3 seconds saturation fade-out effect starting at 5 seconds:
hue="s=max(0\, min(1\, (8-t)/3))"

The general fade-out expression can be written as:

hue="s=max(0\, min(1\, (START+DURATION-t)/DURATION))"

Commands ๐ŸŽฎ

This filter supports the following commands:

  • b
  • s
  • h
  • H

Modify the hue and/or the saturation and/or brightness of the input video. The command accepts the same syntax as the corresponding option.

If the specified expression isn't valid, it just stays at its current value. No drama. ๐Ÿ’…

huesaturation ๐ŸŒธ

Applies hue-saturation-intensity adjustments to the input video stream.

Important: this filter operates in RGB colorspace.

This filter accepts the following options:

  • hue โ€” sets the hue shift in degrees to apply. Default is 0. Allowed range is from -180 to 180.
  • saturation โ€” sets the saturation shift. Default is 0. Allowed range is from -1 to 1.
  • intensity โ€” sets the intensity shift. Default is 0. Allowed range is from -1 to 1.
  • colors โ€” sets which primary and complementary colors are gonna get adjusted. You set this option by providing one or multiple values, and you can select multiple colors at once. By default all colors are selected.
    • r โ€” adjust reds.
    • y โ€” adjust yellows.
    • g โ€” adjust greens.
    • c โ€” adjust cyans.
    • b โ€” adjust blues.
    • m โ€” adjust magentas.
    • a โ€” adjust all colors.
  • strength โ€” sets the strength of filtering. Allowed range is from 0 to 100. Default value is 1.
  • rw, gw, bw โ€” set the weight for each RGB component. Allowed range is from 0 to 1. By default it's set to 0.333, 0.334, 0.333. These options are used in saturation and lightness processing.
  • lightness โ€” sets preserving lightness, and by default it's disabled. Adjusting hues can change the lightness from the original RGB triplet, but with this option enabled the lightness is kept at the same value. ๐Ÿฆ‹

hysteresis ๐Ÿ‘‘

Grows the first stream into the second stream by connecting components. This makes it possible to build more robust edge masks. Very main character of it.

This filter accepts the following options:

  • planes โ€” sets which planes will be processed as bitmap; unprocessed planes get copied from the first stream. By default the value is 0xf, meaning all planes are processed.
  • threshold โ€” sets the threshold used in filtering. If a pixel component value is higher than this value, the filter algorithm for connecting components is activated. By default the value is 0.

The hysteresis filter also supports the framesync options. ๐Ÿซถ

iccdetect ๐Ÿ”

Detects the colorspace from an embedded ICC profile (if there is one present), and updates the frame's tags accordingly.

This filter accepts the following options:

  • force โ€” if true, the frame's existing colorspace tags always get overridden by values detected from an ICC profile. Otherwise, they only get assigned if they contain unknown. Enabled by default.

iccgen ๐ŸŽจ

Generates ICC profiles and attaches them to frames.

This filter accepts the following options:

  • color_primaries
  • color_trc

Configure the colorspace that the ICC profile is gonna be generated for. The default value of auto infers the value from the input frame's metadata, defaulting to BT.709/sRGB as appropriate.

See the setparams filter for a list of possible values, but note that unknown are not valid values for this filter.

  • force โ€” if true, an ICC profile will be generated even if it would overwrite an already existing ICC profile. Disabled by default.

identity ๐Ÿ’–

Obtains the identity score between two input videos.

This filter takes two input videos.

Both input videos must have the same resolution and pixel format for this filter to work correctly. It also assumes both inputs have the same number of frames, which get compared one by one.

The obtained per component, average, min and max identity score is printed through the logging system.

The filter stores the calculated identity scores of each frame in frame metadata.

This filter also supports the framesync options.

In the example below, the input file main.mpg being processed is compared with the reference file ref.mpg:

ffmpeg -i main.mpg -i ref.mpg -lavfi identity -f null -

idet ๐ŸŽฌ

Detects the video interlacing type.

This filter tries to detect whether the input frames are interlaced, progressive, top field first, or bottom field first. It'll also try to detect fields that are repeated between adjacent frames (which is a sign of telecine).

Single frame detection only considers immediately adjacent frames when classifying each frame. Multiple frame detection incorporates the classification history of previous frames. History stays booked. ๐Ÿ“–

The filter will log these metadata values:

  • single.current_frame โ€” detected type of the current frame using single-frame detection. One of: tff'' (top field first), bff'' (bottom field first), progressive'', or undetermined''.

Still inside idet btw โ€” here's the rest of the metadata it spits out ๐Ÿ’… these are all keys it writes onto frames:

  • single.tff โ€” cumulative count of frames it flagged as top field first, using single-frame detection โœจ
  • multiple.tff โ€” cumulative count of frames flagged top field first, but via multiple-frame detection ๐ŸŽ€
  • single.bff โ€” cumulative count of frames flagged bottom field first, single-frame detection
  • multiple.current_frame โ€” the detected type of the current frame using multiple-frame detection. It'll be one of: tff (top field first), bff (bottom field first), progressive, or undetermined ๐Ÿฆ‹
  • multiple.bff โ€” cumulative count of bottom-field-first frames, multiple-frame detection
  • single.progressive โ€” cumulative count of frames detected as progressive, single-frame detection
  • multiple.progressive โ€” same thing but via multiple-frame detection
  • single.undetermined โ€” cumulative count of frames that single-frame detection literally could not classify ๐Ÿ˜ญ
  • multiple.undetermined โ€” same, multiple-frame detection
  • repeated.current_frame โ€” which field in the current frame is repeated from the last one. One of neither, top, or bottom
  • repeated.neither โ€” cumulative number of frames with no repeated field
  • repeated.top โ€” cumulative number of frames whose top field is repeated from the previous frame's top field
  • repeated.bottom โ€” cumulative number of frames whose bottom field is repeated from the previous frame's bottom field

โœจ the options โœจ

The filter accepts the following options:

  • intl_thres โ€” set the interlacing threshold
  • prog_thres โ€” set the progressive threshold
  • rep_thres โ€” threshold for repeated field detection
  • half_life โ€” number of frames after which a given frame's contribution to the statistics is halved (so it only contributes 0.5 to its classification). Default is 0, which means every frame ever seen keeps its full weight of 1.0 forever, iconic commitment ๐Ÿซถ
  • analyze_interlaced_flag โ€” when this is not 0, idet uses the specified number of frames to figure out whether the interlaced flag is accurate, and it will not count undetermined frames. If the flag turns out accurate, it's used with no further computation; if it turns out inaccurate, it gets cleared with no further computation. So basically you can drop idet in as a low-compute cleanup pass for the interlaced flag ๐Ÿ”ฅ

๐ŸŒธ Examples ๐ŸŒธ

Wanna inspect the field order of the first 360 frames of a video, in verbose detail? Say less:

ffmpeg -i INPUT -filter:v idet,metadata=mode=print -frames:v 360 -an -f null -

The idet filter adds analysis metadata to each frame, and then that metadata gets yeeted. At the end the filter also prints a final report with statistics, so you get the receipts ๐Ÿ’–


il

Deinterleave or interleave fields.

This one lets you process interlaced image fields without deinterlacing them, no cap. Deinterleaving splits the input frame into 2 fields (the so-called half pictures). Odd lines get moved to the top half of the output image, even lines to the bottom half. Then you can filter them independently and re-interleave them after ๐Ÿฆ‹

The filter accepts the following options:

  • luma_mode, l
  • chroma_mode, c
  • alpha_mode, a

Available values for luma_mode, chroma_mode and alpha_mode are:

  • none โ€” do nothing
  • deinterleave, d โ€” deinterleave fields, placing one above the other
  • interleave, i โ€” interleave fields, reversing the effect of deinterleaving

Default value is none.

  • luma_swap, ls
  • chroma_swap, cs
  • alpha_swap, as

Swap luma/chroma/alpha fields. Exchanges even & odd lines. Default value is 0.

Commands

This filter supports all the above options as commands ๐Ÿ’…


inflate

Apply an inflate effect to the video.

This filter replaces the pixel with the local (3x3) average, but only counting values that are higher than the pixel itself. So it's a glow-up for the bright bits โœจ

It accepts the following options:

  • threshold0
  • threshold1
  • threshold2
  • threshold3

Limit the maximum change for each plane, default is 65535. If 0, that plane stays completely unchanged.

Commands

This filter supports all the above options as commands ๐Ÿซถ


interlace, interlace_vulkan

A simple interlacing filter for progressive content. It interleaves upper (or lower) lines from odd frames with lower (or upper) lines from even frames โ€” halving the frame rate and preserving image height ๐Ÿ“

             Original        Original             New Frame
             Frame 'j'      Frame 'j+1'             (tff)
            ==========      ===========       ==================
              Line 0  -------------------->    Frame 'j' Line 0
              Line 1          Line 1  ---->   Frame 'j+1' Line 1
              Line 2 --------------------->    Frame 'j' Line 2
              Line 3          Line 3  ---->   Frame 'j+1' Line 3
               ...             ...                   ...
          New Frame + 1 will be generated by Frame 'j+2' and Frame 'j+3' and so on

It accepts the following optional parameters:

  • scan โ€” decides whether the interlaced frame is taken from the even (tff โ€” the default) or odd (bff) lines of the progressive frame
  • lowpass โ€” vertical lowpass filter to avoid twitter interlacing and reduce moire patterns ๐ŸŒ€
    • 0, off โ€” disable vertical lowpass filter
    • 1, linear โ€” enable the linear filter (default)
    • 2, complex โ€” enable the complex filter. This reduces twitter and moire slightly less, but retains detail and the subjective impression of sharpness better ๐Ÿ‘‘

kerndeint

Deinterlace the input video by applying Donald Graft's adaptive kernel deinterling. It works on the interlaced parts of a video to produce progressive frames ๐Ÿ’€โœจ

The description of the accepted parameters follows.

  • thresh โ€” set the threshold that affects the filter's tolerance when deciding whether a pixel line must be processed. Must be an integer in the range [0,255] and defaults to 10. A value of 0 means the process gets applied to every pixel, go off ๐Ÿ˜ญ
  • map โ€” paint pixels exceeding the threshold value to white if set to 1. Default is 0.
  • order โ€” set the fields order. Swap fields if set to 1, leave fields alone if 0. Default is 0.
  • sharp โ€” enable additional sharpening if set to 1. Default is 0.
  • twoway โ€” enable twoway sharpening if set to 1. Default is 0.

Examples

  • Apply default values:
kerndeint=thresh=10:map=0:order=0:sharp=0:twoway=0
  • Enable additional sharpening:
kerndeint=sharp=1
  • Paint processed pixels in white:
kerndeint=map=1

kirsch

Apply the kirsch operator to the input video stream. Edge-detection vibes ๐Ÿ’…

The filter accepts the following option:

  • planes โ€” set which planes will be processed; unprocessed planes get copied. By default the value is 0xf, meaning all planes get processed
  • scale โ€” set the value that gets multiplied with the filtered result
  • delta โ€” set the value that gets added to the filtered result

Commands

This filter supports all the above options as commands ๐ŸŒˆ


lagfun

Slowly update darker pixels.

This filter makes short flashes of light appear longer. It accepts the following options:

  • decay โ€” set the factor for decaying. Default is .95. Allowed range is from 0 to 1
  • planes โ€” set which planes to filter. Default is all. Allowed range is from 0 to 15

Commands

This filter supports all the above options as commands ๐Ÿ’–


lenscorrection

Correct radial lens distortion ๐ŸŽ€

This filter fixes radial distortion like the kind you get from wide angle lenses, and re-rectifies the image that way. To find the right parameters, you can use tools like the ones in opencv โ€” or just do trial-and-error, honestly valid ๐Ÿ™ˆ. If you go the opencv route, use the calibration sample (under samples/cpp) from the opencv sources and pull the k1 and k2 coefficients out of the resulting matrix.

Heads up: effectively the same filter exists in the open-source tools Krita and Digikam from the KDE project, iykyk ๐Ÿงš

Also, versus the vignette filter (which can also be used to compensate for lens errors) โ€” this filter corrects the distortion of the image, whereas vignette corrects the brightness distribution. So in certain cases you might want both, though then you've gotta care about ordering: should vignetting be applied before or after lens correction? ๐Ÿ‘‘

Options

The filter accepts the following options:

  • cx โ€” relative x-coordinate of the focal point of the image, which is therefore the center of the distortion. Range is [0,1], expressed as fractions of the image width. Default is 0.5
  • cy โ€” relative y-coordinate of the focal point of the image, and therefore the center of the distortion. Range is [0,1], expressed as fractions of the image height. Default is 0.5
  • k1 โ€” coefficient of the quadratic correction term. Range is [-1,1]. 0 means no correction. Default is 0
  • k2 โ€” coefficient of the double quadratic correction term. Range is [-1,1]. 0 means no correction. Default is 0
  • i โ€” set the interpolation type. Can be nearest or bilinear. Default is nearest
  • fc โ€” specify the color of the unmapped pixels. For the syntax of this option, check the Color section in the ffmpeg-utils manual. Default color is black@0

The formula that generates the correction is:

r_src = r_tgt * (1 + k1 * (r_tgt / r_0)^2 + k2 * (r_tgt / r_0)^4)

where r_0 is halve of the image diagonal, and r_src and r_tgt are the distances from the focal point in the source and target images, respectively โœจ

Commands

This filter supports all the above options as commands ๐Ÿฆ‹


lensfun

Apply lens correction via the lensfun library (http://lensfun.sourceforge.net/).

The lensfun filter needs the camera make, camera model, and lens model to apply the lens correction. It loads the lensfun database and queries it to find the matching camera and lens entries. As long as those entries can be found with the options you gave it, the filter can perform corrections on frames ๐Ÿ’…

One thing: incomplete strings will make the filter choose the best match with the given options, and it'll output the chosen camera and lens models (logged at level info). But make, camera model, and lens model are required โ€” you gotta provide them, periodt. ๐Ÿ”ฅ

To get a list of available makes and models, just leave out one or both of the make and model options. The filter will dump the whole list to the log at level "INFO". First column = the make, second column = the model. To get a list of available lenses, set any values for make and model but leave out the lens_model option โ€” the filter sends the full lens list to the log at level "INFO" too. Heads up: the ffmpeg tool will exit after the list is printed. ๐Ÿ‘‹

The filter accepts the following options:

  • make โ€” the make of the camera (like "Canon"). This option is required, bestie, no skipping it.
  • model โ€” the model of the camera (like "Canon EOS 100D"). Also required.
  • lens_model โ€” the model of the lens (like "Canon EF-S 18-55mm f/3.5-5.6 IS STM"). Required too.
  • db_path โ€” the full path to the lens database folder. If you don't set it, the filter tries to load the database from the install path it had when the library was built. Default is unset.
  • mode โ€” what kind of correction to apply. Valid options are:
    • vignetting โ€” fixes lens vignetting.
    • geometry โ€” fixes lens geometry. This is the default.
    • subpixel โ€” fixes chromatic aberrations.
    • vig_geo โ€” fixes lens vignetting and lens geometry.
    • vig_subpixel โ€” fixes lens vignetting and chromatic aberrations.
    • distortion โ€” fixes both lens geometry and chromatic aberrations.
    • all โ€” enables every possible correction. everything everywhere all at once ๐Ÿ’…
  • focal_length โ€” the focal length of the image/video (zoom; expected constant for video). Say your lens is an 18โ€“55mm โ€” that's a focal length range of [18โ€“55], so pick a value in that range when you use that lens. Default 18.
  • aperture โ€” the aperture of the image/video (expected constant for video). Note that aperture is only used for vignetting correction. Default 3.5.
  • focus_distance โ€” the focus distance of the image/video (expected constant for video). Note that focus distance is only used for vignetting, and it only slightly affects the vignetting correction process. If you don't know it, just leave it at the default (which is 1000).
  • scale โ€” the scale factor applied after transformation. After correction the video isn't necessarily rectangular anymore, and this parameter controls how much of the resulting image is visible. A value of 0 means a value is chosen automatically such that there's little or no unmapped area in the output image. 1.0 means no additional scaling is done. Lower values may show more of the corrected image; higher values may avoid unmapped areas in the output.
  • target_geometry โ€” the target geometry of the output image/video. Valid options:
    • rectilinear (default)
    • fisheye
    • panoramic
    • equirectangular
    • fisheye_orthographic
    • fisheye_stereographic
    • fisheye_equisolid
    • fisheye_thoby
  • reverse โ€” apply the reverse of image correction (instead of correcting distortion, apply it). un-correcting, iconic honestly โœจ
  • interpolation โ€” the type of interpolation used when correcting distortion. Valid options:
    • nearest
    • linear (default)
    • lanczos

๐Ÿ“ธ Examples ๐Ÿ“ธ

  • Apply lens correction with make "Canon", camera model "Canon EOS 100D", and lens model "Canon EF-S 18-55mm f/3.5-5.6 IS STM" with focal length of "18" and aperture of "8.0".
ffmpeg -i input.mov -vf lensfun=make=Canon:model="Canon EOS 100D":lens_model="Canon EF-S 18-55mm f/3.5-5.6 IS STM":focal_length=18:aperture=8 -c:v h264 -b:v 8000k output.mov
  • Same as before, but only for the first 5 seconds of video. short and sweet ๐Ÿ“
ffmpeg -i input.mov -vf lensfun=make=Canon:model="Canon EOS 100D":lens_model="Canon EF-S 18-55mm f/3.5-5.6 IS STM":focal_length=18:aperture=8:enable='lte(t\,5)' -c:v h264 -b:v 8000k output.mov

๐ŸŒˆ lcevc ๐ŸŒˆ

Low Complexity Enhancement Video Codec filter, based on liblcevc_dec (https://github.com/v-novaltd/LCEVCdec). go off, enhancement layer ๐Ÿ’œ

๐Ÿ”ฎ libplacebo ๐Ÿ”ฎ

Flexible GPU-accelerated processing filter, based on libplacebo (https://code.videolan.org/videolan/libplacebo). this one is a whole entire vibe, buckle up ๐Ÿฆ‹

โœจ Options โœจ

The options for this filter are split into the following sections:

๐ŸŽจ Output mode ๐ŸŽจ

These options control the overall output mode. By default, libplacebo tries its very best to preserve the source colorimetry and size, but it will apply any embedded film grain, dolby vision metadata or anamorphic SAR that's present in the source frames. main character behavior, honestly ๐Ÿ‘‘

  • inputs โ€” set the number of inputs. Combined with the idx variable, this lets you place/blend multiple inputs inside the output frame. Basically it gives you hstack/overlay-ish powers. ๐Ÿซถ
  • w, h โ€” set the output video dimension expression. Default values are iw and ih. It allows the same expressions as the scale filter.
  • crop_x, crop_y โ€” set the input crop x/y expressions. Default values are (iw-cw)/2 and (ih-ch)/2.
  • crop_w, crop_h โ€” set the input crop width/height expressions. Default values are iw and ih.
  • pos_x, pos_y โ€” set the output placement x/y expressions. Default values are (ow-pw)/2 and (oh-ph)/2.
  • pos_w, pos_h โ€” set the output placement width/height expressions. Default values are ow and oh.
  • rotate โ€” rotate the input frame clockwise by the specified angle. Options are:
    • 0, 360
    • 90
    • 180
    • 270
  • fps โ€” set the output frame rate. Can be rational, e.g. 60000/1001. If you set it to the special string none (the default), input timestamps are passed through to the output unmodified instead. Otherwise the input video frames get interpolated as necessary to rescale the video to your target framerate, in a manner determined by the frame_mixer option.
  • format โ€” set the output format override. If unset (the default), frames come out in the same format as their respective input frames. Otherwise, format conversion happens.
  • force_original_aspect_ratio, force_divisible_by โ€” work exactly like the identical scale filter options. Note that force_divisible_by also works with fit_sense=constraint. slay โœจ
  • reset_sar โ€” if enabled, output frames always have a pixel aspect ratio of 1:1. If disabled (the default), any aspect ratio mismatches โ€” including ones from stuff like anamorphic video sources โ€” get forwarded to the output pixel aspect ratio.
  • normalize_sar โ€” like reset_sar, but instead of stretching the video content to fill the new output aspect ratio, the content is padded or cropped as necessary. Mutually exclusive with fit_mode. Disabled by default.
  • pad_crop_ratio โ€” specifies a ratio (between 0.0 and 1.0) between padding and cropping when the input aspect ratio doesn't match the output aspect ratio and normalize_sar is in effect. The default of 0.0 always pads the content with black borders, while 1.0 always crops off parts of the content. Intermediate values are possible, giving you a mix of both approaches. love a little duality ๐Ÿ’…
  • fit_mode โ€” specify the content fit strategy from a list of predefined modes. Determines how the input image is placed inside the destination crop rectangle (as defined by pos_x/y and pos_w/h). The names and their implementations are taken from the CSS 'object-fit' property. Note that this option is mutually exclusive with normalize_sar. Defaults to fill. Valid values:
    • fill โ€” stretch the input to the output rectangle, ignoring aspect ratio mismatches. Note that unless reset_sar is also enabled, the output still has the correct pixel aspect ratio tagged.
    • contain โ€” scale the input to fit inside the output, preserving aspect ratio by padding. Equivalent to normalize_sar with pad_crop_ratio set to 0.0.
    • cover โ€” scale the input to fill the output, preserving aspect ratio by cropping. Equivalent to normalize_sar with pad_crop_ratio set to 1.0.
    • none, place โ€” don't scale the input. It gets placed inside the output rectangle at its natural size, which may result in additional padding or cropping.
    • scale_down โ€” scale the input down as much as needed to fit inside the output. Equivalent to either contain or none, depending on whether the input is larger than the output or not.
  • fit_sense โ€” when fit_mode is in use, this option controls how the fit strategy is applied against the specified output resolution. Mutually exclusive with force_original_aspect_ratio. Valid values:
    • target โ€” the computed output resolution is taken as the exact size of the output frame. This is the default behavior.
    • constraint โ€” the computed output resolution is a size reference against which the fit mode is applied, enlarging or decreasing the true frame size as needed to fit the content.
  • fillcolor โ€” set the color used to fill the output area not covered by the output image, e.g. as a result of normalize_sar. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual. Defaults to black@0.
  • corner_rounding โ€” render frames with rounded corners. ๐ŸŽ€ The value, given as a float ranging from 0.0 to 1.0, indicates the relative degree of rounding, from fully square to fully circular. In other words, it's the radius divided by half the smaller side length. Defaults to 0.0.
  • lut โ€” specifies a custom LUT (in Adobe .cube format) to apply to the colors as part of color conversion. The exact interpretation depends on the value of lut_type.
  • lut_type โ€” controls the interpretation of color values fed to and from the LUT specified as lut. Valid values:
    • auto โ€” chooses the interpretation of the LUT automatically from tagged metadata, and otherwise falls back to native. (Default)
    • native โ€” applied to raw image contents in its native RGB colorspace (non-linear light), before conversion to the output color space.
    • normalized โ€” applied to the normalized RGB image contents, in linear light, before conversion to the output color space.
  • conversion โ€” this one straight-up replaces the whole conversion from the image color space to the output color space. no blending, no halfsies. if a LUT like this is present, it has top priority and overrides any ICC profiles, plus all the options related to tone mapping and output colorimetry (color_primaries, color_trc). it's giving main character energy, honestly ๐Ÿ’…
  • extra_opts โ€” pass extra libplacebo internal configuration options through. you give it a list of key=value pairs separated by :. the example below shows how to configure a custom filter kernel ("EWA LanczosSharp") and use it to double the input image resolution:
-vf "libplacebo=w=iw*2:h=ih*2:extra_opts='upscaler=custom\:upscaler_preset=ewa_lanczos\:upscaler_blur=0.9812505644269356'"
  • shader_cache โ€” file path of a cache directory that libplacebo will use to store and load cached shader objects. โš ๏ธ heads up: this cache is not cleaned up automatically. if the path does not end in a directory separator, the generated filenames will be effectively prefixed by the last path component. all directories must already exist. no cap.
-vf "libplacebo=shader_cache=/tmp/pl-shader-"
  • colorspace, color_primaries, color_trc, range, chroma_location โ€” configure the colorspace that output frames will be delivered in. the default value of "auto" outputs frames in the same format as the input frames, so literally no change. for any other value, conversion will be performed. โœจ

see the setparams filter for a list of possible values.

  • alpha_mode โ€” choose the desired output alpha mode, when the output format has an alpha channel. see the setparams filter for a list of possible values. ๐Ÿฆ‹
  • apply_filmgrain โ€” apply film grain (e.g. AV1 or H.274) if it's present in source frames, and strip it from the output. enabled by default.
  • apply_dolbyvision โ€” apply Dolby Vision RPU metadata if it's present in source frames, and strip it from the output. enabled by default. ๐Ÿ“Œ note: Dolby Vision will always output BT.2020+PQ, overriding the usual input frame metadata. these will also be picked as the values of "auto" for the respective frame output options.

so on top of the expression constants documented for the scale filter, the crop_w, crop_h, crop_x, crop_y, pos_w, pos_h, pos_x and pos_y options can also contain the following constants:

  • in_idx, idx โ€” the (0-based) numeric index of the currently active input stream.
  • crop_w, cw and crop_h, ch โ€” the computed values of crop_w and crop_h.
  • pos_w, pw and pos_h, ph โ€” the computed values of pos_w and pos_h.
  • in_t, t โ€” the input frame timestamp, in seconds. NAN if input timestamp is unknown.
  • out_t, ot โ€” the input frame timestamp, in seconds. NAN if input timestamp is unknown.
  • n โ€” the input frame number, starting with 0.

โœจ Scaling โœจ

the options in this section control how libplacebo performs upscaling and (if necessary) downscaling. ๐Ÿซถ real talk though: libplacebo will always internally operate on 4:4:4 content, so any sub-sampled chroma formats such as "yuv420p" will necessarily be upsampled and downsampled as part of the rendering process. that means scaling might be in effect even if the source and destination resolution are the same. yes bestie, even then ๐Ÿ˜ญ

  • upscaler, downscaler โ€” configure the filter kernel used for upscaling and downscaling. the respective defaults are "spline36" and "mitchell". for a full list of possible values, pass "help" to these options. the most important values are:
    • none โ€” forces the use of built-in GPU texture sampling (typically bilinear). extremely fast but poor quality, especially when downscaling. ๐Ÿ’€
    • bilinear โ€” bilinear interpolation. can generally be done for free on GPUs, except when doing so would lead to aliasing. fast and low quality.
    • nearest โ€” nearest-neighbour interpolation. sharp but highly aliasing.
    • oversample โ€” algorithm that looks visually similar to nearest-neighbour interpolation but tries to preserve pixel aspect ratio. good for pixel art, since it results in minimal distortion of the artistic appearance. ๐ŸŽ€
    • lanczos โ€” standard sinc-sinc interpolation kernel.
    • spline36 โ€” cubic spline approximation of lanczos. no difference in performance, but has very slightly less ringing.
    • ewa_lanczos โ€” elliptically weighted average version of lanczos, based on a jinc-jinc kernel. this is also popularly referred to as just "Jinc scaling". slow but very high quality. ๐Ÿ‘‘
    • gaussian โ€” Gaussian kernel. has certain ideal mathematical properties, but subjectively very blurry.
    • mitchell โ€” cubic BC spline with parameters recommended by Mitchell and Netravali. very little ringing.
  • frame_mixer โ€” controls the kernel used for mixing frames temporally. the default value is "none", which disables frame mixing. for a full list of possible values, pass "help" to this option. the most important values are:
    • none โ€” disables frame mixing, giving a result equivalent to "nearest neighbour" semantics.
    • oversample โ€” oversamples the input video to create a "Smooth Motion"-type effect: if an output frame would exactly fall on the transition between two video frames, it is blended according to the relative overlap. this is the recommended option whenever preserving the original subjective appearance is desired. ๐ŸŒธ
    • mitchell_clamp โ€” larger filter kernel that smoothly interpolates multiple frames in a manner designed to eliminate ringing and other artefacts as much as possible. this is the recommended option wherever maximum visual smoothness is desired.
    • linear โ€” linear blend/fade between frames. especially useful for constructing e.g. slideshows.
  • antiringing โ€” enables anti-ringing (for non-EWA filters). the value (between 0.0 and 1.0) configures the strength of the anti-ringing algorithm. โš ๏ธ may increase aliasing if set too high. disabled by default.
  • sigmoid โ€” enable sigmoidal compression during upscaling. reduces ringing slightly. enabled by default.

๐Ÿฆ‹ Deinterlacing ๐Ÿฆ‹

deinterlacing is automatically supported when frames are tagged as interlaced, however frames are not deinterlaced unless a deinterlacing algorithm is chosen. iykyk ๐ŸŒˆ

  • deinterlace โ€” the deinterlacing algorithm to use. pick one:
    • weave โ€” no deinterlacing, weave fields together into a single frame. this is the default.
    • bob โ€” naive bob deinterlacing, simply repeat each field line twice.
    • yadif โ€” yet another deinterlacing filter. see the yadif filter for more details.
    • bwdif โ€” bob weaver deinterlacing filter. see the bwdif filter for more details.
  • skip_spatial_check โ€” skip the spatial deinterlacing check when using "yadif" deinterlacing.
  • send_fields โ€” output a frame for each field, rather than for each frame. note that this will always double the tagged output frame rate, even if the input does not contain any interlaced frames. disabled by default.

๐ŸŒˆ Debanding ๐ŸŒˆ

libplacebo comes with a built-in debanding filter that is genuinely good at counteracting many common sources of banding and blocking. turning this on is highly recommended whenever quality is desired. obsessed, honestly ๐Ÿซถ

  • deband โ€” enable (fast) debanding algorithm. disabled by default.
  • deband_iterations โ€” number of deband iterations of the debanding algorithm. each iteration is performed with progressively increased radius (and diminished threshold). recommended values are in the range 1 to 4. defaults to 1.
  • deband_threshold โ€” debanding filter strength. higher numbers lead to more aggressive debanding. defaults to 4.0.
  • deband_radius โ€” debanding filter radius. a higher radius is better for slow gradients, while a lower radius is better for steep gradients. defaults to 16.0.
  • deband_grain โ€” amount of extra output grain to add. helps hide imperfections. defaults to 6.0.

๐Ÿ’… Color adjustment ๐Ÿ’…

a whole collection of subjective color controls. not very rigorous, so the exact effect will vary somewhat depending on the input primaries and colorspace. it's giving vibes-based color science, and that's fine ๐Ÿ’œ

  • brightness โ€” brightness boost, between -1.0 and 1.0. defaults to 0.0.
  • contrast โ€” contrast gain, between 0.0 and 16.0. defaults to 1.0.
  • saturation โ€” saturation gain, between 0.0 and 16.0. defaults to 1.0.
  • hue โ€” hue shift in radians, between -3.14 and 3.14. defaults to 0.0. this will rotate the UV subvector, defaulting to BT.709 coefficients for RGB inputs.
  • gamma โ€” gamma adjustment, between 0.0 and 16.0. defaults to 1.0.
  • temperature โ€” color temperature adjustment. lower values make the output warmer/redder, down to 1667, while higher values make the output cooler/bluer, up to 25000. defaults to 6500 (neutral white). ๐Ÿ”ฅ
  • cones โ€” cone model to use for color blindness simulation. accepts any combination of "l", "m" and "s". here are some examples:
    • m โ€” Deuteranomaly / deuteranopia (affecting 3%-4% of the population)
    • l โ€” Protanomaly / protanopia (affecting 1%-2% of the population)
    • l+m โ€” Monochromacy (very rare)
    • l+m+s โ€” Achromatopsy (complete loss of daytime vision, extremely rare)
  • cone-strength โ€” gain factor for the cones specified by "cones", between 0.0 and 10.0. a value of 1.0 results in no change to color vision. a value of 0.0 (the default) simulates complete loss of those cones. values above 1.0 result in exaggerating the differences between cones, which may help compensate for reduced color vision.

โญ Peak detection โญ

to help deal with sources that only have static HDR10 metadata (or no tagging whatsoever), libplacebo uses its own internal frame analysis compute shader to analyze source frames and adapt the tone mapping function in realtime. if this is too slow, or if exactly reproducible frame-perfect results are needed, it's recommended to turn this feature off. ๐Ÿ™ˆ

  • peak_detect โ€” enable HDR peak detection. ignores static MaxCLL/MaxFALL values in favor of dynamic detection from the input. ๐Ÿ“Œ note that the detected values do not get written back to the output frames, they merely guide the internal tone mapping process. enabled by default.
  • smoothing_period โ€” Peak-detection smoothing period, between 0.0 and 1000.0. Higher values mean peak detection gets less responsive to changes in the input. Defaults to 20.0. Lowkey smoother vibes.
  • scene_threshold_low, scene_threshold_high โ€” Lower and upper thresholds for scene-change detection, fr fr. Expressed on a logarithmic scale between 0.0 and 100.0. Default to 1.0 and 3.0, respectively. Setting either one to a negative value disables this functionality entirely.
  • percentile โ€” Which percentile of the frame-brightness histogram gets used as the source peak for tone-mapping. Defaults to 99.995, a pretty conservative value. Setting this to 100.0 disables frame histogram measurement and instead uses the true peak brightness for tone-mapping. ๐Ÿ’…

๐ŸŽจ Tone mapping ๐ŸŽจ

The options in this section control how libplacebo performs tone-mapping and gamut-mapping when there's a mismatch with wide-gamut or HDR content. In general, libplacebo relies on accurate source tagging and mastering-display gamut information to produce the best results. So tag your stuff correctly, bestie โ€” it's giving "trust the metadata." โœจ

  • gamut_mode โ€” How to handle out-of-gamut colors that can occur as a result of colorimetric gamut mapping. Options include:
    • clip โ€” Do nothing, just clip out-of-range colors to the RGB volume. Low quality but extremely fast.
    • perceptual โ€” Perceptually soft-clip colors to the gamut volume. This is the default.
    • relative โ€” Relative colorimetric hard-clip. Similar to perceptual but without the soft knee.
    • saturation โ€” Saturation mapping, maps primaries directly to primaries in RGB space. Not recommended except for artificial computer graphics where a bright, saturated display is desired.
    • absolute โ€” Absolute colorimetric hard-clip. Performs no adjustment of the white point.
    • desaturate โ€” Hard-desaturates out-of-gamut colors towards white while preserving luminance. Has a tendency to distort the visual appearance of bright objects.
    • darken โ€” Linearly reduces content brightness to preserve saturated details, then clips whatever out-of-gamut colors remain.
    • warn โ€” Highlight out-of-gamut pixels by inverting/marking them.
    • linear โ€” Linearly reduces chromaticity of the entire image to make it fit within the target color volume. Be careful when using this on BT.2020 sources without proper mastering metadata, because doing so will lead to excessive desaturation. โš ๏ธ
  • tonemapping โ€” Tone-mapping algorithm to use. Available values are:
    • auto โ€” Automatic selection based on internal heuristics. This is the default.
    • clip โ€” Performs no tone-mapping, just clips out-of-range colors. Retains perfect color accuracy for in-range colors but completely destroys out-of-range information. Does not perform any black point adaptation. Not configurable.
    • st2094-40 โ€” EETF from SMPTE ST 2094-40 Annex B, which applies the Bezier curves from HDR10+ dynamic metadata based on Bezier curves to perform tone-mapping. The OOTF used is adjusted based on the ratio between the targeted and actual display peak luminances.
    • st2094-10 โ€” EETF from SMPTE ST 2094-10 Annex B.2, which takes into account the input signal average luminance in addition to the maximum/minimum. The configurable contrast parameter influences the slope of the linear output segment, defaulting to 1.0 for no increase/decrease in contrast. Note that this does not currently include the subjective gain/offset/gamma controls defined in Annex B.3.
    • bt.2390 โ€” EETF from the ITU-R Report BT.2390, a hermite spline roll-off with linear segment. The knee point offset is configurable. Note that this parameter defaults to 1.0, rather than the value of 0.5 from the ITU-R spec.
    • bt.2446a โ€” EETF from ITU-R Report BT.2446, method A. Designed for well-mastered HDR sources. Can be used for both forward and inverse tone mapping. Not configurable.
    • spline โ€” Simple spline consisting of two polynomials, joined by a single pivot point. The parameter gives the pivot point in PQ space, defaulting to 0.30. Can be used for both forward and inverse tone mapping.
    • reinhard โ€” Simple non-linear, global tone mapping algorithm. The parameter specifies the local contrast coefficient at the display peak. Essentially, a parameter of 0.5 implies that the reference white will be about half as bright as when clipping. Defaults to 0.5, which results in the simplest formulation of this function.
    • mobius โ€” Generalization of the reinhard tone mapping algorithm to support an additional linear slope near black. The tone mapping parameter indicates the trade-off between the linear section and the non-linear section. Essentially, for a given parameter x, every color value below x will be mapped linearly, while higher values get non-linearly tone-mapped. Values near 1.0 make this curve behave like clip, while values near 0.0 make this curve behave like reinhard. The default value is 0.3, which provides a good balance between colorimetric accuracy and preserving out-of-gamut details.
    • hable โ€” Piece-wise, filmic tone-mapping algorithm developed by John Hable for use in Uncharted 2, inspired by a similar tone-mapping algorithm used by Kodak. Popularized by its use in video games with HDR rendering. Preserves both dark and bright details very well, but comes with the drawback of changing the average brightness quite significantly. This is sort of similar to reinhard with parameter 0.24.
    • gamma โ€” Fits a gamma (power) function to transfer between the source and target color spaces, effectively resulting in a perceptual hard-knee joining two roughly linear sections. This preserves details at all scales fairly accurately, but can result in an image with a muted or dull appearance. The parameter is used as the cutoff point, defaulting to 0.5.
    • linear โ€” Linearly stretches the input range to the output range, in PQ space. This will preserve all details accurately, but results in a significantly different average brightness. Can be used for inverse tone-mapping in addition to regular tone-mapping. The parameter can be used as an additional linear gain coefficient, defaulting to 1.0.
  • tonemapping_param โ€” For tunable tone mapping functions, this parameter can be used to fine-tune the curve behavior. Refer to the documentation of tonemapping. The default value of 0.0 is replaced by the curve's preferred default setting.
  • inverse_tonemapping โ€” If enabled, this filter will also attempt stretching SDR signals to fill HDR output color volumes. Disabled by default.
  • tonemapping_lut_size โ€” Size of the tone-mapping LUT, between 2 and 1024. Defaults to 256. Note that this figure is squared when combined with peak_detect.
  • contrast_recovery โ€” Contrast recovery strength. If set to a value above 0.0, the source image will be divided into high-frequency and low-frequency components, and a portion of the high-frequency image is added back onto the tone-mapped output. May cause excessive ringing artifacts for some HDR sources, but can improve the subjective sharpness and detail left over in the image after tone-mapping. Defaults to 0.30.
  • contrast_smoothness โ€” Contrast recovery lowpass kernel size. Defaults to 3.5. Increasing or decreasing this will affect the visual appearance substantially. Has no effect when contrast_recovery is disabled.

๐ŸŒˆ Dithering ๐ŸŒˆ

By default, libplacebo will dither whenever necessary, which includes rendering to any integer format below 16-bit precision. It's recommended to always leave this on, because not doing so may result in visible banding in the output, even if the debanding filter is enabled. If maximum performance is needed, use ordered_fixed instead of disabling dithering. ๐ŸŽ€

  • dithering โ€” Dithering method to use. Accepts the following values:
    • none โ€” Disables dithering completely. May result in visible banding.
    • blue โ€” Dither with pseudo-blue noise. This is the default.
    • ordered โ€” Tunable ordered dither pattern.
    • ordered_fixed โ€” Faster ordered dither with a fixed size of 6. Texture-less.
    • white โ€” Dither with white noise. Texture-less.
  • dither_lut_size โ€” Dither LUT size, as log base2 between 1 and 8. Defaults to 6, corresponding to a LUT size of 64x64.
  • dither_temporal โ€” Enables temporal dithering. Disabled by default.

๐Ÿงš Custom shaders ๐Ÿงš

libplacebo supports a number of custom shaders based on the mpv .hook GLSL syntax. A collection of such shaders can be found here: https://github.com/mpv-player/mpv/wiki/User-Scripts#user-shaders

A full description of the mpv shader format is beyond the scope of this section, but a summary can be found here: https://mpv.io/manual/master/#options-glsl-shader

  • custom_shader_path โ€” Specifies a path to a custom shader file to load at runtime.
  • custom_shader_bin โ€” Specifies a complete custom shader as a raw string.

๐Ÿ› ๏ธ Debugging / performance ๐Ÿ› ๏ธ

All of the options in this section default off. They may be of assistance when attempting to squeeze the maximum performance at the cost of quality. Main-character speedrun energy, but make it pixels. ๐Ÿ”ฅ

  • skip_aa โ€” Disable anti-aliasing when downscaling.
  • disable_linear โ€” Disable linear light scaling.
  • disable_builtin โ€” Disable built-in GPU sampling, forcing LUT.
  • disable_fbos โ€” Forcibly disable FBOs, resulting in loss of almost all functionality, but offering the maximum possible speed.

๐Ÿ•น๏ธ Commands ๐Ÿ•น๏ธ

This filter supports almost all of the above options as commands.

๐ŸŒŸ Examples ๐ŸŒŸ

  • Tone-map input to standard gamut BT.709 output:
libplacebo=colorspace=bt709:color_primaries=bt709:color_trc=bt709:range=tv
  • Rescale input to fit into standard 1080p, with high quality scaling:
libplacebo=w=1920:h=1080:force_original_aspect_ratio=decrease:normalize_sar=true:upscaler=ewa_lanczos:downscaler=ewa_lanczos
  • Interpolate low FPS / VFR input to smoothed constant 60 fps output:
libplacebo=fps=60:frame_mixer=mitchell_clamp
  • Convert input to standard sRGB JPEG:
libplacebo=format=yuv420p:colorspace=bt470bg:color_primaries=bt709:color_trc=iec61966-2-1:range=pc
  • Use higher quality debanding settings:
libplacebo=deband=true:deband_iterations=3:deband_radius=8:deband_threshold=6
  • Run this filter on the CPU, on systems with Mesa installed (and with the most expensive options disabled):
ffmpeg ... -init_hw_device vulkan:llvmpipe ... -vf libplacebo=upscaler=none:downscaler=none:peak_detect=false
  • Suppress CPU-based AV1/H.274 film grain application in the decoder, in favor of doing it with this filter. Note that this is only a gain if the frames are either already on the GPU, or if you're using libplacebo for other purposes, since otherwise the VRAM roundtrip will more than offset any expected speedup.
ffmpeg -export_side_data +film_grain ... -vf libplacebo=apply_filmgrain=true
  • Interop with VAAPI hwdec to avoid round-tripping through RAM:
ffmpeg -init_hw_device vulkan -hwaccel vaapi -hwaccel_output_format vaapi ... -vf libplacebo

libvmaf ๐Ÿ’–

Calculate the VMAF (Video Multi-Method Assessment Fusion) score for a reference/distorted pair of input videos. Iconic metric behavior, no cap.

The first input is the distorted video, and the second input is the reference video.

The obtained VMAF score is printed through the logging system.

It requires Netflix's vmaf library (libvmaf) as a pre-requisite. After installing the library it can be enabled using: ./configure --enable-libvmaf.

The filter has following options:

  • model โ€” A | delimited list of vmaf models. Each model can be configured with a number of parameters. Default value: version=vmaf_v0.6.1.
  • feature โ€” A | delimited list of features. Each feature can be configured with a number of parameters.
  • log_path โ€” Set the file path to be used to store log files.
  • log_fmt โ€” Set the format of the log file (xml, json, csv, or sub).
  • pool โ€” Set the pool method to be used for computing vmaf. Options are min, harmonic_mean or mean (default).
  • n_threads โ€” Set number of threads to be used when initializing libvmaf. Default value: 0, no threads.
  • n_subsample โ€” Set frame subsampling interval to be used.

This filter also supports the framesync options.

Examples ๐ŸŽ€

  • In the examples below, a distorted video distorted.mpg is compared with a reference file reference.mpg.
  • Basic usage:
ffmpeg -i distorted.mpg -i reference.mpg -lavfi libvmaf=log_path=output.xml -f null -
  • Example with multiple models:
ffmpeg -i distorted.mpg -i reference.mpg -lavfi libvmaf='model=version=vmaf_v0.6.1\\:name=vmaf|version=vmaf_v0.6.1neg\\:name=vmaf_neg' -f null -
  • Example with multiple additional features:
ffmpeg -i distorted.mpg -i reference.mpg -lavfi libvmaf='feature=name=psnr|name=ciede' -f null -
  • Example with options and different containers:
ffmpeg -i distorted.mpg -i reference.mkv -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]libvmaf=log_fmt=json:log_path=output.json" -f null -

libvmaf_cuda โšก

This is the CUDA variant of the libvmaf filter. It only accepts CUDA frames.

It requires Netflix's vmaf library (libvmaf) as a pre-requisite. After installing the library it can be enabled using: ./configure --enable-nonfree --enable-ffnvcodec --enable-libvmaf.

Examples ๐Ÿฆ‹

  • Basic usage showing CUVID hardware decoding and CUDA scaling with scale_cuda:
ffmpeg \
    -hwaccel cuda -hwaccel_output_format cuda -codec:v av1_cuvid -i dis.obu \
    -hwaccel cuda -hwaccel_output_format cuda -codec:v av1_cuvid -i ref.obu \
    -filter_complex "
        [0:v]scale_cuda=format=yuv420p[dis]; \
        [1:v]scale_cuda=format=yuv420p[ref]; \
        [dis][ref]libvmaf_cuda=log_fmt=json:log_path=output.json
    " \
    -f null -

limitdiff โœจ

Apply limited difference filter using second and optionally third video stream.

The filter accepts the following options:

  • threshold โ€” Set the threshold to use when allowing certain differences between video streams. Any absolute difference value lower or exact than this threshold will pick pixel components from first video stream.
  • elasticity โ€” Set the elasticity of soft thresholding when processing video streams. This value multiplied with first one sets second threshold. Any absolute difference value greater or exact than second threshold will pick pixel components from second video stream. For values between those two threshold linear interpolation between first and second video stream will be used.
  • reference โ€” Enable the reference (third) video stream processing. By default is disabled. If set, this video stream will be used for calculating absolute difference with first video stream.
  • planes โ€” Specify which planes will be processed. Defaults to all available.

Commands ๐Ÿ’…

This filter supports the all above options as commands except option reference.

limiter</promise> ๐Ÿ“

Limits the pixel components values to the specified range [min, max].

The filter accepts the following options:

  • min โ€” Lower bound. Defaults to the lowest allowed value for the input.
  • max โ€” Upper bound. Defaults to the highest allowed value for the input.
  • planes โ€” Specify which planes will be processed. Defaults to all available.

Commands ๐Ÿ’…

This filter supports the all above options as commands.

loop ๐Ÿ”

Loop video frames.

The filter accepts the following options:

  • loop โ€” Set the number of loops. Setting this value to -1 will result in infinite loops. Default is 0.
  • size โ€” Set maximal size in number of frames. Default is 0.
  • start โ€” Set first frame of loop. Default is 0.
  • time โ€” Set the time of loop start in seconds. Only used if option named start is set to -1.

Examples ๐ŸŒธ

  • Loop single first frame infinitely:
loop=loop=-1:size=1:start=0
  • Loop single first frame 10 times:
loop=loop=10:size=1:start=0
  • Loop 10 first frames 5 times:
loop=loop=5:size=10:start=0

lut1d ๐ŸŽจ

Apply a 1D LUT to an input video.

The filter accepts the following options:

  • file โ€” Set the 1D LUT file name.

Currently supported formats:

  • cube โ€” Iridas
  • csp โ€” cineSpace
  • interp โ€” Select interpolation mode.

Available values are:

  • nearest โ€” Use values from the nearest defined point.
  • linear โ€” Interpolate values using the linear interpolation.
  • cosine โ€” Interpolate values using the cosine interpolation.
  • cubic โ€” Interpolate values using the cubic interpolation.
  • spline โ€” Interpolate values using the spline interpolation.

Commands ๐Ÿ’…

This filter supports the all above options as commands.

lut3d ๐Ÿงš

Apply a 3D LUT to an input video.

The filter accepts the following options:

  • file โ€” Set the 3D LUT file name.

Currently supported formats:

  • 3dl โ€” AfterEffects
  • cube โ€” Iridas
  • dat โ€” DaVinci
  • m3d โ€” Pandora
  • csp โ€” cineSpace
  • interp โ€” Select interpolation mode.

Available values are:

  • nearest โ€” Use values from the nearest defined point.
  • trilinear โ€” Interpolate values using the 8 points defining a cube.
  • tetrahedral โ€” Interpolate values using a tetrahedron.
  • pyramid โ€” Interpolate values using a pyramid.
  • prism โ€” Interpolate values using a prism.

Commands ๐Ÿ’…

This filter supports the interp option as commands.

lumakey ๐Ÿ”‘

Turn certain luma values into transparency.

The filter accepts the following options:

  • threshold โ€” Set the luma which will be used as base for transparency. Default value is 0.
  • tolerance โ€” Set the range of luma values to be keyed out. Default value is 0.01.
  • softness โ€” Set the range of softness. Default value is 0. Use this to control gradual transition from zero to full transparency.

Commands ๐Ÿ’…

This filter supports same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value.

lut, lutrgb, lutyuv ๐ŸŒˆ

Compute a look-up table for binding each pixel component input value to an output value, and apply it to the input video.

lutyuv applies a lookup table to a YUV input video, lutrgb to an RGB input video.

These filters accept the following parameters:

  • c0 โ€” set first pixel component expression
  • c1 โ€” set second pixel component expression
  • c2 โ€” set third pixel component expression
  • c3 โ€” set fourth pixel component expression, corresponds to the alpha component
  • r โ€” set red component expression
  • g โ€” set green component expression
  • b โ€” set blue component expression
  • a โ€” alpha component expression
  • y โ€” set Y/luma component expression
  • u โ€” set U/Cb component expression
  • v โ€” set V/Cr component expression

Each of them specifies the expression to use for computing the lookup table for the corresponding pixel component values.

The exact component associated to each of the c* options depends on the format in input.

The lut filter requires either YUV or RGB pixel formats in input, lutrgb requires RGB pixel formats in input, and lutyuv requires YUV.

The expressions can contain the following constants and functions:

  • w, h โ€” The input width and height.
  • val โ€” The input value for the pixel component.
  • clipval โ€” The input value, clipped to the minval-maxval range.
  • maxval โ€” The maximum value for the pixel component.
  • minval โ€” The minimum value for the pixel component.
  • negval โ€” The negated value for the pixel component value, clipped to the minval-maxval range; it corresponds to the expression maxval-clipval+minval.
  • clip(val) โ€” The computed value in val, clipped to the minval-maxval range.
  • gammaval(gamma) โ€” The computed gamma correction value of the pixel component value, clipped to the minval-maxval range. It corresponds to the expression pow((clipval-minval)/(maxval-minval)\,gamma)*(maxval-minval)+minval

All expressions default to clipval.

Commands ๐Ÿ’…

This filter supports same commands as options.

Examples ๐Ÿซถ

  • Negate input video:
  • Negate the whole RGB thing by hand, literally spelling out every channel:
lutrgb="r=maxval+minval-val:g=maxval+minval-val:b=maxval+minval-val"
lutyuv="y=maxval+minval-val:u=maxval+minval-val:v=maxval+minval-val"

And bestieโ€ฆ that whole thing up there? It's the exact same as just saying:

lutrgb="r=negval:g=negval:b=negval"
lutyuv="y=negval:u=negval:v=negval"

like why do the long way, we love a shortcut ๐Ÿ’…

  • Negate just the luma, keep everything else vibing:
lutyuv=y=negval
  • Yeet the chroma, and boom โ€” graytone image:
lutyuv="u=128:v=128"
  • Luma burn effect (yes it's giving ~aesthetic~):
lutyuv="y=2*val"
  • Remove green and blue, you get whatever's left:
lutrgb="g=0:b=0"
  • Slap a constant alpha channel on the input:
format=rgba,lutrgb=a="maxval-minval/2"
  • Fix that luma gamma by a factor of 0.5:
lutyuv=y=gammaval(0.5)
  • Throw away the least significant bits of luma:
lutyuv=y='bitand(val, 128+64+32)'
  • Technicolor vibe โ€” highkey iconic:
lutyuv=u='(val-maxval/2)*2+maxval/2':v='(val-maxval/2)*2+maxval/2'

โœจ lut2, tlut2 โœจ

Okay so the lut2 filter takes two input streams and outputs one stream. Two in, one out, a whole situationship ๐Ÿซถ

The tlut2 filter โ€” that's the "time lut2" one โ€” takes two consecutive frames from one single stream.

This filter accepts the following parameters:

  • c0 โ€” set first pixel component expression
  • c1 โ€” set second pixel component expression
  • c2 โ€” set third pixel component expression
  • c3 โ€” set fourth pixel component expression, corresponds to the alpha component
  • d โ€” set output bit depth, only available for the lut2 filter. By default it's 0, which means the bit depth is automatically picked from the first input format.

The lut2 filter also supports the framesync options.

Each of them specifies the expression to use for computing the lookup table for the corresponding pixel component values.

The exact component associated to each of the c* options depends on the format in inputs. (Yes, it's giving "it depends" but that's literally how it is ๐Ÿ˜ญ)

The expressions can contain the following constants:

  • w, h โ€” the input width and height.
  • x โ€” the first input value for the pixel component.
  • y โ€” the second input value for the pixel component.
  • bdx โ€” the first input video bit depth.
  • bdy โ€” the second input video bit depth.

All expressions default to x.

Commands

This filter supports the all above options as commands โ€” except option d. Rude of d, honestly, but that's the rules.

Examples

  • Highlight the differences between two RGB video streams:
lut2='ifnot(x-y,0,pow(2,bdx)-1):ifnot(x-y,0,pow(2,bdx)-1):ifnot(x-y,0,pow(2,bdx)-1)'
  • Highlight the differences between two YUV video streams:
lut2='ifnot(x-y,0,pow(2,bdx)-1):ifnot(x-y,pow(2,bdx-1),pow(2,bdx)-1):ifnot(x-y,pow(2,bdx-1),pow(2,bdx)-1)'
  • Show the max difference between two video streams:
lut2='if(lt(x,y),0,if(gt(x,y),pow(2,bdx)-1,pow(2,bdx-1))):if(lt(x,y),0,if(gt(x,y),pow(2,bdx)-1,pow(2,bdx-1))):if(lt(x,y),0,if(gt(x,y),pow(2,bdx)-1,pow(2,bdx-1)))'

โœจ maskedclamp โœจ

Clamp the first input stream with the second input and third input stream. Three streams, one little clamp party ๐ŸŽ€

Returns the value of first stream to be between second input stream - undershoot and third input stream + overshoot.

This filter accepts the following options:

  • undershoot โ€” default value is 0.
  • overshoot โ€” default value is 0.
  • planes โ€” set which planes will be processed as bitmap, unprocessed planes will be copied from first stream. By default value 0xf, all planes will be processed.

Commands

This filter supports the all above options as commands. Slay ๐Ÿ’…


โœจ maskedmax โœจ

Merge the second and third input stream into output stream using absolute differences between second input stream and first input stream, and absolute difference between third input stream and first input stream.

The picked value will be from second input stream if second absolute difference is greater than first one โ€” or from third input stream otherwise.

This filter accepts the following options:

  • planes โ€” set which planes will be processed as bitmap, unprocessed planes will be copied from first stream. By default value 0xf, all planes will be processed.

Commands

This filter supports the all above options as commands. ๐Ÿ’–


โœจ maskedmerge โœจ

Merge the first input stream with the second input stream using per pixel weights in the third input stream.

A value of 0 in the third stream pixel component means that pixel component from first stream is returned unchanged, while maximum value (eg. 255 for 8-bit videos) means that pixel component from second stream is returned unchanged. Intermediate values define the amount of merging between both input stream's pixel components.

So likeโ€ฆ third stream is the DJ deciding the blend. Very main character of it ๐ŸŽง

This filter accepts the following options:

  • planes โ€” set which planes will be processed as bitmap, unprocessed planes will be copied from first stream. By default value 0xf, all planes will be processed.

Commands

This filter supports the all above options as commands. โœจ


โœจ maskedmin โœจ

Merge the second and third input stream into output stream using absolute differences between second input stream and first input stream, and absolute difference between third input stream and first input stream.

The picked value will be from second input stream if second absolute difference is less than first one โ€” or from third input stream otherwise. (Yeah it's maskedmax's less chaotic sibling, lt where the other one had gt ๐Ÿ˜Œ)

This filter accepts the following options:

  • planes โ€” set which planes will be processed as bitmap, unprocessed planes will be copied from first stream. By default value 0xf, all planes will be processed.

Commands

This filter supports the all above options as commands. ๐Ÿ’œ


โœจ maskedthreshold โœจ

Pick pixels comparing absolute difference of two video streams with a fixed threshold. Vibe check, but for pixels ๐Ÿ”

If absolute difference between pixel component of first and second video stream is equal or lower than user supplied threshold, then pixel component from first video stream is picked โ€” otherwise pixel component from second video stream is picked.

This filter accepts the following options:

  • threshold โ€” set threshold used when picking pixels from absolute difference from two input video streams.
  • planes โ€” set which planes will be processed as bitmap, unprocessed planes will be copied from second stream. By default value 0xf, all planes will be processed.
  • mode โ€” set mode of filter operation. Can be abs or diff. Default is abs.

Commands

This filter supports the all above options as commands. ๐Ÿ”ฅ


โœจ maskfun โœจ

Create a mask from input video.

For example it is useful to create motion masks after the tblend filter. Like, genuinely useful, not just cute ๐Ÿ˜Œ

This filter accepts the following options:

  • low โ€” set low threshold. Any pixel component lower or exact than this value will be set to 0.
  • high โ€” set high threshold. Any pixel component higher than this value will be set to max value allowed for current pixel format.
  • planes โ€” set planes to filter, by default all available planes are filtered.
  • fill โ€” fill all frame pixels with this value.
  • sum โ€” set max average pixel value for frame. If sum of all pixel components is higher than this average, output frame will be completely filled with value set by fill option. Typically useful for scene changes when used in combination with tblend filter.

Commands

This filter supports the all above options as commands. ๐Ÿฆ‹


โœจ mcdeint โœจ

Apply motion-compensation deinterlacing.

It needs one field per frame as input, so it must thus be used together with yadif=1/3 or equivalent. You can't just throw it at anything, bestie, it has needs ๐Ÿซถ

This filter accepts the following options:

  • mode โ€” set the deinterlacing mode.

It accepts one of the following values:

  • fast
  • medium
  • slow โ€” use iterative motion estimation
  • extra_slow โ€” like slow, but use multiple reference frames.

Default value is fast.

  • parity โ€” set the picture field parity assumed for the input video. It must be one of the following values:
    • 0, tff โ€” assume top field first
    • 1, bff โ€” assume bottom field first

Default value is bff.

  • qp โ€” set per-block quantization parameter (QP) used by the internal encoder.

Higher values should result in a smoother motion vector field but less optimal individual vectors. Default value is 1.


โœจ median โœจ

Pick median pixel from certain rectangle defined by radius. It's giving "middle child energy" and honestly? Same ๐ŸŒธ

This filter accepts the following options:

  • radius โ€” set horizontal radius size. Default value is 1. Allowed range is integer from 1 to 127.
  • planes โ€” set which planes to process. Default is 15, which is all available planes.
  • radiusV โ€” set vertical radius size. Default value is 0. Allowed range is integer from 0 to 127. If it is 0, value will be picked from horizontal radius option.
  • percentile โ€” set median percentile. Default value is 0.5. Default value of 0.5 will pick always median values, while 0 will pick minimum values, and 1 maximum values.

Commands

This filter supports same commands as options. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value. No dramatic exits, it just stays put ๐Ÿ˜ญ


โœจ mergeplanes โœจ

Merge color channel components from several video streams. Mix and match, it's a whole color-channel meet-cute ๐ŸŽ€

The filter accepts up to 4 input streams, and merges selected input planes to the output video.

This filter accepts the following options:

  • mapping โ€” set input to output plane mapping. Default is 0.

The mappings is specified as a bitmap. It should be specified as a hexadecimal number in the form 0xAa[Bb[Cc[Dd]]]. Aa describes the mapping for the first plane of the output stream. A sets the number of the input stream to use (from 0 to 3), and a the plane number of the corresponding input to use (from 0 to 3). The rest of the mappings is similar: Bb describes the mapping for the output stream second plane, Cc describes the mapping for the output stream third plane and Dd describes the mapping for the output stream fourth plane.

  • format โ€” set output pixel format. Default is yuva444p.
  • map0s, map1s, map2s, map3s โ€” set input to output stream mapping for output Nth plane. Default is 0.
  • map0p, map1p, map2p, map3p โ€” set input to output plane mapping for output Nth plane. Default is 0.

Examples

  • Merge three gray video streams of same width and height into a single video stream:
[a0][a1][a2]mergeplanes=0x001020:yuv444p
  • Merge 1st yuv444p stream and 2nd gray video stream into a yuva444p video stream:
[a0][a1]mergeplanes=0x00010210:yuva444p
  • Swap Y and A plane in yuva444p stream:

the mergeplanes example train is still pulling in, bestie ๐Ÿš‚๐Ÿ’… โ€” hereโ€™s the tail end of that last one:

format=yuva444p,mergeplanes=0x03010200:yuva444p

and then the rest of the example lineup:

  • Swap U and V plane in yuv420p stream:
format=yuv420p,mergeplanes=0x000201:yuv420p
  • Cast a rgb24 clip to yuv444p:
format=rgb24,mergeplanes=0x000102:yuv444p

โœจ mestimate โœจ

okay so this one estimates and exports motion vectors using block matching algorithms. the motion vectors are stored in frame side data so other filters can use them. ๐Ÿ˜Œ

This filter accepts the following options:

  • method โ€” Specify the motion estimation method. Accepts one of these values:
    • esa โ€” Exhaustive search algorithm.
    • tss โ€” Three step search algorithm.
    • tdls โ€” Two dimensional logarithmic search algorithm.
    • ntss โ€” New three step search algorithm.
    • fss โ€” Four step search algorithm.
    • ds โ€” Diamond search algorithm.
    • hexbs โ€” Hexagon-based search algorithm.
    • epzs โ€” Enhanced predictive zonal search algorithm.
    • umh โ€” Uneven multi-hexagon search algorithm.

Default value is esa.

  • mb_size โ€” Macroblock size. Default 16.
  • search_param โ€” Search parameter. Default 7.

๐ŸŒˆ mestimate_d3d12 ๐ŸŒˆ

this one is the GPU girlie version, fr fr. It estimates and exports motion vectors using D3D12 hardware-accelerated motion estimation. It uses GPU hardware motion estimation capabilities available in DirectX 12 Video APIs to achieve significant performance improvements over the software-based mestimate filter. Motion vectors are stored in frame side data to be used by other filters. ๐Ÿ‘‘

This filter requires the input to be in d3d12 hardware pixel format. The filter uses quarter-pixel precision for motion vector estimation.

This filter accepts the following options:

  • mb_size โ€” Macroblock size. Only 8 and 16 are supported. Default 16.

๐ŸŽฌ Examples ๐ŸŽฌ

Estimate motion vectors using D3D12 hardware acceleration with 16x16 blocks, and visualize them:

ffmpeg -hwaccel d3d12va -hwaccel_output_format d3d12 -i input.mp4 \
        -vf mestimate_d3d12=mb_size=16,hwdownload,format=nv12,codecview=mv=pf \
        -c:v libx264 -preset fast -b:v 5M output.mp4

๐Ÿฆ‹ midequalizer ๐Ÿฆ‹

Apply Midway Image Equalization effect using two video streams. Midway Image Equalization adjusts a pair of images to have the same histogram, while maintaining their dynamics as much as possible. Itโ€™s useful for e.g. matching exposures from a pair of stereo cameras. ๐Ÿ’–

This filter has two inputs and one output, which must be of same pixel format, but may be of different sizes. The output of filter is first input adjusted with midway histogram of both inputs.

This filter accepts the following option:

  • planes โ€” Set which planes to process. Default is 15, which is all available planes.

๐ŸŒธ minterpolate ๐ŸŒธ

Convert the video to specified frame rate using motion interpolation. This filter accepts the following options:

  • fps โ€” Specify the output frame rate. This can be rational e.g. 60000/1001. Frames are dropped if fps is lower than source fps. Default 60.
  • mi_mode โ€” Motion interpolation mode. Following values are accepted:
    • dup โ€” Duplicate previous or next frame for interpolating new ones.
    • blend โ€” Blend source frames. Interpolated frame is mean of previous and next frames.
    • mci โ€” Motion compensated interpolation. Following options are effective when this mode is selected:
      • mc_mode โ€” Motion compensation mode. Following values are accepted:
        • obmc โ€” Overlapped block motion compensation.
        • aobmc โ€” Adaptive overlapped block motion compensation. Window weighting coefficients are controlled adaptively according to the reliabilities of the neighboring motion vectors to reduce oversmoothing.

Default mode is obmc.

  • me_mode โ€” Motion estimation mode. Following values are accepted:
    • bidir โ€” Bidirectional motion estimation. Motion vectors are estimated for each source frame in both forward and backward directions.
    • bilat โ€” Bilateral motion estimation. Motion vectors are estimated directly for interpolated frame.

Default mode is bilat.

  • me โ€” The algorithm to be used for motion estimation. Following values are accepted:
    • esa โ€” Exhaustive search algorithm.
    • tss โ€” Three step search algorithm.
    • tdls โ€” Two dimensional logarithmic search algorithm.
    • ntss โ€” New three step search algorithm.
    • fss โ€” Four step search algorithm.
    • ds โ€” Diamond search algorithm.
    • hexbs โ€” Hexagon-based search algorithm.
    • epzs โ€” Enhanced predictive zonal search algorithm.
    • umh โ€” Uneven multi-hexagon search algorithm.

Default algorithm is epzs.

  • mb_size โ€” Macroblock size. Default 16.
  • search_param โ€” Motion estimation search parameter. Default 32.
  • vsbmc โ€” Enable variable-size block motion compensation. Motion estimation is applied with smaller block sizes at object boundaries in order to make them less blurry. Default is 0 (disabled).
  • scd โ€” Scene change detection method. Scene change leads motion vectors to be in random direction. Scene change detection replace interpolated frames by duplicate ones. May not be needed for other modes. Following values are accepted:
    • none โ€” Disable scene change detection.
    • fdiff โ€” Frame difference. Corresponding pixel values are compared and if it satisfies scd_threshold scene change is detected.

Default method is fdiff.

  • scd_threshold โ€” Scene change detection threshold. Default is 10.

๐Ÿ’œ mix ๐Ÿ’œ

Mix several video input streams into one video stream. A description of the accepted options follows.

  • inputs โ€” The number of inputs. If unspecified, it defaults to 2.
  • weights โ€” Specify weight of each input video stream as sequence. Each weight is separated by space. If number of weights is smaller than number of frames last specified weight will be used for all remaining unset weights.
  • scale โ€” Specify scale. If it is set it will be multiplied with sum of each weight multiplied with pixel values to give final destination pixel value. By default scale is auto scaled to sum of weights.
  • planes โ€” Set which planes to filter. Default is all. Allowed range is from 0 to 15.
  • duration โ€” Specify how end of stream is determined.
    • longest โ€” The duration of the longest input. (default)
    • shortest โ€” The duration of the shortest input.
    • first โ€” The duration of the first input.

๐Ÿ’ฌ Commands ๐Ÿ’ฌ

This filter supports the following commands: weights, scale, planes. Syntax is same as option with same name.

๐ŸŽ€ monochrome ๐ŸŽ€

Convert video to gray using custom color filter. A description of the accepted options follows.

  • cb โ€” Set the chroma blue spot. Allowed range is from -1 to 1. Default value is 0.
  • cr โ€” Set the chroma red spot. Allowed range is from -1 to 1. Default value is 0.
  • size โ€” Set the color filter size. Allowed range is from .1 to 10. Default value is 1.
  • high โ€” Set the highlights strength. Allowed range is from 0 to 1. Default value is 0.

๐Ÿ’ฌ Commands ๐Ÿ’ฌ

This filter supports all of the above options as commands.

๐Ÿงš morpho ๐Ÿงš

This filter allows to apply main morphological grayscale transforms, erode and dilate with arbitrary structures set in second input stream. Unlike naive implementation and much slower performance in erosion and dilation filters, when speed is critical morpho filter should be used instead. โšก

A description of accepted options follows,

  • mode โ€” Set morphological transform to apply, can be:
    • erode
    • dilate
    • open
    • close
    • gradient
    • tophat
    • blackhat

Default is erode.

  • planes โ€” Set planes to filter, by default all planes except alpha are filtered.
  • structure โ€” Set which structure video frames will be processed from second input stream, can be first or all. Default is all.

The morpho filter also supports the framesync options.

๐Ÿ’ฌ Commands ๐Ÿ’ฌ

This filter supports same commands as options.

๐Ÿ“ mpdecimate ๐Ÿ“

Drop frames that do not differ greatly from the previous frame in order to reduce frame rate. The main use of this filter is for very-low-bitrate encoding (e.g. streaming over dialup modem), but it could in theory be used for fixing movies that were inverse-telecined incorrectly.

A description of the accepted options follows.

  • max โ€” Set the maximum number of consecutive frames which can be dropped (if positive), or the minimum interval between dropped frames (if negative). If the value is 0, the frame is dropped disregarding the number of previous sequentially dropped frames. Default value is 0.
  • keep โ€” Set the maximum number of consecutive similar frames to ignore before to start dropping them. If the value is 0, the frame is dropped disregarding the number of previous sequentially similar frames. Default value is 0.
  • hi, lo, frac โ€” Set the dropping threshold values.

Values for hi and lo are for 8x8 pixel blocks and represent actual pixel value differences, so a threshold of 64 corresponds to 1 unit of difference for each pixel, or the same spread out differently over the block.

A frame is a candidate for dropping if no 8x8 blocks differ by more than a threshold of hi, and if no more than frac blocks (1 meaning the whole image) differ by more than a threshold of lo.

Default value for hi is 64*12, default value for lo is 64*5, and default value for frac is 0.33.

๐ŸŒŸ msad ๐ŸŒŸ

Obtain the MSAD (Mean Sum of Absolute Differences) between two input videos. This filter takes two input videos. ๐Ÿ‘€

Both input videos must have the same resolution and pixel format for this filter to work correctly. Also it assumes that both inputs have the same number of frames, which are compared one by one.

The obtained per component, average, min and max MSAD is printed through the logging system. The filter stores the calculated MSAD of each frame in frame metadata.

This filter also supports the framesync options.

In the example below, the input file main.mpg being processed gets compared against the reference file ref.mpg โ€” cute little side-by-side situation, no cap ๐Ÿ’…

ffmpeg -i main.mpg -i ref.mpg -lavfi msad -f null -

๐ŸŒธ multiply ๐ŸŒธ

Okay so this one takes the pixel values of the first video stream and multiplies them by the pixel values of the second video stream. Pixel math bestie, literally just vibes times vibes. โœจ

It takes these options:

  • scale โ€” sets the scale that gets applied to the second video stream. Default is 1. Allowed range is 0 to 9.
  • offset โ€” sets the offset applied to the second video stream. Default is 0.5. Allowed range is -1 to 1.
  • planes โ€” pick which planes from the input video stream get processed. By default all planes are processed. ๐Ÿซถ

๐Ÿ’ซ Commands

This filter supports the same commands as its options.


๐ŸŽ€ negate ๐ŸŽ€

Negates (inverts) the input video. Like a photo negative but make it fashion ๐Ÿ’…

It takes this option:

  • components โ€” set the components to negate. The available values are:
    • y
    • u
    • v
    • a
    • r
    • g
    • b
  • negate_alpha โ€” with a value of 1 it negates the alpha component, if there is one. Default value is 0.

๐Ÿ’ซ Commands

This filter supports the same commands as its options.


๐Ÿฆ‹ nlmeans ๐Ÿฆ‹

Denoises frames using the Non-Local Means algorithm. Fancy name, very demure, very mindful ๐Ÿงš

So here's the tea: every pixel gets adjusted by scouting out other pixels that have similar contexts. That "context similarity" thing is defined by comparing their surrounding patches of size pxp. The patches get searched in an area of rxr around the pixel.

Heads up, bestie: the research area defines centers for patches, which means some patches will end up made of pixels that are outside that research area. Iykyk ๐Ÿ˜ญ

The filter accepts these options:

  • s โ€” set the denoising strength. Default is 1.0. Must be in range [1.0, 30.0].
  • p โ€” set the patch size. Default is 7. Must be an odd number in range [0, 99].
  • pc โ€” same as p but for the chroma planes. The default value is 0, which means automatic.
  • r โ€” set the research size. Default is 15. Must be an odd number in range [0, 99].
  • rc โ€” same as r but for the chroma planes. The default value is 0, which means automatic.

๐ŸŒˆ nnedi ๐ŸŒˆ

Deinterlaces video using neural network edge directed interpolation. Neural nets but make it deinterlacing, main character energy fr fr ๐Ÿ‘‘

This filter accepts these options:

  • weights โ€” mandatory option! Without the binary file this filter literally cannot work, no cap. Currently the file can be found here: https://github.com/dubhater/vapoursynth-nnedi3/blob/master/src/nnedi3_weights.bin
  • deint โ€” set which frames to deinterlace. By default it's "all". Can be "all" or "interlaced".
  • field โ€” set the mode of operation. Can be one of these:
    • af โ€” use frame flags, both fields.
    • a โ€” use frame flags, single field.
    • t โ€” use the top field only.
    • b โ€” use the bottom field only.
    • tf โ€” use both fields, top first.
    • bf โ€” use both fields, bottom first.
  • planes โ€” set which planes to process. By default the filter processes all frames.
  • nsize โ€” set the size of the local neighborhood around each pixel, which is what the predictor neural network uses. Can be one of:
    • s8x6
    • s16x6
    • s32x6
    • s48x6
    • s8x4
    • s16x4
    • s32x4
  • nns โ€” set the number of neurons in the predictor neural network. Can be one of:
    • n16
    • n32
    • n64
    • n128
    • n256
  • qual โ€” controls how many different neural network predictions get blended together to compute the final output value. Can be "fast", default, or "slow". โœจ
  • etype โ€” set which set of weights to use in the predictor. Can be one of:
    • a, abs โ€” weights trained to minimize absolute error
    • s, mse โ€” weights trained to minimize squared error
  • pscrn โ€” controls whether or not the prescreener neural network gets used to decide which pixels should be processed by the predictor neural network and which ones can be handled by simple cubic interpolation. The prescreener is trained to know whether cubic interpolation will be sufficient for a pixel or whether it should be predicted by the predictor nn. The computational complexity of the prescreener nn is much less than that of the predictor nn. Since most pixels can be handled by cubic interpolation, using the prescreener generally results in much faster processing. The prescreener is pretty accurate, so the difference between using it and not using it is almost always unnoticeable. ๐Ÿ™ˆ

Can be one of the following:

  • none
  • original
  • new
  • new2
  • new3

Default is "new".

๐Ÿ’ซ Commands

This filter supports the same commands as its options, excluding the weights option. (Makes sense bestie, you can't just swap neural net weights mid-stream ๐Ÿ˜ญ)


โญ noformat โญ

Forces libavfilter to not use any of the specified pixel formats for the input to the next filter. It's giving "blocklist but for pixel formats" ๐Ÿ’€

It accepts this parameter:

  • pix_fmts โ€” a '|'-separated list of pixel format names, like pix_fmts=yuv420p|monow|rgb24".

๐ŸŒธ Examples ๐ŸŒธ

  • Force libavfilter to use a format different from yuv420p for the input to the vflip filter:
noformat=pix_fmts=yuv420p,vflip
  • Convert the input video to any of the formats not contained in the list:
noformat=yuv420p|yuv444p|yuv410p

๐Ÿ’œ noise ๐Ÿ’œ

Adds noise on the video input frame. Chaos, but make it intentional โœจ

The filter accepts these options:

  • all_seed, c0_seed, c1_seed, c2_seed, c3_seed โ€” set the noise seed for a specific pixel component, or for all pixel components in the case of all_seed. Default value is 123457.
  • all_strength, alls, c0_strength, c0s, c1_strength, c1s, c2_strength, c2s, c3_strength, c3s โ€” set the noise strength for a specific pixel component, or for all pixel components in the case of all_strength. Default value is 0. Allowed range is [0, 100].
  • all_flags, allf, c0_flags, c0f, c1_flags, c1f, c2_flags, c2f, c3_flags, c3f โ€” set pixel component flags, or set flags for all components in the case of all_flags. Available values for component flags are:
    • a โ€” averaged temporal noise (smoother)
    • p โ€” mix random noise with a (semi)regular pattern
    • t โ€” temporal noise (noise pattern changes between frames)
    • u โ€” uniform noise (gaussian otherwise)

๐ŸŽ€ Examples ๐ŸŽ€

Add temporal and uniform noise to the input video:

noise=alls=20:allf=t+u

๐Ÿซถ normalize ๐Ÿซถ

Normalizes RGB video โ€” aka histogram stretching, aka contrast stretching. See: https://en.wikipedia.org/wiki/Normalization_(image_processing) ๐Ÿ‘‘

For each channel of each frame, the filter computes the input range and maps it linearly to the user-specified output range. The output range defaults to the full dynamic range, from pure black to pure white. ๐Ÿ–ค๐Ÿค

Temporal smoothing can be used on the input range to reduce flickering (that's rapid changes in brightness, bestie) caused when small dark or bright objects enter or leave the scene. This is similar to the auto-exposure (automatic gain control) on a video camera, and โ€” like a video camera โ€” it may cause a period of over- or under-exposure of the video. ๐Ÿ˜ญ

The R, G and B channels can be normalized independently, which may cause some color shifting, or linked together as a single channel, which prevents color shifting. Linked normalization preserves hue. Independent normalization does not, so it can be used to remove some color casts. Independent and linked normalization can be combined in any ratio. Slay ๐ŸŒˆ

The normalize filter accepts these options:

  • blackpt, whitept โ€” colors which define the output range. The minimum input value gets mapped to blackpt. The maximum input value gets mapped to whitept. The defaults are black and white respectively. Specifying white for blackpt and black for whitept will give you color-inverted, normalized video. Shades of grey can be used to reduce the dynamic range (contrast). Specifying saturated colors here can create some interesting effects. ๐ŸŽจ
  • smoothing โ€” the number of previous frames used for temporal smoothing. The input range of each channel gets smoothed using a rolling average over the current frame and the smoothing previous frames. The default is 0 (no temporal smoothing).
  • independence โ€” controls the ratio of independent (color shifting) channel normalization to linked (color preserving) normalization. 0.0 is fully linked, 1.0 is fully independent. Defaults to 1.0 (fully independent).
  • strength โ€” overall strength of the filter. 1.0 is full strength. 0.0 is a rather expensive no-op. Defaults to 1.0 (full strength).

๐Ÿ’ซ Commands

This filter supports the same commands as its options, excluding the smoothing option. The command accepts the same syntax as the corresponding option.

If the specified expression is not valid, it is kept at its current value. No crash, no drama, it just stays where it's at ๐Ÿ’…

โœจ Examples โœจ

Stretch video contrast to use the full dynamic range, with no temporal smoothing; may flicker depending on the source content:

normalize=blackpt=black:whitept=white:smoothing=0

As above, but with 50 frames of temporal smoothing; flicker should be reduced, depending on the source content:

normalize=blackpt=black:whitept=white:smoothing=50

As above, but with hue-preserving linked channel normalization:

normalize=blackpt=black:whitept=white:smoothing=50:independence=0

As above, but with half strength:

normalize=blackpt=black:whitept=white:smoothing=50:independence=0:strength=0.5

Map the darkest input color to red, the brightest input color to cyan:

normalize=blackpt=red:whitept=cyan

๐Ÿงš null ๐Ÿงš

Passes the video source unchanged to the output. That's it. That's the whole filter. Lowkey iconic for doing absolutely nothing ๐Ÿ’€โœจ


๐ŸŒŸ ocio ๐ŸŒŸ

OpenColorIO library filter. ๐Ÿ”ฅ

This filter lets you do color management using the OpenColorIO library. See https://opencolorio.org/ for more details. To enable compilation of this filter, you need to configure FFmpeg with "--enable-libopencolorio".

It accepts these options:

  • config โ€” by default the filter uses the OCIO config defined by the OCIO environment variable, but this parameter lets you explicitly specify its location. If you're just getting started, you can use config=ocio://studio-config-v1.0.0_aces-v1.3_ocio-v2.1, which specifies one of the built-in defaults. ๐ŸŽ€
  • input โ€” set the input colorspace.
  • output โ€” set the output colorspace.
  • display โ€” set the display colorspace, used in combination with view.
  • view โ€” set the view colorspace, used in combination with display.
  • inverse โ€” when used in combination with display and view, this inverts the transform, so it goes from a display/view to the "input colorspace". ๐Ÿ”„
  • filetransform โ€” bestie, this lets you point at an external file-transform and use that instead of the OCIO config file ๐ŸŽ€ it's giving "I just need one single transform and I do not want to drag a whole OCIO config file into this" โ€” perfect for a quick one-and-done.
  • format โ€” sets the output pix_fmt of the OCIO filter. And ngl, this one has to be a RGB colorspace, so you're literally limited to rgb24, rgba, rgb48, rgba48, gbrp10, gbrp12, gbrpf32le, gbrapf32le. For most encoding we would recommend rgb48 ๐Ÿ’– (like, genuinely, rgb48 is the moment).
  • context_params โ€” lets you add extra context parameters to the OCIO filter ๐ŸŒธ it's a list of key=value pairs, separated by colons.

โœจ Examples โœจ

Map from ACEScg to ACEScct โ€” this assumes the OCIO file is defined with the OCIO environment variable ๐Ÿฆ‹

input=ACEScg:output=ACEScct:format=rgb48

Map from ACEScg to a sRGB display using the "ACES 1.0 - SDR Video" view transform โ€” again, this assumes the OCIO file is defined with the OCIO environment variable. Heads up: you will need to wrap the argument in quotes so those spaces get interpreted correctly ๐Ÿ™ˆ

input=ACEScg:display=sRGB - Display:view=ACES 1.0 - SDR Video:format=rgb48

Same vibe as above but using the OCIO file studio-config-v1.0.0_aces-v1.3_ocio-v2.1_ns.ocio instead of the OCIO environment variable ๐Ÿ‘‘

config=studio-config-v1.0.0_aces-v1.3_ocio-v2.1_ns.ocio:input=ACEScg:display=sRGB - Display:view=ACES 1.0 - SDR Video:format=rgb48

If you're converting to YCrCb you still will want to set the color matrix for the conversion โ€” and this is a chef's kiss good example of combining the two ๐Ÿ’…

ffmpeg -y -i SOURCEFRAMES.%05d.exr -c:v libx265 -vf "ocio=input=ACEScg:output=ACEScct:format=rgb48,scale=in_color_matrix=bt709:out_color_matrix=bt709,format=yuv444p10"  OUTPUTFILE.mov

๐ŸŒˆ ocr

Optical Character Recognition ๐Ÿ” literally reading text out of your frames, main character energy.

This filter uses Tesseract for optical character recognition. To enable compilation of this filter, you need to configure FFmpeg with --enable-libtesseract โญ

It accepts the following options:

  • datapath โ€” sets the datapath to tesseract data. Default is to use whatever was set at installation ๐ŸŽ€
  • language โ€” sets the language, default is "eng" ๐Ÿฆ‹
  • whitelist โ€” sets the character whitelist ๐Ÿ’–
  • blacklist โ€” sets the character blacklist ๐Ÿ™ˆ

The filter exports recognized text as the frame metadata lavfi.ocr.text โœจ and it also exports the confidence of recognized words as the frame metadata lavfi.ocr.confidence ๐Ÿ‘‘


๐Ÿฆ‹ ocv

Apply a video transform using libopencv ๐Ÿ’ซ

To enable this filter, install the libopencv library and headers and configure FFmpeg with --enable-libopencv โ€” no cap, that's the whole vibe check.

It accepts the following parameters:

  • filter_name โ€” the name of the libopencv filter to apply ๐ŸŒธ
  • filter_params โ€” the parameters to pass to the libopencv filter. If you don't specify them, the default values are assumed ๐ŸŽ€

Refer to the official libopencv documentation for more precise information: <http://docs.opencv.org/master/modules/imgproc/doc/filtering.html>

Several libopencv filters are supported โ€” see the following subsections ๐Ÿ’œ

๐Ÿ’… dilate

Dilate an image by using a specific structuring element. It corresponds to the libopencv function cvDilate ๐Ÿ”ฅ

It accepts the parameters: struct_el|nb_iterations.

struct_el represents a structuring element, and has the syntax: colsxrows+anchor_xxanchor_y/shape

cols and rows represent the number of columns and rows of the structuring element, anchor_x and anchor_y the anchor point, and shape the shape for the structuring element. shape must be "rect", "cross", "ellipse", or "custom" โญ

If the value for shape is "custom", it must be followed by a string of the form "=filename". The file with name filename is assumed to represent a binary image, with each printable character corresponding to a bright pixel ๐ŸŒˆ When a custom shape is used, cols and rows are ignored โ€” the number of columns and rows of the read file are assumed instead. Iconic behaviour tbh.

The default value for struct_el is "3x3+0x0/rect" ๐ŸŽ€

nb_iterations specifies the number of times the transform is applied to the image, and defaults to 1.

Some examples:

# Use the default values
ocv=dilate

# Dilate using a structuring element with a 5x5 cross, iterating two times
ocv=filter_name=dilate:filter_params=5x5+2x2/cross|2

# Read the shape from the file diamond.shape, iterating two times.
# The file diamond.shape may contain a pattern of characters like this
#   *
#  ***
# *****
#  ***
#   *
# The specified columns and rows are ignored
# but the anchor point coordinates are not
ocv=dilate:0x0+2x2/custom=diamond.shape|2

๐ŸŒธ erode

Erode an image by using a specific structuring element. It corresponds to the libopencv function cvErode โœจ

It accepts the parameters: struct_el:nb_iterations, with the same syntax and semantics as the dilate filter ๐Ÿซถ

๐Ÿงš smooth

Smooth the input video ๐Ÿ’œ soft blur hours.

The filter takes the following parameters: type|param1|param2|param3|param4.

type is the type of smooth filter to apply, and must be one of the following values: "blur", "blur_no_scale", "median", "gaussian", or "bilateral". The default value is "gaussian" โญ

The meaning of param1, param2, param3, and param4 depends on the smooth type. param1 and param2 accept integer positive values or 0. param3 and param4 accept floating point values ๐Ÿฆ‹

The default value for param1 is 3. The default value for the other parameters is 0.

These parameters correspond to the parameters assigned to the libopencv function cvSmooth ๐ŸŽ€


๐Ÿ’€ oscilloscope

2D Video Oscilloscope ๐Ÿ“ˆ

Useful to measure spatial impulse, step responses, chroma delays, etc. โ€” like a little lab instrument for your frames, obsessed.

It accepts the following parameters:

  • x โ€” set scope center x position ๐ŸŒธ
  • y โ€” set scope center y position ๐ŸŒธ
  • s โ€” set scope size, relative to frame diagonal ๐ŸŽ€
  • t โ€” set scope tilt/rotation ๐Ÿ’ซ
  • o โ€” set trace opacity ๐Ÿฆ‹
  • tx โ€” set trace center x position โœจ
  • ty โ€” set trace center y position โœจ
  • tw โ€” set trace width, relative to width of frame ๐Ÿ’–
  • th โ€” set trace height, relative to height of frame ๐Ÿ’–
  • c โ€” set which components to trace. By default it traces first three components ๐Ÿ‘‘
  • g โ€” draw trace grid. By default is enabled โญ
  • st โ€” draw some statistics. By default is enabled ๐Ÿ“Š
  • sc โ€” draw scope. By default is enabled ๐Ÿ”ฅ

Commands

This filter supports same commands as options ๐Ÿซถ the command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value ๐Ÿ™ˆ

Examples

  • Inspect full first row of video frame ๐Ÿ’…
oscilloscope=x=0.5:y=0:s=1
  • Inspect full last row of video frame ๐Ÿ’…
oscilloscope=x=0.5:y=1:s=1
  • Inspect full 5th line of video frame of height 1080 ๐Ÿ’…
oscilloscope=x=0.5:y=5/1080:s=1
  • Inspect full last column of video frame ๐Ÿ’…
oscilloscope=x=1:y=0.5:s=1:t=1

๐Ÿ‘‘ overlay

Overlay one video on top of another โ€” the classic "put a thing on top of another thing" filter, and it absolutely ate ๐Ÿ’–

It takes two inputs and has one output. The first input is the "main" video on which the second input is overlaid ๐ŸŽ€

It accepts the following parameters:

A description of the accepted options follows.

  • x, y โ€” set the expression for the x and y coordinates of the overlaid video on the main video. Default value is "0" for both expressions. In case the expression is invalid, it is set to a huge value (meaning that the overlay will not be displayed within the output visible area) ๐Ÿ˜ญ so like, careful with your math bestie.
  • eof_action โ€” see framesync ๐Ÿฆ‹
  • eval โ€” set when the expressions for x, and y are evaluated.

It accepts the following values:

  • init โ€” only evaluate expressions once during the filter initialization or when a command is processed โญ
  • frame โ€” evaluate expressions for each incoming frame ๐Ÿ”ฅ

Default value is frame.

  • shortest โ€” see framesync ๐Ÿฆ‹
  • format โ€” set the format for the output video.

It accepts the following values:

  • yuv420 โ€” force YUV 4:2:0 8-bit planar output ๐Ÿ’œ
  • yuv420p10 โ€” force YUV 4:2:0 10-bit planar output ๐Ÿ’œ
  • yuv422 โ€” force YUV 4:2:2 8-bit planar output ๐ŸŒธ
  • yuv422p10 โ€” force YUV 4:2:2 10-bit planar output ๐ŸŒธ
  • yuv444 โ€” force YUV 4:4:4 8-bit planar output โœจ
  • yuv444p10 โ€” force YUV 4:4:4 10-bit planar output โœจ
  • rgb โ€” force RGB 8-bit packed output ๐ŸŽ€
  • gbrp โ€” force RGB 8-bit planar output ๐ŸŽ€
  • auto โ€” automatically pick format ๐Ÿฆ‹

Default value is yuv420.

  • repeatlast โ€” see framesync ๐Ÿฆ‹
  • alpha โ€” set format of alpha of the overlaid video, it can be straight or premultiplied, or auto to choose the alpha mode automatically. Default is auto ๐Ÿ’…

The x, and y expressions can contain the following parameters.

  • main_w, W โ€” the main input width and height ๐Ÿ‘‘
  • main_h, H โ€” the main input width and height ๐Ÿ‘‘
  • overlay_w, w โ€” the overlay input width and height ๐ŸŒธ
  • overlay_h, h โ€” the overlay input width and height ๐ŸŒธ
  • x, y โ€” the computed values for x and y. They are evaluated for each new frame ๐Ÿ”ฅ
  • hsub, vsub โ€” horizontal and vertical chroma subsample values of the output format. For example for the pixel format "yuv422p" hsub is 2 and vsub is 1 ๐ŸŽ€
  • n โ€” the number of input frame, starting from 0 โญ
  • pos โ€” the position in the file of the input frame, NAN if unknown; deprecated, do not use ๐Ÿ’€ like fr fr, don't.
  • t โ€” the timestamp, expressed in seconds. It's NAN if the input timestamp is unknown ๐Ÿฆ‹

This filter also supports the framesync options.

Note that the n, t variables are available only when evaluation is done per frame, and will evaluate to NAN when eval is set to init ๐Ÿ™ˆ

Be aware that frames are taken from each input video in timestamp order, hence, if their initial timestamps differ, it is a good idea to pass the two inputs through a setpts=PTS-STARTPTS filter to have them begin in the same zero timestamp, as the example for the movie filter does ๐Ÿซถ trust, this saves you so much confusion.

You can chain together more overlays but you should test the efficiency of such approach ๐Ÿ’€ don't just stack twenty of them and act surprised.

Commands

This filter supports the following commands:

  • x, y โ€” modify the x and y of the overlay input ๐ŸŒธ the command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value ๐Ÿ™ˆ

Examples

  • Draw the overlay at 10 pixels from the bottom right corner of the main video ๐ŸŒˆ
overlay=main_w-overlay_w-10:main_h-overlay_h-10

Using named options the example above becomes:

overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10
  • Insert a transparent PNG logo in the bottom left corner of the input, using the ffmpeg tool with the -filter_complex option:

and here's that overlay command, bestie:

ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
  • Two different transparent PNG logos? Say less. The second logo goes in the bottom right corner, and the ffmpeg tool handles it like this:
ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output
  • Transparent color layer on top of the main video: <pink>"WxH"</pink> must specify the size of the main input to the overlay filter. Like this:
color=color=red@.3:size=WxH [over]; [in][over] overlay [out]
  • Play an original video and a filtered version side by side (here the filtered version uses the deshake filter) with the ffplay tool:
ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w'

The above command is literally the same as:

ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w'
  • Sliding overlay moment: make it appear from the left to the right top part of the screen, starting at time 2:
overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0
  • Compose output by putting two input videos side to side:
ffmpeg -i left.avi -i right.avi -filter_complex "
nullsrc=size=200x100 [background];
[0:v] setpts=PTS-STARTPTS, scale=100x100 [left];
[1:v] setpts=PTS-STARTPTS, scale=100x100 [right];
[background][left]       overlay=shortest=1       [background+left];
[background+left][right] overlay=shortest=1:x=100 [left+right]
"
  • Mask 10-20 seconds of a video by applying the delogo filter to a section:
ffmpeg -i test.avi -codec:v:0 wmv2 -ar 11025 -b:v 9000k
-vf '[in]split[split_main][split_delogo];[split_delogo]trim=start=360:end=371,delogo=0:0:640:480[delogoed];[split_main][delogoed]overlay=eof_action=pass[out]'
masked.avi
  • Chain several overlays in cascade:
nullsrc=s=200x200 [bg];
testsrc=s=100x100, split=4 [in0][in1][in2][in3];
[in0] lutrgb=r=0, [bg]   overlay=0:0     [mid0];
[in1] lutrgb=g=0, [mid0] overlay=100:0   [mid1];
[in2] lutrgb=b=0, [mid1] overlay=0:100   [mid2];
[in3] null,       [mid2] overlay=100:100 [out0]

๐ŸŒ€ owdenoise

Runs the Overcomplete Wavelet denoiser. It's giving "clean up the noise, but make it wavelet."

It takes these options:

  • depth โ€” sets the depth. Bigger depth values denoise lower frequency components more, but they also slow down the filtering. Must be an int in the range 8-16; default is 8.
  • luma_strength, ls โ€” sets the luma strength. Must be a double value in the range 0-1000; default is 1.0.
  • chroma_strength, cs โ€” sets the chroma strength. Must be a double value in the range 0-1000; default is 1.0.

๐Ÿ–ผ๏ธ pad

Adds padding to the input image and places the original input at the x, y coordinates you give it. Cute frame energy, no cap.

It accepts these parameters:

  • width, w / height, h โ€” an expression for the size of the output image with the padding added. If the value for width or height is 0, the corresponding input size is used for the output. The width expression can reference the value set by the height expression, and vice versa. The default value of width and height is 0.
  • x / y โ€” the offsets for placing the input image inside the padded area, relative to the top/left border of the output image. The x expression can reference the value set by the y expression, and vice versa. The default value of x and y is 0. If x or y evaluate to a negative number, they'll be changed so the input image is centered on the padded area.
  • color โ€” the color of the padded area. For the syntax of this option, check the Color section in the ffmpeg-utils manual. The default value of color is black.
  • eval โ€” when to evaluate the width, height, x, and y expressions. It accepts these values:
    • init โ€” only evaluate expressions once during filter initialization or when a command is processed.
    • frame โ€” evaluate expressions for each incoming frame.

Default value is init.

  • aspect โ€” pads to an aspect ratio instead of a resolution.

The values for the width, height, x, and y options are expressions containing these constants:

  • in_w, in_h โ€” the input video width and height.
  • iw, ih โ€” these are the same as in_w and in_h.
  • out_w, out_h โ€” the output width and height (the size of the padded area), as specified by the width and height expressions.
  • ow, oh โ€” these are the same as out_w and out_h.
  • x, y โ€” the x and y offsets as specified by the x and y expressions, or NAN if not yet specified.
  • a โ€” same as iw / ih.
  • sar โ€” input sample aspect ratio.
  • dar โ€” input display aspect ratio; it is the same as (iw / ih) * sar.
  • hsub, vsub โ€” the horizontal and vertical chroma subsample values. For example, for the pixel format yuv422p, hsub is 2 and vsub is 1.

โœจ Examples

  • Add padding with the color violet to the input video. The output video size is 640x480, and the top-left corner of the input video is placed at column 0, row 40:
pad=640:480:0:40:violet

The example above is equivalent to this command:

pad=width=640:height=480:x=0:y=40:color=violet
  • Pad the input so the output dimensions increase by 3/2, and put the input video at the center of the padded area:
pad="3/2*iw:3/2*ih:(ow-iw)/2:(oh-ih)/2"
  • Pad the input to get a squared output with a size equal to the maximum value between the input width and height, and put the input video at the center of the padded area:
pad="max(iw\,ih):ow:(ow-iw)/2:(oh-ih)/2"
  • Pad the input to get a final w/h ratio of 16:9:
pad="ih*16/9:ih:(ow-iw)/2:(oh-ih)/2"
  • For anamorphic video, to set the output display aspect correctly, you need to use sar in the expression according to this relation:
(ih * X / ih) * sar = output_dar
X = output_dar / sar

So the previous example needs to be modified to:

pad="ih*16/9/sar:ih:(ow-iw)/2:(oh-ih)/2"
  • Double the output size and put the input video in the bottom-right corner of the output padded area:
pad="2*iw:2*ih:ow-iw:oh-ih"

๐ŸŽจ palettegen

Generates one palette for a whole video stream. One palette to rule them all, periodt.

It accepts these options:

  • max_colors โ€” sets the maximum number of colors to quantize in the palette. Note: the palette will still contain 256 colors; the unused palette entries will be black.
  • reserve_transparent โ€” creates a palette of 255 colors maximum and reserves the last one for transparency. Reserving the transparency color is useful for GIF optimization. If not set, the maximum of colors in the palette will be 256. You probably want to disable this option for a standalone image. Set by default.
  • transparency_color โ€” sets the color that will be used as background for transparency.
  • stats_mode โ€” sets the statistics mode. It accepts these values:
    • full โ€” compute full frame histograms.
    • diff โ€” compute histograms only for the part that differs from the previous frame. This might be relevant to give more importance to the moving part of your input if the background is static.
    • single โ€” compute a new histogram for each frame.

Default value is full.

The filter also exports the frame metadata lavfi.color_quant_ratio (nb_color_in / nb_color_out), which you can use to evaluate the degree of color quantization of the palette. This information is also visible at info logging level.

โœจ Examples

  • Generate a representative palette of a given video using ffmpeg:
ffmpeg -i input.mkv -vf palettegen palette.png

๐ŸŒˆ paletteuse

Uses a palette to downsample an input video stream. The filter takes two inputs: one video stream and a palette. The palette must be a 256 pixels image.

It accepts these options:

  • dither โ€” selects the dithering mode. Available algorithms are:
    • bayer โ€” ordered 8x8 bayer dithering (deterministic).
    • heckbert โ€” dithering as defined by Paul Heckbert in 1982 (simple error diffusion). Note: this dithering is sometimes considered "wrong" and is included as a reference.
    • floyd_steinberg โ€” Floyd and Steingberg dithering (error diffusion).
    • sierra2 โ€” Frankie Sierra dithering v2 (error diffusion).
    • sierra2_4a โ€” Frankie Sierra dithering v2 "Lite" (error diffusion).
    • sierra3 โ€” Frankie Sierra dithering v3 (error diffusion).
    • burkes โ€” Burkes dithering (error diffusion).
    • atkinson โ€” Atkinson dithering by Bill Atkinson at Apple Computer (error diffusion).
    • none โ€” disable dithering.

Default is sierra2_4a.

  • bayer_scale โ€” when bayer dithering is selected, this option defines the scale of the pattern (how much the crosshatch pattern is visible). A low value means a more visible pattern for less banding, and a higher value means a less visible pattern at the cost of more banding. The option must be an integer value in the range [0,5]. Default is 2.
  • diff_mode โ€” if set, defines the zone to process:
    • rectangle โ€” only the changing rectangle will be reprocessed. This is similar to the GIF cropping/offsetting compression mechanism. This option can be useful for speed if only a part of the image is changing, and has use cases such as limiting the scope of the error diffusal dither to the rectangle that bounds the moving scene (it leads to more deterministic output if the scene doesn't change much, and as a result less moving noise and better GIF compression).

Default is none.

  • new โ€” take a new palette for each output frame.
  • alpha_threshold โ€” sets the alpha threshold for transparency. Alpha values above this threshold will be treated as completely opaque, and values below this threshold will be treated as completely transparent. The option must be an integer value in the range [0,255]. Default is 128.

โœจ Examples

  • Use a palette (generated for example with palettegen) to encode a GIF using ffmpeg:
ffmpeg -i input.mkv -i palette.png -lavfi paletteuse output.gif

๐Ÿ“ perspective

Corrects the perspective of video that wasn't recorded perpendicular to the screen.

A description of the accepted parameters follows, bestie โ€” buckle up ๐Ÿ’–

  • x0, y0, x1, y1, x2, y2, x3, y3 โ€” these set the coordinate expressions for the top left, top right, bottom left and bottom right corners. Default values are 0:0:W:0:0:H:W:H and with those, perspective stays exactly as it was (no change, iconic). If the sense option is set to source, then the points you specify get sent to the corners of the destination. If sense is set to destination, then the corners of the source get sent to the coordinates you specified. Flip-flop vibes ๐Ÿฆ‹

Your expressions can use these variables:

  • W, H โ€” the width and height of the video frame.
  • in โ€” input frame count.
  • on โ€” output frame count.
  • interpolation โ€” sets the interpolation used for perspective correction.

It accepts the following values:

  • linear
  • cubic

Default value is linear. โœจ

  • sense โ€” sets how the coordinate options get interpreted, iykyk.

It accepts the following values:

  • 0, source โ€” send the point in the source specified by the given coordinates to the corners of the destination.
  • 1, destination โ€” send the corners of the source to the point in the destination specified by the given coordinates.

Default value is source.

  • eval โ€” sets when the expressions for coordinates x0,y0,...x3,y3 get evaluated.

It accepts the following values:

  • init โ€” only evaluate expressions once during the filter initialization or when a command is processed.
  • frame โ€” evaluate expressions for each incoming frame.

Default value is init.


๐ŸŒ€ phase

Okay so this one delays interlaced video by one field time so that the field order changes. The whole point is to fix PAL movies that got captured with the opposite field order to the film-to-video transfer. Serving cunt, fixing your old DVDs ๐Ÿ’…

A description of the accepted parameters follows.

mode

Set phase mode. It accepts the following values:

  • t โ€” capture field order top-first, transfer bottom-first. Filter will delay the bottom field.
  • b โ€” capture field order bottom-first, transfer top-first. Filter will delay the top field.
  • p โ€” capture and transfer with the same field order. This mode only exists for the documentation of the other options to refer to, but if you actually select it, the filter will faithfully do nothing. ๐Ÿ’€ (yes, literally nothing. it's giving "I'm here for moral support")
  • a โ€” capture field order determined automatically by field flags, transfer opposite. Filter selects among t and b modes on a frame by frame basis using field flags. If no field information is available, then this works just like u.
  • u โ€” capture unknown or varying, transfer opposite. Filter selects among t and b on a frame by frame basis by analyzing the images and selecting the alternative that produces best match between the fields.
  • T โ€” capture top-first, transfer unknown or varying. Filter selects among t and p using image analysis.
  • B โ€” capture bottom-first, transfer unknown or varying. Filter selects among b and p using image analysis.
  • A โ€” capture determined by field flags, transfer unknown or varying. Filter selects among t, b and p using field flags and image analysis. If no field information is available, then this works just like U. This is the default mode. ๐Ÿ‘‘
  • U โ€” both capture and transfer unknown or varying. Filter selects among t, b and p using image analysis only.

Commands

This filter supports the all above options as commands. ๐Ÿซถ


๐Ÿฉบ photosensitivity

Reduce various flashes in video, so to help users with epilepsy. This one is genuinely important, no cap โ€” accessibility filter supremacy ๐Ÿ’œ

It accepts the following options:

  • frames, f โ€” set how many frames to use when filtering. Default is 30.
  • threshold, t โ€” set detection threshold factor. Default is 1. Lower is stricter.
  • skip โ€” set how many pixels to skip when sampling frames. Default is 1. Allowed range is from 1 to 1024.
  • bypass โ€” leave frames unchanged. Default is disabled.

๐Ÿ”ฌ pixdesctest

Pixel format descriptor test filter, mainly useful for internal testing. The output video should be equal to the input video โ€” it's a vibe check for your pixel format descriptors, basically ๐ŸŽ€

For example:

format=monow, pixdesctest

can be used to test the monowhite pixel format descriptor definition.


๐Ÿงฉ pixelize

Apply pixelization to video stream. Retro censor-bar energy, obsessed ๐Ÿ˜ญโœจ

The filter accepts the following options:

  • width, w, height, h โ€” set block dimensions that will be used for pixelization. Default value is 16.
  • mode, m โ€” set the mode of pixelization used.

Possible values are:

  • avg
  • min
  • max

Default value is avg.

  • planes, p โ€” set what planes to filter. Default is to filter all planes.

Commands

This filter supports all options as commands.


๐Ÿ” pixscope

Display sample values of color channels. Mainly useful for checking color and levels. Minimum supported resolution is 640x480 (sorry to all the tiny-video girlies, that's the floor ๐Ÿซถ).

The filters accept the following options:

  • x โ€” set scope X position, relative offset on X axis.
  • y โ€” set scope Y position, relative offset on Y axis.
  • w โ€” set scope width.
  • h โ€” set scope height.
  • o โ€” set window opacity. This window also holds statistics about pixel area. ๐Ÿ‘€
  • wx โ€” set window X position, relative offset on X axis.
  • wy โ€” set window Y position, relative offset on Y axis.

Commands

This filter supports same commands as options.


๐ŸŽ›๏ธ pp7

Apply Postprocessing filter 7. It is variant of the spp filter, similar to spp = 6 with 7 point DCT, where only the center sample is used after IDCT. She's niche, she's specialized, she's lowkey iconic ๐Ÿ’…

The filter accepts the following options:

  • qp โ€” force a constant quantization parameter. It accepts an integer in range 0 to 63. If not set, the filter will use the QP from the video stream (if available).
  • mode โ€” set thresholding mode. Available modes are:
    • hard โ€” set hard thresholding.
    • soft โ€” set soft thresholding (better de-ringing effect, but likely blurrier).
    • medium โ€” set medium thresholding (good results, default). ๐ŸŒธ

โœ–๏ธ premultiply

Apply alpha premultiply effect to input video stream using first plane of second stream as alpha.

Both streams must have same dimensions and same pixel format. No exceptions bestie, they gotta match fr fr.

The filter accepts the following option:

  • planes โ€” set which planes will be processed, unprocessed planes will be copied. By default value 0xf, all planes will be processed.
  • inplace โ€” do not require 2nd input for processing, instead use alpha plane from input stream. Solo-mode, main character energy ๐Ÿ‘‘

๐Ÿ”„ premultiply_dynamic

Dynamically premultiply or unpremultiply the input video stream as needed, to match the requirements of the downstream filter graph. This is roughly equivalent to either premultiply:inplace=yes or unpremultiply:inplace=yes, or otherwise a noop. She reads the room and adapts, we love a flexible queen ๐Ÿฆ‹

The filter accepts the following option:

  • planes โ€” set which planes will be processed, unprocessed planes will be copied. By default value 0xf, all planes will be processed.

๐Ÿ–ค prewitt

Apply prewitt operator to input video stream. Edge detection moment โœจ

The filter accepts the following option:

  • planes โ€” set which planes will be processed, unprocessed planes will be copied. By default value 0xf, all planes will be processed.
  • scale โ€” set value which will be multiplied with filtered result.
  • delta โ€” set value which will be added to filtered result.

Commands

This filter supports the all above options as commands.


๐ŸŒˆ pseudocolor

Alter frame colors in video with pseudocolors. This is the glow-up filter, periodt ๐Ÿ”ฅ

This filter accepts the following options:

  • c0 โ€” set pixel first component expression
  • c1 โ€” set pixel second component expression
  • c2 โ€” set pixel third component expression
  • c3 โ€” set pixel fourth component expression, corresponds to the alpha component
  • index, i โ€” set component to use as base for altering colors
  • preset, p โ€” pick one of built-in LUTs. By default is set to none.

Available LUTs:

  • magma
  • inferno
  • plasma
  • viridis
  • turbo
  • cividis
  • range1
  • range2
  • shadows
  • highlights
  • solar
  • nominal
  • preferred
  • total
  • spectral
  • cool
  • heat
  • fiery
  • blues
  • green
  • helix
  • opacity โ€” set opacity of output colors. Allowed range is from 0 to 1. Default value is set to 1.

Each of the expression options specifies the expression to use for computing the lookup table for the corresponding pixel component values.

The expressions can contain the following constants and functions:

  • w, h โ€” the input width and height.
  • val โ€” the input value for the pixel component.
  • ymin, umin, vmin, amin โ€” the minimum allowed component value.
  • ymax, umax, vmax, amax โ€” the maximum allowed component value.

All expressions default to val. ๐ŸŽ€

Commands

This filter supports the all above options as commands.

Examples

  • Change too high luma values to gradient:
pseudocolor="'if(between(val,ymax,amax),lerp(ymin,ymax,(val-ymax)/(amax-ymax)),-1):if(between(val,ymax,amax),lerp(umax,umin,(val-ymax)/(amax-ymax)),-1):if(between(val,ymax,amax),lerp(vmin,vmax,(val-ymax)/(amax-ymax)),-1):-1'"

๐Ÿ“Š psnr

Obtain the average, maximum and minimum PSNR (Peak Signal to Noise Ratio) between two input videos. Quality-check queen, she's literally grading your encode ๐Ÿ’…

This filter takes in input two input videos, the first input is considered the "main" source and is passed unchanged to the output. The second input is used as a "reference" video for computing the PSNR.

Both video inputs must have the same resolution and pixel format for this filter to work correctly. Also it assumes that both inputs have the same number of frames, which are compared one by one. > mismatch and it's gonna be a mess, so keep them matched bestie ๐Ÿซถ

The obtained average PSNR is printed through the logging system.

The filter stores the accumulated MSE (mean squared error) of each frame, and at the end of the processing it is averaged across all frames equally, and the following formula is applied to obtain the PSNR:

PSNR = 10*log10(MAX^2/MSE)

Where MAX is the average of the maximum values of each component of the image.

The description of the accepted parameters follows.

  • stats_file, f โ€” if specified the filter will use the named file to save the PSNR of each individual frame. When filename equals - the data is sent to standard output. ๐Ÿ“
  • stats_version โ€” specifies which version of the stats file format to use. Details of each format are written below. Default value is 1.
  • output_max โ€” decides whether the max value gets dumped into the stats log. Default is 0. Needs stats_version >= 2, periodt. If you set this and stats_version is less than 2, the filter will straight-up throw an error at you. ๐Ÿ˜ญ

This filter also supports the framesync options, bestie. Say it with me: framesync options. ๐Ÿ’…


So the file that gets printed when you pick stats_file is a whole sequence of key:value pairs, one per compared couple of frames. Very cute, very structured.

If you specify a stats_version greater than 1, a header line comes before the list of per-frame-pair stats, with key/value pairs following the frame format, carrying these parameters:

  • psnr_log_version โ€” the version of the log file format. Will match stats_version.
  • fields โ€” a comma separated list of the per-frame-pair parameters that are included in the log.

Now a lil rundown of each per-frame-pair parameter that can show up:

  • n โ€” sequential number of the input frame, starting from 1. Counting like a normal human for once.
  • mse_avg โ€” Mean Square Error, pixel-by-pixel average difference of the compared frames, averaged over all the image components.
  • mse_y, mse_u, mse_v, mse_r, mse_g, mse_b, mse_a โ€” Mean Square Error pixel-by-pixel average difference of the compared frames for whichever component the suffix names. iykyk.
  • psnr_y, psnr_u, psnr_v, psnr_r, psnr_g, psnr_b, psnr_a โ€” Peak Signal to Noise ratio of the compared frames, for the component specified by the suffix.
  • max_avg, max_y, max_u, max_v โ€” maximum allowed value for each channel, plus an average over all channels.

โœจ Examples โœจ

  • Okay so like, for example:
movie=ref_movie.mpg, setpts=PTS-STARTPTS [main];
[main][ref] psnr="stats_file=stats.log" [out]

In this example the input file being processed gets compared against the reference file ref_movie.mpg, and the PSNR of each individual frame is stored in stats.log. Iconic behavior honestly.

  • Another example, this time with different containers:
ffmpeg -i main.mpg -i ref.mkv -lavfi  "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]psnr" -f null -

๐ŸŒ€ pullup

Pulldown reversal filter โ€” aka inverse telecine โ€” and she's capable of handling mixed hard-telecine, 24000/1001 fps progressive, and 30000/1001 fps progressive content. A whole multitasker. ๐Ÿ‘‘

The pullup filter is designed to take advantage of future context when making its decisions. She's stateless in the sense that she does not lock onto a pattern to follow โ€” instead she looks forward to the following fields to identify matches and rebuild progressive frames. Main character foresight, fr fr.

To produce content with an even framerate, insert the fps filter after pullup. Use fps=24000/1001 if the input frame rate is 29.97 fps, fps=24 for 30 fps, and the (rare) telecined 25 fps input.

The filter accepts the following options:

  • jl, jr, jt, jb โ€” these options set the amount of "junk" to ignore at the left, right, top, and bottom of the image, respectively. Left and right are in units of 8 pixels, while top and bottom are in units of 2 lines. The default is 8 pixels on each side.
  • sb โ€” set the strict breaks. Setting this option to 1 reduces the chances of the filter generating an occasional mismatched frame, but it may also cause an excessive number of frames to be dropped during high motion sequences. Conversely, setting it to -1 makes the filter match fields more easily. That may help processing of video where there's slight blurring between the fields, but it may also cause there to be interlaced frames in the output. Default value is 0.
  • mp โ€” set the metric plane to use. It accepts the following values:
    • l โ€” use luma plane.
    • u โ€” use chroma blue plane.
    • v โ€” use chroma red plane.

This option may be set to use a chroma plane instead of the default luma plane for doing the filter's computations. This may improve accuracy on very clean source material, but more likely will decrease accuracy โ€” especially if there's chroma noise (rainbow effect) or any grayscale video. The main purpose of setting mp to a chroma plane is to reduce CPU load and make pullup usable in realtime on slow machines. Efficiency slay. โšก

For best results (without duplicated frames in the output file) it is necessary to change the output frame rate. For example, to inverse telecine NTSC input:
ffmpeg -i input -vf pullup -r 24000/1001 ...

๐ŸŽš๏ธ qp

Changes video quantization parameters (QP). Short name, big job.

The filter accepts the following option:

  • qp โ€” set expression for quantization parameter.

The expression is evaluated through the eval API and can contain, among others, the following constants:

  • known โ€” 1 if index is not 129, 0 otherwise.
  • qp โ€” sequential index starting from -129 to 128.

โœจ Examples โœจ

  • Some equation like:
qp=2+2*sin(PI*qp)

๐Ÿ”ณ qrencode

Generates a QR code using the libqrencode library (see https://fukuchi.org/works/qrencode/), and overlays it on top of the current frame. Crafting era. ๐ŸŽ€

To enable the compilation of this filter, you need to configure FFmpeg with --enable-libqrencode.

The QR code is generated from the provided text or text pattern. The corresponding QR code is scaled and overlaid into the video output according to the specified options.

In case no text is specified, no QR code is overlaid.

This filter accepts the following options:

  • qrcode_width, q / padded_qrcode_width, Q โ€” specify an expression for the width of the rendered QR code, with and without padding. The qrcode_width expression can reference the value set by the padded_qrcode_width expression, and vice versa. By default padded_qrcode_width is set to qrcode_width, meaning that there is no padding.

These expressions are evaluated for each new frame.

See the qrencode Expressions section for details. ๐Ÿ‘€

  • x, y โ€” specify an expression for positioning the padded QR code's top-left corner. The x expression can reference the value set by the y expression, and vice versa.

By default x and y are set to 0, meaning that the QR code is placed in the top left corner of the input.

These expressions are evaluated for each new frame.

See the qrencode Expressions section for details.

  • case_sensitive, cs โ€” instruct libqrencode to use case sensitive encoding. This is enabled by default. This can be disabled to reduce the QR encoding size.
  • level, l โ€” specify the QR encoding error correction level. With a higher correction level, the encoding size will increase but the code will be more robust to corruption. Lower level is L.

It accepts the following values:

  • L
  • M
  • Q
  • H
  • expansion โ€” select how the input text is expanded. Can be either none, or normal (default). See the qrencode Text expansion section below for details.
  • text, textfile โ€” define the text to be rendered. In case neither is specified, no QR is encoded (just an empty colored frame).

In case expansion is enabled, the text is treated as a text template, using the qrencode expansion mechanism. See the qrencode Text expansion section below for details.

  • background_color, bc / foreground_color, fc โ€” set the QR code and background color. The default value of foreground_color is black, the default value of background_color is white.

For the syntax of the color options, check the "Color" section in the ffmpeg-utils manual.

๐ŸŒธ qrencode Expressions ๐ŸŒธ

The expressions set by the options contain the following constants and functions:

  • dar โ€” input display aspect ratio, it is the same as (w / h) * sar.
  • duration โ€” the current frame's duration, in seconds.
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • main_h, H โ€” the input height.
  • main_w, W โ€” the input width.
  • n โ€” the number of input frame, starting from 0.
  • pict_type โ€” a number representing the picture type.
  • qr_w, w โ€” the width of the encoded QR code.
  • rendered_qr_w, q / rendered_padded_qr_w, Q โ€” the width of the rendered QR code, without and without padding.

These parameters allow the q and Q expressions to refer to each other, so you can for example specify q=3/4*Q.

  • rand(min, max) โ€” return a random number included between min and max.
  • sar โ€” the input sample aspect ratio.
  • t โ€” timestamp expressed in seconds, NAN if the input timestamp is unknown.
  • x, y โ€” the x and y offset coordinates where the text is drawn.

These parameters allow the x and y expressions to refer to each other, so you can for example specify y=x/dar.

๐Ÿฆ‹ qrencode Text expansion ๐Ÿฆ‹

If expansion is set to none, the text is printed verbatim.

If expansion is set to normal (which is the default), the following expansion mechanism is used.

The backslash character \, followed by any character, always expands to the second character.

Sequences of the form %{...} are expanded. The text between the braces is a function name, possibly followed by arguments separated by :. If the arguments contain special characters or delimiters (: or }), they should be escaped.

Note that they probably must also be escaped as the value for the text option in the filter argument string, and as the filter argument in the filtergraph description, and possibly also for the shell โ€” that makes up to four levels of escaping. Using a text file with the textfile option avoids these problems. ๐Ÿ˜ฎโ€๐Ÿ’จ

The following functions are available:

  • n, frame_num โ€” return the frame number.
  • pts โ€” return the presentation timestamp of the current frame.

It can take up to two arguments.

The first argument is the format of the timestamp; it defaults to flt for seconds as a decimal number with microsecond accuracy; hms stands for a formatted [-]HH:MM:SS.mmm timestamp with millisecond accuracy. gmtime stands for the timestamp of the frame formatted as UTC time; localtime stands for the timestamp of the frame formatted as local time zone time. If the format is set to hms24hh, the time is formatted in 24h format (00-23).

The second argument is an offset added to the timestamp.

If the format is set to localtime or gmtime, a third argument may be supplied: a strftime C function format string. By default, YYYY-MM-DD HH:MM:SS format will be used.

  • expr, e โ€” evaluate the expression's value and output as a double.

It must take one argument specifying the expression to be evaluated, accepting the constants and functions defined in qrencode_expressions.

  • expr_formatted, ef โ€” evaluates the expression's value and spits it out as a formatted string, cute right? ๐ŸŽ€ Arg one is the expression to evaluate, exactly like you'd do with the expr function. Arg two is the output format โ€” allowed values are x, X, d and u, and they're treated exactly as in the "printf" function. Arg three is optional and sets the number of positions taken by the output; you can use it to pad with zeros from the left. โœจ
  • gmtime โ€” the time at which the filter is running, expressed in UTC. It can accept an argument: a "strftime" C function format string. Bestie, the format string is extended to support the variable %[1-6]N which prints fractions of the second with optionally specified number of digits. ๐Ÿ•ฐ๏ธ
  • localtime โ€” literally the same vibe as gmtime but the time at which the filter is running is expressed in the local time zone. It can accept an argument: a "strftime" C function format string. And yeah, the format string is extended to support the variable %[1-6]N which prints fractions of the second with optionally specified number of digits. ๐ŸŒ
  • metadata โ€” frame metadata, takes one or two arguments, no more no less ๐Ÿ’…

The first argument is mandatory and specifies the metadata key.

The second argument is optional and specifies a default value, used when the metadata key is not found or empty.

You can identify available metadata by inspecting entries starting with TAG included within each frame section printed by running "ffprobe -show_frames". Also!! String metadata generated in filters leading to the qrencode filter are available too. ๐Ÿ”

  • rand(min, max) โ€” returns a random number included between min and max. that's it, that's the whole thing ๐ŸŽฒ

โœจ Examples โœจ

  • Generate a QR code encoding the specified text with the default size, overalaid in the top left corner of the input video, with the default size:
qrencode=text=www.ffmpeg.org
  • Same as below, but select blue on pink colors:
qrencode=text=www.ffmpeg.org:bc=pink@0.5:fc=blue
  • Place the QR code in the bottom right corner of the input video:
qrencode=text=www.ffmpeg.org:x=W-Q:y=H-Q
  • Generate a QR code with width of 200 pixels and padding, making the padded width 4/3 of the QR code width:
qrencode=text=www.ffmpeg.org:q=200:Q=4/3*q
  • Generate a QR code with padded width of 200 pixels and padding, making the QR code width 3/4 of the padded width:
qrencode=text=www.ffmpeg.org:Q=200:q=3/4*Q
  • Make the QR code a fraction of the input video width:
qrencode=text=www.ffmpeg.org:q=W/5
  • Generate a QR code encoding the frame number:
qrencode=text=%{n}
  • Generate a QR code encoding the GMT timestamp:
qrencode=text=%{gmtime}
  • Generate a QR code encoding the timestamp expressed as a float:
qrencode=text=%{pts}

๐Ÿฆ‹ quirc ๐Ÿฆ‹

Identify and decode a QR code using the libquirc library (see <https://github.com/dlbeer/quirc/>), and print the identified QR codes positions and payload as metadata. It's giving detective energy, honestly ๐Ÿ”Žโœจ

To enable the compilation of this filter, you need to configure FFmpeg with "--enable-libquirc".

For each found QR code in the input video, some metadata entries are added with the prefix lavfi.quirc.N, where N is the index, starting from 0, associated to the QR code.

A description of each metadata value follows:

  • lavfi.quirc.count โ€” the number of found QR codes, it is not set in case none was found. zero QR codes = no entry, periodt ๐Ÿ’€
  • lavfi.quirc.N.corner.M.x lavfi.quirc.N.coreer.M.y โ€” the x/y positions of the four corners of the square containing the QR code, where M is the index of the corner starting from 0. (yes, coreer is spelled like that up there, we don't make the rules, we just transcribe them ๐Ÿซถ)
  • lavfi.quirc.N.payload โ€” the payload of the QR code. the actual tea โ˜•

๐ŸŽฒ random ๐ŸŽฒ

Flush video frames from internal cache of frames into a random order. No frame is discarded โ€” every single one stays, they just get shuffled like a playlist on shuffle ๐Ÿ”€ Inspired by frei0r nervous filter.

  • frames โ€” set size in number of frames of internal cache, in range from 2 to 512. Default is 30. ๐ŸŽ€
  • seed โ€” set seed for random number generator, must be an integer included between 0 and "UINT32_MAX". If not specified, or if explicitly set to less than 0, the filter will try to use a good random seed on a best effort basis. bestie it's doing its best, ok ๐Ÿ˜ญ

๐Ÿ‘‘ readeia608 ๐Ÿ‘‘

Read closed captioning (EIA-608) information from the top lines of a video frame. old-school caption lore, lowkey iconic ๐Ÿ“บ

This filter adds frame metadata for "lavfi.readeia608.X.cc" and "lavfi.readeia608.X.line", where "X" is the number of the identified line with EIA-608 data (starting from 0). A description of each metadata value follows:

  • lavfi.readeia608.X.cc โ€” the two bytes stored as EIA-608 data (printed in hexadecimal). ๐Ÿ”ข
  • lavfi.readeia608.X.line โ€” the number of the line on which the EIA-608 data was identified and read. ๐Ÿ“

This filter accepts the following options:

  • scan_min โ€” set the line to start scanning for EIA-608 data. Default is 0. โฌ†๏ธ
  • scan_max โ€” set the line to end scanning for EIA-608 data. Default is 29. โฌ‡๏ธ
  • spw โ€” set the ratio of width reserved for sync code detection. Default is 0.27. Allowed range is "[0.1 - 0.7]". ๐Ÿ“
  • chp โ€” enable checking the parity bit. In the event of a parity error, the filter will output 0x00 for that character. Default is false. ๐Ÿšจ
  • lp โ€” lowpass lines prior to further processing. Default is enabled. ๐ŸŽš๏ธ

Commands

This filter supports the all above options as commands. yes, all of them, go wild ๐Ÿซถ

Examples

  • Output a csv with presentation time and the first two lines of identified EIA-608 captioning data.
ffprobe -f lavfi -i movie=captioned_video.mov,readeia608 -show_entries frame=pts_time:frame_tags=lavfi.readeia608.0.cc,lavfi.readeia608.1.cc -of csv

๐ŸŒธ readvitc ๐ŸŒธ

Read vertical interval timecode (VITC) information from the top lines of a video frame. it's like readeia608's sibling, same top-of-frame energy ๐Ÿ’ซ

The filter adds frame metadata key "lavfi.readvitc.tc_str" with the timecode value, if a valid timecode has been detected. Further metadata key "lavfi.readvitc.found" is set to 0/1 depending on whether timecode data has been found or not.

This filter accepts the following options:

  • scan_max โ€” set the maximum number of lines to scan for VITC data. If the value is set to -1 the full video frame is scanned. Default is 45. ๐Ÿ”
  • thr_b โ€” set the luma threshold for black. Accepts float numbers in the range [0.0,1.0], default value is 0.2. The value must be equal or less than "thr_w". ๐Ÿ–ค
  • thr_w โ€” set the luma threshold for white. Accepts float numbers in the range [0.0,1.0], default value is 0.6. The value must be equal or greater than "thr_b". ๐Ÿค
bestie note: those two thresholds are a couple, thr_b can never be bigger than thr_w ๐Ÿ˜ญ keep them in order or the vibe check fails

Examples

  • Detect and draw VITC data onto the video frame; if no valid VITC is detected, draw "--:--:--:--" as a placeholder:
ffmpeg -i input.avi -filter:v 'readvitc,drawtext=fontfile=FreeMono.ttf:text=%{metadata\\:lavfi.readvitc.tc_str\\:--\\\\\\:--\\\\\\:--\\\\\\:--}:x=(w-tw)/2:y=400-ascent'

๐Ÿงš remap ๐Ÿงš

Remap pixels using 2nd: Xmap and 3rd: Ymap input video stream. three inputs, one main character filter fr fr โœจ

Destination pixel at position (X, Y) will be picked from source (x, y) position where x = Xmap(X, Y) and y = Ymap(X, Y). If mapping values are out of range, zero value for pixel will be used for destination pixel. ๐Ÿซฅ

Xmap and Ymap input video streams must be of same dimensions. Output video stream will have Xmap/Ymap video stream dimensions. Xmap and Ymap input video streams are 16bit depth, single channel. ๐Ÿ“

  • format โ€” specify pixel format of output from this filter. Can be "color" or "gray". Default is "color". ๐ŸŒˆ
  • fill โ€” specify the color of the unmapped pixels. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual. Default color is "black". ๐Ÿ–ค

๐Ÿ’œ removegrain ๐Ÿ’œ

The removegrain filter is a spatial denoiser for progressive video. bye bye grain, we barely knew ye ๐Ÿงผโœจ

  • m0 โ€” set mode for the first plane. 1๏ธโƒฃ
  • m1 โ€” set mode for the second plane. 2๏ธโƒฃ
  • m2 โ€” set mode for the third plane. 3๏ธโƒฃ
  • m3 โ€” set mode for the fourth plane. 4๏ธโƒฃ

Range of mode is from 0 to 24. Description of each mode follows:

  • 0 โ€” Leave input plane unchanged. Default. ๐Ÿ˜ด
  • 1 โ€” Clips the pixel with the minimum and maximum of the 8 neighbour pixels.
  • 2 โ€” Clips the pixel with the second minimum and maximum of the 8 neighbour pixels.
  • 3 โ€” Clips the pixel with the third minimum and maximum of the 8 neighbour pixels.
  • 4 โ€” Clips the pixel with the fourth minimum and maximum of the 8 neighbour pixels. This is equivalent to a median filter. ๐ŸŽฏ
  • 5 โ€” Line-sensitive clipping giving the minimal change.
  • 6 โ€” Line-sensitive clipping, intermediate.
  • 7 โ€” Line-sensitive clipping, intermediate.
  • 8 โ€” Line-sensitive clipping, intermediate.
  • 9 โ€” Line-sensitive clipping on a line where the neighbours pixels are the closest.
  • 10 โ€” Replaces the target pixel with the closest neighbour. ๐Ÿซ‚
  • 11 โ€” [1 2 1] horizontal and vertical kernel blur. ๐ŸŒซ๏ธ
  • 12 โ€” Same as mode 11.
  • 13 โ€” Bob mode, interpolates top field from the line where the neighbours pixels are the closest.
  • 14 โ€” Bob mode, interpolates bottom field from the line where the neighbours pixels are the closest.
  • 15 โ€” Bob mode, interpolates top field. Same as 13 but with a more complicated interpolation formula.
  • 16 โ€” Bob mode, interpolates bottom field. Same as 14 but with a more complicated interpolation formula.
  • 17 โ€” Clips the pixel with the minimum and maximum of respectively the maximum and minimum of each pair of opposite neighbour pixels.
  • 18 โ€” Line-sensitive clipping using opposite neighbours whose greatest distance from the current pixel is minimal.
  • 19 โ€” Replaces the pixel with the average of its 8 neighbours. ๐Ÿงฎ
  • 20 โ€” Averages the 9 pixels ([1 1 1] horizontal and vertical blur).
  • 21 โ€” Clips pixels using the averages of opposite neighbour.
  • 22 โ€” Same as mode 21 but simpler and faster. โšก
  • 23 โ€” Small edge and halo removal, but reputed useless. ๐Ÿ’€ we said what we said
  • 24 โ€” Similar as 23.

Suppress a TV station logo, using an image file to determine which pixels comprise the logo. It works by filling in the pixels that comprise the logo with neighboring pixels. logo? never heard of her ๐Ÿ’…โœจ

The filter accepts the following options:

  • filename, f โ€” set the filter bitmap file, which can be any image format supported by libavformat. The width and height of the image file must match those of the video stream being processed. ๐Ÿ–ผ๏ธ

Pixels in the provided bitmap image with a value of zero are not considered part of the logo, non-zero pixels are considered part of the logo. If you use white (255) for the logo and black (0) for the rest, you will be safe. For making the filter bitmap, it is recommended to take a screen capture of a black frame with the logo visible, and then using a threshold filter followed by the erode filter once or twice. ๐Ÿ“ธ

ngl the "white for logo, black for everything else" trick is the whole game โ€” get that bitmap right and it's smooth sailing, get it wrong and you'll be smearing pixels around like ๐Ÿ˜ญ

okay bestie so if a few little splotches got left behind, you can absolutely fix those by hand ๐Ÿ’…. Just remember: if any logo pixels are not covered, the filter quality gets much worse. Marking too many pixels as part of the logo isn't as big a deal โ€” but it will increase the amount of blurring needed to cover over the image, and it'll destroy more information than necessary ๐Ÿ™ˆ. Also extra pixels will slow things down when it's a large logo, no cap.

๐ŸŒˆ repeatfields ๐ŸŒˆ

This filter uses the repeat_field flag from the Video ES headers and hard repeats fields based on its value. That's it, that's the vibe โœจ.

๐Ÿฆ‹ reverse ๐Ÿฆ‹

Reverses a video clip. Like, the whole thing. Backwards. Iconic ๐Ÿ’….

โš ๏ธ Warning: this filter needs memory to buffer the entire clip, so trimming is suggested. Do not just throw it at a two-hour video and walk away, bestie ๐Ÿ˜ญ.

โœจ Examples โœจ

  • Grab the first 5 seconds of a clip and reverse it:
trim=end=5,reverse

๐ŸŽ€ rgbashift ๐ŸŽ€

Shifts R/G/B/A pixels horizontally and/or vertically. Little nudge nudge, but make it pixel ๐ŸŒธ.

The filter accepts the following options:

  • rh โ€” set amount to shift red horizontally.
  • rv โ€” set amount to shift red vertically.
  • gh โ€” set amount to shift green horizontally.
  • gv โ€” set amount to shift green vertically.
  • bh โ€” set amount to shift blue horizontally.
  • bv โ€” set amount to shift blue vertically.
  • ah โ€” set amount to shift alpha horizontally.
  • av โ€” set amount to shift alpha vertically.
  • edge โ€” set edge mode; can be smear, default, or warp.

๐Ÿ’… Commands ๐Ÿ’…

This filter supports all the above options as commands ๐Ÿซถ.

๐Ÿ’œ roberts ๐Ÿ’œ

Applies the roberts cross operator to the input video stream. Edge detection energy, fr fr ๐Ÿฆ‹.

The filter accepts the following option:

  • planes โ€” set which planes will be processed; unprocessed planes will be copied. By default value 0xf, all planes will be processed.
  • scale โ€” set value which will be multiplied with the filtered result.
  • delta โ€” set value which will be added to the filtered result.

๐Ÿ’… Commands ๐Ÿ’…

This filter supports all the above options as commands.

โญ rotate โญ

Rotates video by an arbitrary angle expressed in radians. Spinning that video like it's the main character ๐Ÿ‘‘

The filter accepts the following options:

A description of the optional parameters follows.

  • angle, a โ€” set an expression for the angle by which to rotate the input video clockwise, expressed as a number of radians. A negative value will result in a counter-clockwise rotation. By default it is set to "0".

This expression is evaluated for each frame.

  • out_w, ow โ€” set the output width expression, default value is "iw". This expression is evaluated just once during configuration.
  • out_h, oh โ€” set the output height expression, default value is "ih". This expression is evaluated just once during configuration.
  • bilinear โ€” enable bilinear interpolation if set to 1, a value of 0 disables it. Default value is 1.
  • fillcolor, c โ€” set the color used to fill the output area not covered by the rotated image. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual. If the special value "none" is selected then no background is printed (useful for example if the background is never shown).

Default value is "black".

The expressions for the angle and the output size can contain the following constants and functions:

  • n โ€” sequential number of the input frame, starting from 0. It is always NAN before the first frame is filtered.
  • t โ€” time in seconds of the input frame, it is set to 0 when the filter is configured. It is always NAN before the first frame is filtered.
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example for the pixel format yuv422p hsub is 2 and vsub is 1.
  • in_w, iw, in_h, ih โ€” the input video width and height.
  • out_w, ow, out_h, oh โ€” the output width and height, that is the size of the padded area as specified by the width and height expressions.
  • rotw(a), roth(a) โ€” the minimal width/height required for completely containing the input video rotated by a radians.

These are only available when computing the out_w and out_h expressions.

๐ŸŒธ Examples ๐ŸŒธ

  • Rotate the input by PI/6 radians clockwise:
rotate=PI/6
  • Rotate the input by PI/6 radians counter-clockwise:
rotate=-PI/6
  • Rotate the input by 45 degrees clockwise:
rotate=45*PI/180
  • Apply a constant rotation with period T, starting from an angle of PI/3:
rotate=PI/3+2*PI*t/T
  • Make the input video rotation oscillating with a period of T seconds and an amplitude of A radians:
rotate=A*sin(2*PI/T*t)
  • Rotate the video, output size is chosen so that the whole rotating input video is always completely contained in the output:
rotate='2*PI*t:ow=hypot(iw,ih):oh=ow'
  • Rotate the video, reduce the output size so that no background is ever shown:
rotate=2*PI*t:ow='min(iw,ih)/sqrt(2)':oh=ow:c=none

๐Ÿซถ Commands ๐Ÿซถ

The filter supports the following commands:

  • a, angle โ€” set the angle expression. The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value.

๐Ÿงš sab ๐Ÿงš

Applies Shape Adaptive Blur. Soft focus but make it algorithmic โœจ.

The filter accepts the following options:

  • luma_radius, lr โ€” set luma blur filter strength, must be a value in range 0.1-4.0, default value is 1.0. A greater value will result in a more blurred image, and in slower processing.
  • luma_pre_filter_radius, lpfr โ€” set luma pre-filter radius, must be a value in the 0.1-2.0 range, default value is 1.0.
  • luma_strength, ls โ€” set luma maximum difference between pixels to still be considered, must be a value in the 0.1-100.0 range, default value is 1.0.
  • chroma_radius, cr โ€” set chroma blur filter strength, must be a value in range -0.9-4.0. A greater value will result in a more blurred image, and in slower processing.
  • chroma_pre_filter_radius, cpfr โ€” set chroma pre-filter radius, must be a value in the -0.9-2.0 range.
  • chroma_strength, cs โ€” set chroma maximum difference between pixels to still be considered, must be a value in the -0.9-100.0 range.

Each chroma option value, if not explicitly specified, is set to the corresponding luma option value ๐Ÿ‘‘.

๐Ÿ“ scale ๐Ÿ“

Scale (resize) the input video, using the libswscale library. The glow-up filter, literally ๐Ÿ’….

The scale filter forces the output display aspect ratio to be the same of the input, by changing the output sample aspect ratio.

If the input image format is different from the format requested by the next filter, the scale filter will convert the input to the requested format.

๐ŸŒˆ Options ๐ŸŒˆ

The filter accepts the following options, any of the options supported by the libswscale scaler, as well as any of the framesync options.

See the ffmpeg-scaler manual for the complete list of scaler options.

  • width, w, height, h โ€” set the output video dimension expression. Default value is the input dimension.

If the width or w value is 0, the input width is used for the output. If the height or h value is 0, the input height is used for the output.

If one and only one of the values is -n with n >= 1, the scale filter will use a value that maintains the aspect ratio of the input image, calculated from the other specified dimension. After that it will, however, make sure that the calculated dimension is divisible by n and adjust the value if necessary.

If both values are -n with n >= 1, the behavior will be identical to both values being set to 0 as previously detailed.

See below for the list of accepted constants for use in the dimension expression.

  • eval โ€” specify when to evaluate width and height expression. It accepts the following values:
    • init โ€” only evaluate expressions once during the filter initialization or when a command is processed.
    • frame โ€” evaluate expressions for each incoming frame.

Default value is init.

  • interl โ€” set the interlacing mode. It accepts the following values:
    • 1 โ€” force interlaced aware scaling.
    • 0 โ€” do not apply interlaced scaling.
    • -1 โ€” select interlaced aware scaling depending on whether the source frames are flagged as interlaced or not.

Default value is 0.

  • flags โ€” set libswscale scaling flags. See the ffmpeg-scaler manual for the complete list of values. If not explicitly specified the filter applies the default flags.
  • param0, param1 โ€” set libswscale input parameters for scaling algorithms that need them. See the ffmpeg-scaler manual for the complete documentation. If not explicitly specified the filter applies empty parameters.
  • intent โ€” set the ICC rendering intent to use when transforming between different color spaces. It accepts the following values:
    • perceptual โ€” use a perceptually guided tone and gamut mapping curve. The exact details of the mapping used may change at any time and should not be relied on as stable. This intent is recommended for final viewing of image/video content in typical viewing settings.
    • relative_colorimetric โ€” statically clip out-of-gamut colors using a colorimetric clipping curve which attempts to find the colorimetrically least dissimilar in-gamut color. This intent performs white point adaptation and black point adaptation. This is the default. This intent is recommended wherever faithful color reproduction is of the utmost importance, even at the cost of clipping.
    • absolute_colorimetric โ€” hard clip out-of-gamut colors with no attempt at white or black point reproduction. This intent will reproduce in-gamut colors 1:1 on the output display as they would appear on the reference display, assuming the output display is appropriately calibrated.
    • saturation โ€” performs saturation mapping โ€” that is, stretches the input color volume directly onto the output color volume, in non-linear fashion that preserves the original signal appearance as much as possible. This intent is recommended for signal content evaluation, as it will not lead to any clipping. It is roughly analogous to not performing any color mapping, although it still takes into account the mastering display primaries and any differences in encoding TRC.
  • size, s โ€” set the video size. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.
  • in_color_matrix, out_color_matrix โ€” set in/output YCbCr color space type.

This lets you override whatever was autodetected, and lets you force a specific value for the output and encoder. If you don't specify it, the color space type just depends on the pixel format. Possible values, bestie:

  • auto โ€” choose automatically ๐Ÿช„
  • bt709 โ€” format conforming to International Telecommunication Union (ITU) Recommendation BT.709.
  • fcc โ€” set color space conforming to the United States Federal Communications Commission (FCC) Code of Federal Regulations (CFR) Title 47 (2003) 73.682 (a).
  • bt601, bt470, smpte170m โ€” set color space conforming to:
    • ITU Radiocommunication Sector (ITU-R) Recommendation BT.601
    • ITU-R Rec. BT.470-6 (1998) Systems B, B1, and G
    • Society of Motion Picture and Television Engineers (SMPTE) ST 170:2004
  • smpte240m โ€” set color space conforming to SMPTE ST 240:1999.
  • bt2020 โ€” set color space conforming to ITU-R BT.2020 non-constant luminance system.

in_range, out_range

Set the in/output YCbCr sample range, queen ๐Ÿ’…

This overrides the autodetected value and lets you force a specific one for the output and encoder. If you don't specify it, the range depends on the pixel format. Possible values:

  • auto / unknown โ€” choose automatically.
  • jpeg / full / pc โ€” set full range (0-255 in case of 8-bit luma).
  • mpeg / limited / tv โ€” set "MPEG" range (16-235 in case of 8-bit luma).

in_chroma_loc, out_chroma_loc

Set in/output chroma sample location. If you don't specify it, center-sited chroma is what you get by default, no cap. Possible values:

  • auto, unknown
  • left
  • center
  • topleft
  • top
  • bottomleft
  • bottom

in_primaries, out_primaries

Set in/output RGB primaries ๐ŸŽจ

Again โ€” overrides the autodetected value, and forces whatever you want for the output and encoder. Possible values:

  • auto โ€” choose automatically. This is the default โœจ
  • bt709
  • bt470m
  • bt470bg
  • smpte170m
  • smpte240m
  • film
  • bt2020
  • smpte428
  • smpte431
  • smpte432
  • jedec-p22
  • ebu3213

in_transfer, out_transfer

Set in/output transfer response curve (TRC). Same deal as always: overrides the autodetected value and forces a specific one for the output and encoder. Possible values:

  • auto โ€” choose automatically. This is the default โœจ
  • bt709
  • bt470m
  • gamma22
  • bt470bg
  • gamma28
  • smpte170m
  • smpte240m
  • linear
  • iec61966-2-1
  • srgb
  • iec61966-2-4
  • xvycc
  • bt1361e
  • bt2020-10
  • bt2020-12
  • smpte2084
  • smpte428
  • arib-std-b67

force_original_aspect_ratio

Turns on decreasing or increasing the output video width or height when it's necessary to keep the original aspect ratio. Possible values:

  • disable โ€” scale the video exactly as specified and turn this feature off.
  • decrease โ€” the output video dimensions get automatically decreased if needed.
  • increase โ€” the output video dimensions get automatically increased if needed.

Okay so a genuinely useful moment for this one: when you know a specific device's maximum allowed resolution, you can use this to cap the output video at that โ€” while retaining the aspect ratio. Example time ๐Ÿ’– device A allows 1280x720 playback, and your video is 1920x800. Use this option (set it to decrease) and pass 1280x720 on the command line, and your output is 1280x533.

โš ๏ธ Please note this is a different thing than specifying -1 for w or h โ€” you still need to specify the output resolution for this option to work, bestie. Not me having to say it twice ๐Ÿ˜ญ

force_divisible_by

Ensures both output dimensions โ€” width and height โ€” are divisible by the given integer, when used together with force_original_aspect_ratio. Works similar to using -n in the w and h options ๐Ÿ‘‘

This option respects whatever value you set for force_original_aspect_ratio, increasing or decreasing the resolution accordingly. Heads up though: the video's aspect ratio may be slightly modified ๐Ÿ˜ฌ

This one's handy if you need a video to fit within (or exceed) a defined resolution using force_original_aspect_ratio, but you also have encoder restrictions on width or height divisibility.

reset_sar

Turning this on makes the output SAR reset to 1. On top of that, if you request proportional scaling through the width or height expressions โ€” like w=-4:h=360 or w=iw/2:h=-1 โ€” or by enabling force_original_aspect_ratio, then the input DAR gets taken into account and the output is scaled to produce square pixels. Default is false.


Now the values of the w and h options are expressions, and those expressions contain the following constants (iykyk, this is the fun part) ๐Ÿงš

  • in_w, in_h โ€” the input width and height.
  • iw, ih โ€” these are the same as in_w and in_h.
  • out_w, out_h โ€” the output (scaled) width and height.
  • ow, oh โ€” these are the same as out_w and out_h.
  • a โ€” the same as iw / ih.
  • sar โ€” input sample aspect ratio.
  • dar โ€” the input display aspect ratio. Calculated from (iw / ih) * sar.
  • hsub, vsub โ€” horizontal and vertical input chroma subsample values. For example, for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • ohsub, ovsub โ€” horizontal and vertical output chroma subsample values. For example, for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • n โ€” the (sequential) number of the input frame, starting from 0. Only available with eval=frame.
  • t โ€” the presentation timestamp of the input frame, expressed as a number of seconds. Only available with eval=frame.
  • pos โ€” the position (byte offset) of the frame in the input stream, or NaN if this information is unavailable and/or meaningless (for example in case of synthetic video). Only available with eval=frame. Deprecated, do not use ๐Ÿšซ
  • ref_w, rw, ref_h, rh, ref_a, ref_dar, rdar, ref_n, ref_t, ref_pos โ€” equivalent to the above, but for a second reference input. If any of these variables are present, this filter accepts two inputs ๐Ÿ‘€

๐ŸŒธ Examples ๐ŸŒธ

  • Scale the input video to a size of 200x100:
scale=w=200:h=100

This is equivalent to:

scale=200:100

or:

scale=200x100
  • Specify a size abbreviation for the output size:
scale=qcif

which can also be written as:

scale=size=qcif
  • Scale the input to 2x:
scale=w=2*iw:h=2*ih
  • The above is the same as:
scale=2*in_w:2*in_h
  • Scale the input to 2x with forced interlaced scaling:
scale=2*iw:2*ih:interl=1
  • Scale the input to half size:
scale=w=iw/2:h=ih/2
  • Increase the width, and set the height to the same size:
scale=3/2*iw:ow
  • Seek Greek harmony ๐Ÿ›๏ธโœจ
scale=iw:1/PHI*iw
scale=ih*PHI:ih
  • Increase the height, and set the width to 3/2 of the height:
scale=w=3/2*oh:h=3/5*ih
  • Increase the size, making the size a multiple of the chroma subsample values:
scale="trunc(3/2*iw/hsub)*hsub:trunc(3/2*ih/vsub)*vsub"
  • Increase the width to a maximum of 500 pixels, keeping the same aspect ratio as the input:
scale=w='min(500\, iw*3/2):h=-1'
  • Make pixels square by combining scale and setsar:
scale='trunc(ih*dar):ih',setsar=1/1
  • Make pixels square using reset_sar, making sure the resulting resolution is even (required by some codecs):
scale='-2:ih-mod(ih,2):reset_sar=1'
  • Scale to target exactly, however reset SAR to 1:
scale='400:300:reset_sar=1'
  • Scale to even dimensions that fit within 400x300, preserving input SAR:
scale='400:300:force_original_aspect_ratio=decrease:force_divisible_by=2'
  • Scale to produce square pixels with even dimensions that fit within 400x300:
scale='400:300:force_original_aspect_ratio=decrease:force_divisible_by=2:reset_sar=1'
  • Scale a subtitle stream (sub) to match the main video (main) in size before overlaying. (scale2ref)
'[main]split[a][b]; [ref][a]scale=rw:rh[c]; [b][c]overlay'
  • Scale a logo to 1/10th the height of a video, while preserving its display aspect ratio.
[logo-in][video-in]scale=w=oh*dar:h=rh/10[logo-out]

๐ŸŽฎ Commands

This filter supports the following commands:

  • width, w, height, h โ€” set the output video dimension expression. The command accepts the same syntax of the corresponding option. If the specified expression is not valid, it's kept at its current value (no chaos, no crash ๐Ÿ’…).

scharr

Applies the scharr operator to the input video stream. Edge-detection core ๐Ÿฆ‹

The filter accepts the following option:

  • planes โ€” set which planes will be processed; unprocessed planes will be copied. By default value 0xf, so all planes get processed.
  • scale โ€” set value which will be multiplied with filtered result.
  • delta โ€” set value which will be added to filtered result.

๐ŸŽฎ Commands

This filter supports the all above options as commands.


scroll

Scrolls the input video horizontally and/or vertically by constant speed. Like a slow cinematic pan, but make it a filter ๐ŸŽ€

The filter accepts the following options:

  • horizontal, h โ€” set the horizontal scrolling speed. Default is 0. Allowed range is from -1 to 1. Negative values change the scrolling direction.
  • vertical, v โ€” set the vertical scrolling speed. Default is 0. Allowed range is from -1 to 1. Negative values change the scrolling direction.
  • hpos โ€” set the initial horizontal scrolling position. Default is 0. Allowed range is from 0 to 1.
  • vpos โ€” set the initial vertical scrolling position. Default is 0. Allowed range is from 0 to 1.

๐ŸŽฎ Commands

This filter supports the following commands:

  • horizontal, h โ€” set the horizontal scrolling speed.
  • vertical, v โ€” set the vertical scrolling speed.

scdet

Detects video scene change ๐Ÿ‘‘

This filter sets frame metadata with mafd between frame, the scene score, and forwards the frame to the next filter, so they can use these metadata to detect scene change or others. Main character energy, honestly.

okay so this filter is also gonna log a message and set frame metadata the second it catches a scene change by threshold ๐Ÿ‘€

The lavfi.scd.mafd metadata keys get set with mafd for every single frame, no skips.

The lavfi.scd.score metadata keys get set with the scene change score for every frame, so you can actually detect scene change. ๐Ÿ’…

The lavfi.scd.time metadata keys get set with the current filtered frame time โ€” that's the one that detects scene change with threshold, iykyk.

This filter accepts the following options:

  • threshold, t โ€” sets the scene change detection threshold as a percentage of maximum change. Good values live in the [8.0, 14.0] range, and the range for threshold itself is [0., 100.]. Default value is 10.. โœจ
  • sc_pass, s โ€” sets the flag to pass scene change frames to the next filter. Default value is 0. You can enable it if you want to get a snapshot of scene change frames only. ๐ŸŽ€

๐ŸŽจ selectivecolor

So this one adjusts cyan, magenta, yellow and black (CMYK) to certain ranges of colors โ€” think "reds", "yellows", "greens", "cyans", ... you get it. The adjustment range is defined by the purity of the color (aka how saturated it already is). It's giving Adobe Photoshop Selective Color tool, lowkey the same vibe. ๐Ÿ–Œ๏ธ

The filter accepts the following options:

  • correction_method โ€” selects the color correction method. Available values are:
    • absolute โ€” the specified adjustments are applied "as-is" (added/subtracted to the original pixel component value).
    • relative โ€” the specified adjustments are relative to the original component value.

Default is absolute.

  • reds โ€” adjustments for red pixels (pixels where the red component is the maximum)
  • yellows โ€” adjustments for yellow pixels (pixels where the blue component is the minimum)
  • greens โ€” adjustments for green pixels (pixels where the green component is the maximum)
  • cyans โ€” adjustments for cyan pixels (pixels where the red component is the minimum)
  • blues โ€” adjustments for blue pixels (pixels where the blue component is the maximum)
  • magentas โ€” adjustments for magenta pixels (pixels where the green component is the minimum)
  • whites โ€” adjustments for white pixels (pixels where all components are greater than 128)
  • neutrals โ€” adjustments for all pixels except pure black and pure white
  • blacks โ€” adjustments for black pixels (pixels where all components are lesser than 128)
  • psfile โ€” specify a Photoshop selective color file (.asv) to import the settings from ๐Ÿ“

All the adjustment settings (reds, yellows, ...) accept up to 4 space separated floating point adjustment values in the [-1,1] range, respectively to adjust the amount of cyan, magenta, yellow and black for the pixels of its range. ๐Ÿ’–

๐ŸŒธ Examples

  • Increase cyan by 50% and reduce yellow by 33% in every green areas, and increase magenta by 27% in blue areas:
selectivecolor=greens=.5 0 -.33 0:blues=0 .27
  • Use a Photoshop selective color preset:
selectivecolor=psfile=MySelectiveColorPresets/Misty.asv

โœ‚๏ธ separatefields

The separatefields filter takes a frame-based video input and splits each frame into its component fields, producing a new half height clip with twice the frame rate and twice the frame count. iconic behaviour honestly ๐Ÿฆ‹

This filter uses field-dominance information in frame to decide which of each pair of fields to place first in the output. If it gets it wrong, use setfield filter before separatefields filter. ๐Ÿ™ˆ


๐Ÿ“ setdar, setsar

The setdar filter sets the Display Aspect Ratio for the filter output video.

This is done by changing the specified Sample (aka Pixel) Aspect Ratio, according to the following equation:

<DAR> = <HORIZONTAL_RESOLUTION> / <VERTICAL_RESOLUTION> * <SAR>

Keep in mind that the setdar filter does not modify the pixel dimensions of the video frame. Also, the display aspect ratio set by this filter may be changed by later filters in the filterchain, e.g. in case of scaling or if another setdar or a setsar filter is applied. ๐Ÿ˜ญ

The setsar filter sets the Sample (aka Pixel) Aspect Ratio for the filter output video.

Note that as a consequence of the application of this filter, the output display aspect ratio will change according to the equation above.

Keep in mind that the sample aspect ratio set by the setsar filter may be changed by later filters in the filterchain, e.g. if another setsar or a setdar filter is applied.

It accepts the following parameters:

  • r, ratio, dar (setdar only), sar (setsar only) โ€” set the aspect ratio used by the filter. The parameter can be a floating point number string, or an expression. If the parameter is not specified, the value 0 is assumed, meaning that the same input value is used.
  • max โ€” set the maximum integer value to use for expressing numerator and denominator when reducing the expressed aspect ratio to a rational. Default value is 100.

The parameter sar is an expression containing the following constants:

  • w, h โ€” the input width and height.
  • a โ€” same as w / h.
  • sar โ€” the input sample aspect ratio.
  • dar โ€” the input display aspect ratio. It is the same as (w / h) * sar.
  • hsub, vsub โ€” horizontal and vertical chroma subsample values. For example, for the pixel format yuv422p hsub is 2 and vsub is 1. ๐ŸŒˆ

๐Ÿ’œ Examples

  • To change the display aspect ratio to 16:9, specify one of the following:
setdar=dar=1.77777
setdar=dar=16/9
  • To change the sample aspect ratio to 10:11, specify:
setsar=sar=10/11
  • To set a display aspect ratio of 16:9, and specify a maximum integer value of 1000 in the aspect ratio reduction, use the command:
setdar=ratio=16/9:max=1000

๐Ÿ setfield

Force field for the output video frame.

The setfield filter marks the interlace type field for the output frames. It does not change the input frame โ€” it only sets the corresponding property, which affects how the frame is treated by following filters (e.g. fieldorder or yadif). bestie it's just setting the vibe check for downstream filters, fr fr ๐Ÿ’…

The filter accepts the following options:

  • mode โ€” available values are:
    • auto โ€” keep the same field property.
    • bff โ€” mark the frame as bottom-field-first.
    • tff โ€” mark the frame as top-field-first.
    • prog โ€” mark the frame as progressive.

โš™๏ธ setparams

Force frame parameter for the output video frame.

The setparams filter marks interlace and color range for the output frames. It does not change the input frame, but only sets the corresponding property, which affects how the frame is treated by filters/encoders. ๐Ÿซถ

  • field_mode โ€” available values are:
    • auto โ€” keep the same field property (default).
    • bff โ€” mark the frame as bottom-field-first.
    • tff โ€” mark the frame as top-field-first.
    • prog โ€” mark the frame as progressive.
  • range โ€” available values are:
    • auto โ€” keep the same color range property (default).
    • unspecified, unknown โ€” mark the frame as unspecified color range.
    • limited, tv, mpeg โ€” mark the frame as limited range.
    • full, pc, jpeg โ€” mark the frame as full range.
  • color_primaries โ€” set the color primaries. Available values are:
    • auto โ€” keep the same color primaries property (default).
    • bt709
    • unknown
    • bt470m
    • bt470bg
    • smpte170m
    • smpte240m
    • film
    • bt2020
    • smpte428
    • smpte431
    • smpte432
    • jedec-p22
  • color_trc โ€” set the color transfer. Available values are:
    • auto โ€” keep the same color trc property (default).
    • bt709
    • unknown
    • bt470m
    • bt470bg
    • smpte170m
    • smpte240m
    • linear
    • log100
    • log316
    • iec61966-2-4
    • bt1361e
    • iec61966-2-1
    • bt2020-10
    • bt2020-12
    • smpte2084
    • smpte428
    • arib-std-b67
  • colorspace โ€” set the colorspace. Available values are:
    • auto โ€” keep the same colorspace property (default).
    • gbr
    • bt709
    • unknown
    • fcc
    • bt470bg
    • smpte170m
    • smpte240m
    • ycgco
    • bt2020nc
    • bt2020c
    • smpte2085
    • chroma-derived-nc
    • chroma-derived-c
    • ictcp
  • chroma_location โ€” set the chroma sample location. Available values are:
    • auto โ€” keep the same chroma location (default).
    • unspecified, unknown
    • left
    • center
    • topleft
    • top
    • bottomleft
    • bottom
  • alpha_mode โ€” set the alpha mode. Available values are:
    • auto โ€” keep the same alpha mode (default).
    • unspecified, unknown
    • premultiplied
    • straight

๐ŸŒ€ shear

Apply shear transform to input video.

This filter supports the following options:

  • shx โ€” shear factor in X-direction. Default value is 0. Allowed range is from -2 to 2.
  • shy โ€” shear factor in Y-direction. Default value is 0. Allowed range is from -2 to 2.
  • fillcolor, c โ€” set the color used to fill the output area not covered by the transformed video. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual. If the special value none is selected then no background is printed (useful for example if the background is never shown). Default value is black. ๐Ÿ–ค
  • interp โ€” set interpolation type. Can be bilinear or nearest. Default is bilinear.

๐ŸŽฎ Commands

This filter supports the all above options as commands. periodt ๐Ÿ’…


๐Ÿ” showinfo

Show a line containing various information for each input video frame. The input video is not modified โ€” it's just here to spill the tea about your frames, obsessed โ˜•โœจ

This filter supports the following options:

  • checksum โ€” calculate checksums of each plane. By default enabled.
  • udu_sei_as_ascii โ€” try to print user data unregistered SEI as ascii character when possible, in hex format otherwise.

The shown line contains a sequence of key/value pairs of the form key:value.

The following values are shown in the output:

  • n โ€” the (sequential) number of the input frame, starting from 0.
  • pts โ€” the Presentation TimeStamp of the input frame, expressed as a number of time base units. The time base unit depends on the filter input pad.
  • pts_time โ€” the Presentation TimeStamp of the input frame, expressed as a number of seconds.
  • fmt โ€” the pixel format name.
  • sar โ€” the sample aspect ratio of the input frame, expressed in the form num/den. ๐Ÿฆ‹
  • s โ€” the size of the input frame. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. ๐Ÿ“
  • i โ€” the type of interlaced mode (P for progressive, T for top field first, B for bottom field first).
  • iskey โ€” this is 1 if the frame is a key frame, 0 otherwise. ๐Ÿ”‘
  • type โ€” the picture type of the input frame (I for an I-frame, P for a P-frame, B for a B-frame, or ? for an unknown type). Also refer to the documentation of the AVPictureType enum and of the av_get_picture_type_char function defined in libavutil/avutil.h.
  • checksum โ€” the Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame.
  • plane_checksum โ€” the Adler-32 checksum (printed in hexadecimal) of each plane of the input frame, expressed in the form [c0 c1 c2 c3].
  • mean โ€” the mean value of pixels in each plane of the input frame, expressed in the form [mean0 mean1 mean2 mean3].
  • stdev โ€” the standard deviation of pixel values in each plane of the input frame, expressed in the form [stdev0 stdev1 stdev2 stdev3].

๐ŸŽจ showpalette

Displays the 256 colors palette of each frame. Heads up bestie โ€” this filter is only relevant for pal8 pixel format frames. ๐Ÿ–Œ๏ธ

It accepts the following option:

  • s โ€” set the size of the box used to represent one palette color entry. Default is 30 (for a 30x30 pixel box). ๐ŸŽ

๐Ÿ”€ shuffleframes

Reorder and/or duplicate and/or drop video frames. It's giving DJ set energy, fr fr. ๐ŸŽง

It accepts the following parameters:

  • mapping โ€” set the destination indexes of input frames. This is a space or '|' separated list of indexes that maps input frames to output frames. The number of indexes also sets the maximal value that each index may have. The '-1' index has a special meaning, and that is to drop the frame. ๐Ÿ’€

The first frame has the index 0. The default is to keep the input unchanged.

โœจ Examples

  • Swap second and third frame of every three frames of the input:
ffmpeg -i INPUT -vf "shuffleframes=0 2 1" OUTPUT
  • Swap 10th and 1st frame of every ten frames of the input:
ffmpeg -i INPUT -vf "shuffleframes=9 1 2 3 4 5 6 7 8 0" OUTPUT

๐Ÿงฉ shufflepixels

Reorder pixels in video frames. Chaos, but make it aesthetic. ๐ŸŒช๏ธ

This filter accepts the following options:

  • direction, d โ€” set shuffle direction. Can be forward or inverse direction. Default direction is forward.
  • mode, m โ€” set shuffle mode. Can be horizontal, vertical or block mode.
  • width, w and height, h โ€” set shuffle block_size. In case of horizontal shuffle mode only the width part of size is used, and in case of vertical shuffle mode only the height part of size is used.
  • seed, s โ€” set random seed used with shuffling pixels. Mainly useful to set to be able to reverse the filtering process to get original input. For example, to reverse a forward shuffle you need to use the same parameters and the exact same seed and to set direction to inverse. ๐ŸŽฒ

๐Ÿ›ธ shuffleplanes

Reorder and/or duplicate video planes. Plane-shuffling era, no cap.

It accepts the following parameters:

  • map0 โ€” the index of the input plane to be used as the first output plane.
  • map1 โ€” the index of the input plane to be used as the second output plane.
  • map2 โ€” the index of the input plane to be used as the third output plane.
  • map3 โ€” the index of the input plane to be used as the fourth output plane.

The first plane has the index 0. The default is to keep the input unchanged.

โœจ Examples

  • Swap the second and third planes of the input:
ffmpeg -i INPUT -vf shuffleplanes=0:2:1:3 OUTPUT

๐Ÿ“Š signalstats

Evaluate various visual metrics that assist in determining issues associated with the digitization of analog video media. Basically it's a vibe check for crusty analog captures. ๐Ÿ“ผโœจ

By default the filter will log these metadata values:

  • YMIN โ€” display the minimal Y value contained within the input frame. Expressed in range of [0-255].
  • YLOW โ€” display the Y value at the 10% percentile within the input frame. Expressed in range of [0-255].
  • YAVG โ€” display the average Y value within the input frame. Expressed in range of [0-255].
  • YHIGH โ€” display the Y value at the 90% percentile within the input frame. Expressed in range of [0-255].
  • YMAX โ€” display the maximum Y value contained within the input frame. Expressed in range of [0-255].
  • UMIN โ€” display the minimal U value contained within the input frame. Expressed in range of [0-255].
  • ULOW โ€” display the U value at the 10% percentile within the input frame. Expressed in range of [0-255].
  • UAVG โ€” display the average U value within the input frame. Expressed in range of [0-255].
  • UHIGH โ€” display the U value at the 90% percentile within the input frame. Expressed in range of [0-255].
  • UMAX โ€” display the maximum U value contained within the input frame. Expressed in range of [0-255].
  • VMIN โ€” display the minimal V value contained within the input frame. Expressed in range of [0-255].
  • VLOW โ€” display the V value at the 10% percentile within the input frame. Expressed in range of [0-255].
  • VAVG โ€” display the average V value within the input frame. Expressed in range of [0-255].
  • VHIGH โ€” display the V value at the 90% percentile within the input frame. Expressed in range of [0-255].
  • VMAX โ€” display the maximum V value contained within the input frame. Expressed in range of [0-255].
  • SATMIN โ€” display the minimal saturation value contained within the input frame. Expressed in range of [0-~181.02].
  • SATLOW โ€” display the saturation value at the 10% percentile within the input frame. Expressed in range of [0-~181.02].
  • SATAVG โ€” display the average saturation value within the input frame. Expressed in range of [0-~181.02].
  • SATHIGH โ€” display the saturation value at the 90% percentile within the input frame. Expressed in range of [0-~181.02].
  • SATMAX โ€” display the maximum saturation value contained within the input frame. Expressed in range of [0-~181.02].
  • HUEMED โ€” display the median value for hue within the input frame. Expressed in range of [0-360].
  • HUEAVG โ€” display the average value for hue within the input frame. Expressed in range of [0-360].
  • YDIF โ€” display the average of sample value difference between all values of the Y plane in the current frame and corresponding values of the previous input frame. Expressed in range of [0-255].
  • UDIF โ€” display the average of sample value difference between all values of the U plane in the current frame and corresponding values of the previous input frame. Expressed in range of [0-255].
  • VDIF โ€” display the average of sample value difference between all values of the V plane in the current frame and corresponding values of the previous input frame. Expressed in range of [0-255].
  • YBITDEPTH โ€” display bit depth of Y plane in current frame. Expressed in range of [0-16].
  • UBITDEPTH โ€” display bit depth of U plane in current frame. Expressed in range of [0-16].
  • VBITDEPTH โ€” display bit depth of V plane in current frame. Expressed in range of [0-16].

The filter accepts the following options:

  • stat, out โ€” stat specifies an additional form of image analysis. out outputs video with the specified type of pixel highlighted. ๐Ÿ‘€

Both options accept the following values:

  • tout โ€” identify temporal outliers pixels. A temporal outlier is a pixel unlike the neighboring pixels of the same field. Examples of temporal outliers include the results of video dropouts, head clogs, or tape tracking issues.
  • vrep โ€” identify vertical line repetition. Vertical line repetition includes similar rows of pixels within a frame. In born-digital video vertical line repetition is common, but this pattern is uncommon in video digitized from an analog source. When it occurs in video that results from the digitization of an analog source it can indicate concealment from a dropout compensator.
  • brng โ€” identify pixels that fall outside of legal broadcast range.
  • color, c โ€” set the highlight color for the out option. The default color is yellow. ๐Ÿ’›

โœจ Examples

  • Output data of various video metrics:
ffprobe -f lavfi movie=example.mov,signalstats="stat=tout+vrep+brng" -show_frames
  • Output specific data about the minimum and maximum values of the Y plane per frame:
ffprobe -f lavfi movie=example.mov,signalstats -show_entries frame_tags=lavfi.signalstats.YMAX,lavfi.signalstats.YMIN
  • Playback video while highlighting pixels that are outside of broadcast range in red:
ffplay example.mov -vf signalstats="out=brng:color=red"
  • Playback video with signalstats metadata drawn over the frame:
ffplay example.mov -vf signalstats=stat=brng+vrep+tout,drawtext=fontfile=FreeSerif.ttf:textfile=signalstat_drawtext.txt

The contents of signalstat_drawtext.txt used in the command are:

time %{pts:hms}
Y (%{metadata:lavfi.signalstats.YMIN}-%{metadata:lavfi.signalstats.YMAX})
U (%{metadata:lavfi.signalstats.UMIN}-%{metadata:lavfi.signalstats.UMAX})
V (%{metadata:lavfi.signalstats.VMIN}-%{metadata:lavfi.signalstats.VMAX})
saturation maximum: %{metadata:lavfi.signalstats.SATMAX}

๐Ÿ–‹๏ธ signature

Calculates the MPEG-7 Video Signature. The filter can handle more than one input. In this case the matching between the inputs can be calculated additionally. The filter always passes through the first input. The signature of each stream can be written into a file. ๐Ÿงพโœจ

It accepts the following options:

  • detectmode โ€” enable or disable the matching process.

Available values are:

  • off โ€” disable the calculation of a matching (default).
  • full โ€” calculate the matching for the whole video and output whether the whole video matches or only parts.
  • fast โ€” calculate only until a matching is found or the video ends. Should be faster in some cases.
  • nb_inputs โ€” set the number of inputs. The option value must be a non negative integer. Default value is 1. ๐Ÿ”ข
  • filename โ€” where the output goes ๐Ÿ’พ. Lowkey important detail: if you feed it more than one input, this path has to be a prototype, meaning it must contain %d or %0nd (n = a positive integer) โ€” that part gets swapped out for the input number. And if you don't set a filename at all? Nothing gets written. That's the default, bestie.
  • format โ€” pick your output format. The options are:
    • binary โ€” use the specified binary representation. This is the default one, no cap.
    • xml โ€” use the specified xml representation.
  • th_d โ€” threshold for detecting one word as similar. Gotta be an integer greater than zero. Default is 9000.
  • th_dc โ€” threshold for detecting all words as similar. Integer greater than zero, please. Default is 60000.
  • th_xh โ€” threshold for detecting frames as similar. Integer greater than zero. Default is 116.
  • th_di โ€” the minimum length of a sequence (in frames) before it counts as a matching sequence. Gotta be a non-negative integer. Default is 0.
  • th_it โ€” the minimum relation that matching frames to all frames must have. Double value between 0 and 1, periodt. Default is 0.5.

โœจ Examples โœจ

  • Wanna calculate the signature of an input video and stash it in signature.bin? Say less:
ffmpeg -i input.mkv -vf signature=filename=signature.bin -map 0:v -f null -
  • Wanna detect whether two videos match and drop the signatures in XML format into signature0.xml and signature1.xml? Iconic, here you go:
ffmpeg -i input1.mkv -i input2.mkv -filter_complex "[0:v][1:v] signature=nb_inputs=2:detectmode=full:format=xml:filename=signature%d.xml" -map :v -f null -

siti ๐ŸŒธ

Calculates Spatial Information (SI) and Temporal Information (TI) scores for a video, exactly as defined in ITU-T Rec. P.910 (11/21): Subjective video quality assessment methods for multimedia applications. The PDF lives at https://www.itu.int/rec/T-REC-P.910-202111-S/en.

Heads up bestie ๐Ÿšจ โ€” this is a legacy implementation that corresponds to a superseded recommendation. For the latest version, go look at ITU-T Rec. P.910 (07/22): https://www.itu.int/rec/T-REC-P.910-202207-I/en

It accepts this one option:

  • print_summary โ€” if you set it to 1, summary statistics get printed to the console. Default is 0.

๐Ÿ’– Examples ๐Ÿ’–

  • Calculating SI/TI metrics and printing the summary:
ffmpeg -i input.mp4 -vf siti=print_summary=1 -f null -

smartblur ๐ŸŽ€

Blurs your input video without touching the outlines โ€” the edges stay crisp, it's giving selective softness โœจ.

It accepts these options:

  • luma_radius, lr โ€” sets the luma radius. Must be a float in the range [0.1,5.0]; it specifies the variance of the gaussian filter used to blur the image (bigger = slower, sadly ๐Ÿ˜ญ). Default is 1.0.
  • luma_strength, ls โ€” sets the luma strength. Float in the range [-1.0,1.0] that configures the blurring. Values in [0.0,1.0] blur the image, while values in [-1.0,0.0] sharpen it. Default is 1.0.
  • luma_threshold, lt โ€” sets the luma threshold, used as a coefficient to decide whether a pixel should be blurred or not. Integer in the range [-30,30]. A value of 0 filters the whole image, values in [0,30] filter flat areas, and values in [-30,0] filter edges. Default is 0.
  • chroma_radius, cr โ€” sets the chroma radius. Float in [0.1,5.0], same variance-of-the-gaussian-filter situation (slower if larger). Default is luma_radius.
  • chroma_strength, cs โ€” sets the chroma strength. Float in [-1.0,1.0]: [0.0,1.0] blurs, [-1.0,0.0] sharpens. Default is luma_strength.
  • chroma_threshold, ct โ€” sets the chroma threshold, same coefficient logic. Integer in [-30,30]: 0 filters all the image, [0,30] filters flat areas, [-30,0] filters edges. Default is luma_threshold.
  • alpha_radius, ar โ€” sets the alpha radius. Float in [0.1,5.0], the gaussian variance thing again (larger = slower). Default is luma_radius.
  • alpha_strength, as โ€” sets the alpha strength. Float in [-1.0,1.0]: [0.0,1.0] blurs, [-1.0,0.0] sharpens. Default is luma_strength.
  • alpha_threshold, at โ€” sets the alpha threshold, coefficient-style. Integer in [-30,30]: 0 filters all the image, [0,30] filters flat areas, [-30,0] filters edges. Default is luma_threshold.
Real talk ๐Ÿซถ โ€” if a chroma or alpha option isn't explicitly set, the matching luma value gets used instead.

sobel ๐Ÿฆ‹

Applies the sobel operator to the input video stream. Edge detection core ๐Ÿ’….

It accepts these options:

  • planes โ€” sets which planes get processed; unprocessed planes are just copied over. Default value is 0xf, which means all planes get processed.
  • scale โ€” sets the value that gets multiplied with the filtered result.
  • delta โ€” sets the value that gets added to the filtered result.

Commands

This filter supports all the above options as commands โšก


spp ๐ŸŒˆ

Applies a simple postprocessing filter that compresses and decompresses the image at several shifts โ€” or, when you're at quality level 6, all of them โ€” and then averages the results. It's giving "do it a bunch, average it out" energy fr fr.

The filter accepts these options:

  • quality โ€” sets the quality. This one defines the number of levels for averaging. Takes an integer in the range 0-6. If it's 0, the filter literally has no effect. 6 means the higher quality. Every increment of this value drops the speed by a factor of approximately 2 ๐Ÿ’€. Default is 3.
  • qp โ€” force a constant quantization parameter. If it's not set, the filter uses the QP from the video stream (when that's available).
  • mode โ€” sets the thresholding mode. The modes:
    • hard โ€” sets hard thresholding (default).
    • soft โ€” sets soft thresholding (better de-ringing effect, but likely blurrier).
  • use_bframe_qp โ€” enables using the QP from the B-Frames when set to 1. Warning bestie: using this option may cause flicker, since B-Frames often have a larger QP. Default is 0 (not enabled).

Commands

This filter supports these commands:

  • quality, level โ€” set the quality level. The value "max" can be used to set the maximum level, which is currently 6 ๐Ÿ‘‘

sr ๐Ÿงš

Scales the input by applying one of the super-resolution methods based on convolutional neural networks. The supported models:

Training scripts, plus scripts for saving model files (.pb), can be found at https://github.com/XueweiMeng/sr/tree/sr_dnn_native. The original repository is at https://github.com/HighVoltageRocknRoll/sr.git.

The filter accepts these options:

  • dnn_backend โ€” specifies which DNN backend to use for model loading and execution. Accepts:
  • model โ€” sets the path to the model file specifying the network architecture and its parameters. Note that different backends use different file formats. TensorFlow and OpenVINO backends can only load files in their own format.
  • scale_factor โ€” sets the scale factor for the SRCNN model. Allowed values are 2, 3 and 4. Default is 2. The scale factor is necessary for SRCNN because it accepts input upscaled using bicubic upscaling with the proper scale factor.
If you want the full functionality (like async execution), please use the dnn_processing filter instead ๐Ÿ’œ

sr_amf ๐Ÿ”ฅ

Upscales (size increasing!) the input video using the AMD Advanced Media Framework library for hardware acceleration. It uses advanced algorithms for upscaling with higher output quality. Setting the output width and height works exactly the same way as it does for the scale filter.

The filter accepts these options:

  • w, h โ€” set the output video dimension expression. Default value is the input dimension. Allows for the same expressions as the scale filter.
  • algorithm โ€” sets the algorithm used for scaling:
    • bilinear โ€” Bilinear
    • bicubic โ€” Bicubic
    • sr1-0 โ€” Video SR1.0. This is the default value
    • point โ€” Point
    • sr1-1 โ€” Video SR1.1
  • sharpness โ€” controls hq scaler sharpening. The value is a float in the range of [0.0, 2.0].
  • format โ€” controls the output pixel format. By default, or if none is specified, the input pixel format is used.
  • keep-ratio โ€” forces the scaler to keep the aspect ratio of the input image when the output size has a different aspect ratio. Default value is false.
  • fill โ€” specifies whether the output image outside the region of interest โ€” which doesn't fill the entire output surface โ€” should be filled with a solid color.

๐ŸŒŸ Examples ๐ŸŒŸ

  • Scale input to 720p, keeping the aspect ratio and making sure the output is yuv420p:
sr_amf=-2:720:format=yuv420p
  • Upscale to 4K with the video SR1.1 algorithm:
sr_amf=4096:2160:algorithm=sr1-1

ssim โญ

Obtains the SSIM (Structural SIMilarity Metric) between two input videos ๐Ÿ‘ฏโ€โ™€๏ธ.

This filter takes two input videos. The first input is considered the "main" source and gets passed unchanged to the output. The second input is used as the "reference" video for computing the SSIM.

Both video inputs must have the same resolution and pixel format or this filter just won't do its thing correctly, bestie. Also it assumes both inputs have the same number of frames, which get compared one by one. ๐Ÿ‘€

The filter stores the calculated SSIM of each frame. Cute, right?

The description of the accepted parameters follows:

  • stats_file, f โ€” if specified the filter will use the named file to save the SSIM of each individual frame. When filename equals "-" the data is sent to standard output. โœจ

The file printed if stats_file is selected contains a sequence of key/value pairs of the form key:value for each compared couple of frames.

A description of each shown parameter follows:

  • n โ€” sequential number of the input frame, starting from 1
  • Y, U, V, R, G, B โ€” SSIM of the compared frames for the component specified by the suffix
  • All โ€” SSIM of the compared frames for the whole frame
  • dB โ€” same as above but in dB representation

This filter also supports the framesync options. ๐Ÿซถ

๐Ÿ’ซ Examples ๐Ÿ’ซ

  • For example:
movie=ref_movie.mpg, setpts=PTS-STARTPTS [main];
[main][ref] ssim="stats_file=stats.log" [out]

On this example the input file being processed is compared with the reference file ref_movie.mpg. The SSIM of each individual frame is stored in stats.log. ๐ŸŽ€

  • Another example with both psnr and ssim at same time:
ffmpeg -i main.mpg -i ref.mpg -lavfi  "ssim;[0:v][1:v]psnr" -f null -
  • Another example with different containers:
ffmpeg -i main.mpg -i ref.mkv -lavfi  "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim" -f null -

๐Ÿฅฝ stereo3d ๐Ÿฅฝ

Convert between different stereoscopic image formats. Iconic 3D energy, honestly. ๐Ÿฆ‹

The filters accept the following options:

  • in โ€” set stereoscopic image format of input.

Available values for input image formats are:

  • sbsl โ€” side by side parallel (left eye left, right eye right)
  • sbsr โ€” side by side crosseye (right eye left, left eye right)
  • sbs2l โ€” side by side parallel with half width resolution (left eye left, right eye right)
  • sbs2r โ€” side by side crosseye with half width resolution (right eye left, left eye right)
  • abl, tbl โ€” above-below (left eye above, right eye below)
  • abr, tbr โ€” above-below (right eye above, left eye below)
  • ab2l, tb2l โ€” above-below with half height resolution (left eye above, right eye below)
  • ab2r, tb2r โ€” above-below with half height resolution (right eye above, left eye below)
  • al โ€” alternating frames (left eye first, right eye second)
  • ar โ€” alternating frames (right eye first, left eye second)
  • irl โ€” interleaved rows (left eye has top row, right eye starts on next row)
  • irr โ€” interleaved rows (right eye has top row, left eye starts on next row)
  • icl โ€” interleaved columns, left eye first
  • icr โ€” interleaved columns, right eye first

Default value is sbsl. ๐Ÿ’…

  • out โ€” set stereoscopic image format of output.
    • sbsl โ€” side by side parallel (left eye left, right eye right)
    • sbsr โ€” side by side crosseye (right eye left, left eye right)
    • sbs2l โ€” side by side parallel with half width resolution (left eye left, right eye right)
    • sbs2r โ€” side by side crosseye with half width resolution (right eye left, left eye right)
    • abl, tbl โ€” above-below (left eye above, right eye below)
    • abr, tbr โ€” above-below (right eye above, left eye below)
    • ab2l, tb2l โ€” above-below with half height resolution (left eye above, right eye below)
    • ab2r, tb2r โ€” above-below with half height resolution (right eye above, left eye below)
    • al โ€” alternating frames (left eye first, right eye second)
    • ar โ€” alternating frames (right eye first, left eye second)
    • irl โ€” interleaved rows (left eye has top row, right eye starts on next row)
    • irr โ€” interleaved rows (right eye has top row, left eye starts on next row)
    • arbg โ€” anaglyph red/blue gray (red filter on left eye, blue filter on right eye)
    • argg โ€” anaglyph red/green gray (red filter on left eye, green filter on right eye)
    • arcg โ€” anaglyph red/cyan gray (red filter on left eye, cyan filter on right eye)
    • arch โ€” anaglyph red/cyan half colored (red filter on left eye, cyan filter on right eye)
    • arcc โ€” anaglyph red/cyan color (red filter on left eye, cyan filter on right eye)
    • arcd โ€” anaglyph red/cyan color optimized with the least squares projection of dubois (red filter on left eye, cyan filter on right eye)
    • agmg โ€” anaglyph green/magenta gray (green filter on left eye, magenta filter on right eye)
    • agmh โ€” anaglyph green/magenta half colored (green filter on left eye, magenta filter on right eye)
    • agmc โ€” anaglyph green/magenta colored (green filter on left eye, magenta filter on right eye)
    • agmd โ€” anaglyph green/magenta color optimized with the least squares projection of dubois (green filter on left eye, magenta filter on right eye)
    • aybg โ€” anaglyph yellow/blue gray (yellow filter on left eye, blue filter on right eye)
    • aybh โ€” anaglyph yellow/blue half colored (yellow filter on left eye, blue filter on right eye)
    • aybc โ€” anaglyph yellow/blue colored (yellow filter on left eye, blue filter on right eye)
    • aybd โ€” anaglyph yellow/blue color optimized with the least squares projection of dubois (yellow filter on left eye, blue filter on right eye)
    • ml โ€” mono output (left eye only)
    • mr โ€” mono output (right eye only)
    • chl โ€” checkerboard, left eye first
    • chr โ€” checkerboard, right eye first
    • icl โ€” interleaved columns, left eye first
    • icr โ€” interleaved columns, right eye first
    • hdmi โ€” HDMI frame pack

Default value is arcd. โญ

๐Ÿ“ Examples ๐Ÿ“

  • Convert input video from side by side parallel to anaglyph yellow/blue dubois:
stereo3d=sbsl:aybd
  • Convert input video from above below (left eye above, right eye below) to side by side crosseye:
stereo3d=abl:sbsr

๐ŸŒˆ streamselect, astreamselect ๐ŸŒˆ

Select video or audio streams. Pick your fave, bestie. ๐Ÿ’–

The filter accepts the following options:

  • inputs โ€” set number of inputs. Default is 2.
  • map โ€” set input indexes to remap to outputs.

๐Ÿ’€ Commands ๐Ÿ’€

The streamselect and astreamselect filter supports the following commands:

  • map โ€” set input indexes to remap to outputs.

๐ŸŒธ Examples ๐ŸŒธ

  • Select first 5 seconds 1st stream and rest of time 2nd stream:
sendcmd='5.0 streamselect map 1',streamselect=inputs=2:map=0
  • Same as above, but for audio:
asendcmd='5.0 astreamselect map 1',astreamselect=inputs=2:map=0

๐ŸŽฌ subtitles ๐ŸŽฌ

Draw subtitles on top of input video using the libass library. The way this filter just serves captions, no cap. ๐Ÿ‘‘

To enable compilation of this filter you need to configure FFmpeg with "--enable-libass". This filter also requires a build with libavcodec and libavformat to convert the passed subtitles file to ASS (Advanced Substation Alpha) subtitles format.

The filter accepts the following options:

  • filename, f โ€” set the filename of the subtitle file to read. It must be specified.
  • original_size โ€” specify the size of the original video, the video for which the ASS file was composed. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Due to a misdesign in ASS aspect ratio arithmetic, this is necessary to correctly scale the fonts if the aspect ratio has been changed. ๐Ÿ˜ญ (yes, "misdesign", they said it not me)
  • fontsdir โ€” set a directory path containing fonts that can be used by the filter. These fonts will be used in addition to whatever the font provider uses.
  • alpha โ€” process alpha channel, by default alpha channel is untouched.
  • charenc โ€” set subtitles input character encoding. subtitles filter only. Only useful if not UTF-8.
  • stream_index, si โ€” set subtitles stream index. subtitles filter only.
  • force_style โ€” override default style or script info parameters of the subtitles. It accepts a string containing ASS style format KEY=VALUE couples separated by ",".
  • wrap_unicode โ€” break lines according to the Unicode Line Breaking Algorithm. Availability requires at least libass release 0.17.0 (or LIBASS_VERSION 0x01600010), and libass must have been built with libunibreak.

The option is enabled by default except for native ASS.

If the first key is not specified, it is assumed that the first value specifies the filename.

For example, to render the file sub.srt on top of the input video, use the command:

subtitles=sub.srt

which is equivalent to:

subtitles=filename=sub.srt

To render the default subtitles stream from file video.mkv, use:

subtitles=video.mkv

To render the second subtitles stream from that file, use:

subtitles=video.mkv:si=1

To make the subtitles stream from sub.srt appear in 80% transparent blue "DejaVu Serif", use:

subtitles=sub.srt:force_style='Fontname=DejaVu Serif,PrimaryColour=&HCCFF0000'

๐Ÿงš super2xsai ๐Ÿงš

Scale the input by 2x and smooth using the Super2xSaI (Scale and Interpolate) pixel art scaling algorithm.

Useful for enlarging pixel art images without reducing sharpness. Pixel artists stay winning fr fr. ๐ŸŽจโœจ


๐Ÿ”„ swaprect ๐Ÿ”„

Swap two rectangular objects in video. Trade places, bestie! ๐Ÿซถ

This filter accepts the following options:

  • w โ€” set object width.
  • h โ€” set object height.
  • x1 โ€” set 1st rect x coordinate.
  • y1 โ€” set 1st rect y coordinate.
  • x2 โ€” set 2nd rect x coordinate.
  • y2 โ€” set 2nd rect y coordinate.

All expressions are evaluated once for each frame.

The all options are expressions containing the following constants:

  • w, h โ€” the input width and height
  • a โ€” same as w / h
  • sar โ€” input sample aspect ratio
  • dar โ€” input display aspect ratio, it is the same as (w / h) * sar
  • n โ€” the number of the input frame, starting from 0
  • t โ€” the timestamp expressed in seconds. It's NAN if the input timestamp is unknown
  • pos โ€” the position in the file of the input frame, NAN if unknown; deprecated, do not use โš ๏ธ

๐Ÿ’œ Commands ๐Ÿ’œ

This filter supports the all above options as commands. ๐Ÿ’…

swapuv

Swap the U & V plane, bestie ๐Ÿ’…. Thatโ€™s the whole vibe. Iconic, brief, done.


tblend

Blend successive video frames together ๐ŸŽ€.

See blend for the full tea. iykyk.


telecine

Apply the telecine process to your video ๐ŸŽž๏ธโœจ.

This filter accepts the following options:

  • first_field โ€” tells it which field comes first:
    • top, t โ€” top field first
    • bottom, b โ€” bottom field first. The default value is "top".
  • pattern โ€” a string of numbers representing the pulldown pattern you wish to apply. The default value is 23 ๐ŸŒธ.

Some typical patterns, bestie:

NTSC output (30i):
27.5p: 32222
24p: 23 (classic)
24p: 2332 (preferred)
20p: 33
18p: 334
16p: 3444

PAL output (25i):
27.5p: 12222
24p: 222222222223 ("Euro pulldown")
16.67p: 33
16p: 33333334

thistogram

Compute and draw a color distribution histogram for the input video across time โณ๐ŸŒˆ.

Unlike the histogram video filter, which only shows the histogram of a single input frame at a certain time, this filter also shows past histograms for the number of frames defined by the width option. Obsessed with the timeline of it all.

The computed histogram is a representation of the color component distribution in an image.

The filter accepts the following options:

  • width, w โ€” set the width of a single color component output. Default value is 0. A value of 0 means the width will be picked from the input video. This also sets the number of passed histograms to keep. Allowed range is [0, 8192] ๐Ÿ’–.
  • display_mode, d โ€” set the display mode. It accepts the following values:
    • stack โ€” per color component graphs are placed below each other.
    • parade โ€” per color component graphs are placed side by side.
    • overlay โ€” presents information identical to that in the parade, except that the graphs representing color components are superimposed directly over one another.

Default is "stack" โœจ.

  • levels_mode, m โ€” set the mode. Can be either "linear" or "logarithmic". Default is "linear".
  • components, c โ€” set what color components to display. Default is 7.
  • bgopacity, b โ€” set background opacity. Default is 0.9.
  • envelope, e โ€” show envelope. Default is disabled.
  • ecolor, ec โ€” set envelope color. Default is "gold" ๐Ÿ‘‘.
  • slide โ€” set slide mode. Available values for slide are:
    • frame โ€” draw a new frame when the right border is reached.
    • replace โ€” replace old columns with new ones.
    • scroll โ€” scroll from right to left.
    • rscroll โ€” scroll from left to right.
    • picture โ€” draw a single picture.

Default is "replace" ๐Ÿ’….


threshold

Apply a threshold effect to a video stream ๐Ÿ”ฅ.

This filter needs four video streams to perform thresholding. First stream is the stream we are filtering. Second stream is holding threshold values, third stream is holding min values, and last, fourth stream is holding max values.

The filter accepts the following option:

  • planes โ€” set which planes will be processed; unprocessed planes will be copied. By default value 0xf, all planes will be processed.

For example, if the first stream pixelโ€™s component value is less than the threshold value of the pixel component from the 2nd threshold stream, the third stream value will be picked; otherwise the fourth stream pixel component value will be picked ๐Ÿซถ.

Using the color source filter, one can perform various types of thresholding:

Commands

This filter supports all options as commands.

Examples

  • Binary threshold, using gray color as threshold:
ffmpeg -i 320x240.avi -f lavfi -i color=gray -f lavfi -i color=black -f lavfi -i color=white -lavfi threshold output.avi
  • Inverted binary threshold, using gray color as threshold:
ffmpeg -i 320x240.avi -f lavfi -i color=gray -f lavfi -i color=white -f lavfi -i color=black -lavfi threshold output.avi
  • Truncate binary threshold, using gray color as threshold:
ffmpeg -i 320x240.avi -f lavfi -i color=gray -i 320x240.avi -f lavfi -i color=gray -lavfi threshold output.avi
  • Threshold to zero, using gray color as threshold:
ffmpeg -i 320x240.avi -f lavfi -i color=gray -f lavfi -i color=white -i 320x240.avi -lavfi threshold output.avi
  • Inverted threshold to zero, using gray color as threshold:
ffmpeg -i 320x240.avi -f lavfi -i color=gray -i 320x240.avi -f lavfi -i color=white -lavfi threshold output.avi

thumbnail

Select the most representative frame in a given sequence of consecutive frames ๐Ÿ–ผ๏ธโœจ. Main character frame selection, fr fr.

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 n frames until the end. Default is 100.
  • log โ€” set the log level to display picked frame stats. Default is "info".
Since the filter keeps track of the whole frames sequence, a bigger n value will result in higher memory usage, so a high value is not recommended ๐Ÿ˜ญ.

Examples

  • Extract one picture every 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

tile

Tile several successive frames together ๐Ÿงฉ๐Ÿ’–.

The untile filter can do the reverse. Love a reversible moment.

The filter accepts the following options:

  • layout โ€” set the grid size in the form COLUMNSxROWS. Range is up to UINT_MAX cells. Default is "6x5".
  • nb_frames โ€” set the maximum number of frames to render in the given area. It must be less than or equal to wxh. The default value is 0, meaning all the area will be used.
  • margin โ€” set the outer border margin in pixels. Range is 0 to 1024. Default is 0.
  • padding โ€” set the inner border thickness (i.e. the number of pixels between frames). For more advanced padding options (such as having different values for the edges), refer to the pad video filter. Range is 0 to 1024. Default is 0.
  • color โ€” specify the color of the unused area. For the syntax of this option, check the Color section in the ffmpeg-utils manual. The default value of color is "black" ๐Ÿ–ค.
  • overlap โ€” set the number of frames to overlap when tiling several successive frames together. The value must be between 0 and nb_frames - 1. Default is 0.
  • init_padding โ€” set the number of frames to initially be empty before displaying the first output frame. This controls how soon one will get the first output frame. The value must be between 0 and nb_frames - 1. Default is 0.

Examples

  • Produce 8x8 PNG tiles of all keyframes (-skip_frame nokey) in a movie:
ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png

The -vsync 0 is necessary to prevent ffmpeg from duplicating each output frame to accommodate the originally detected frame rate ๐Ÿซถ.

  • Display 5 pictures in an area of "3x2" frames, with 7 pixels between them, and 2 pixels of initial margin, using mixed flat and named options:
tile=3x2:nb_frames=5:padding=7:margin=2

tiltandshift

Apply the tilt-and-shift effect ๐ŸŒ€๐Ÿ“ธ.

What happens when you invert time and space? Literally the question.

Normally a video is composed of several frames that represent a different instant of time and shows a scene that evolves in the space captured by the frame. This filter is the antipode of that concept, taking inspiration from tilt and shift photography.

A filtered frame contains the whole timeline of events composing the sequence, and this is obtained by placing a slice of pixels from each frame into a single one. However, since there are no infinite-width frames, this is done up to the width of the input frame, and a video is recomposed by shifting away one column for each subsequent frame. In order to map space to time, the filter tilts each input frame as well, so that motion is preserved. This is accomplished by progressively selecting a different column from each input frame.

The end result is a sort of inverted parallax, so that far away objects move much faster than the ones in the front. The ideal conditions for this video effect are when there is either very little motion and the background is static, or when there is a lot of motion and a very wide depth of field (e.g. wide panorama, while moving on a train) ๐Ÿš‚โœจ.

The filter accepts the following parameters:

  • tilt โ€” tilt video while shifting (default). When unset, video will be sliding a static image, composed of the first column of each frame.
  • start โ€” what to do at the start of filtering (see below).
  • end โ€” what to do at the end of filtering (see below).
  • hold โ€” how many columns should pass through before start of filtering.
  • pad โ€” how many columns should be inserted before end of filtering.

Normally the filter shifts and tilts from the very first frame, and stops when the last one is received. However, before filtering starts, normal video may be preserved, so that the effect is slowly shifted in its place. Similarly, the last video frame may be reconstructed at the end. Alternatively it is possible to just start and end with black.

  • none โ€” filtering starts immediately and ends when the last frame is received.
  • frame โ€” the first frames or the very last frame are kept intact during processing.
  • black โ€” black is padded at the beginning or at the end of filtering.

tinterlace

Perform various types of temporal field interlacing ๐ŸŽž๏ธ๐Ÿ’ซ.

Frames are counted starting from 1, so the first input frame is considered odd.

The filter accepts the following options:

  • mode โ€” specify the mode of the interlacing. This option can also be specified as a value alone. See below for a list of values for this option.

Available values are:

  • merge, 0 โ€” move odd frames into the upper field, even into the lower field, generating a double height frame at half frame rate.
             ------> time
            Input:
            Frame 1         Frame 2         Frame 3         Frame 4

            11111           22222           33333           44444
            11111           22222           33333           44444
            11111           22222           33333           44444
            11111           22222           33333           44444
Output:
11111                           33333
22222                           44444
11111                           33333
22222                           44444
11111                           33333
22222                           44444
11111                           33333
22222                           44444
  • drop_even, 1 โ€” Only output odd frames, even frames are dropped, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111                           33333
11111                           33333
11111                           33333
11111                           33333
  • drop_odd, 2 โ€” Only output even frames, odd frames are dropped, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
                22222                           44444
                22222                           44444
                22222                           44444
                22222                           44444
  • pad, 3 โ€” Expand each frame to full height, but pad alternate lines with black, generating a frame with double height at the same input frame rate.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111           .....           33333           .....
.....           22222           .....           44444
11111           .....           33333           .....
.....           22222           .....           44444
11111           .....           33333           .....
.....           22222           .....           44444
11111           .....           33333           .....
.....           22222           .....           44444
  • interleave_top, 4 โ€” Interleave the upper field from odd frames with the lower field from even frames, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111<-         22222           33333<-         44444
11111           22222<-         33333           44444<-
11111<-         22222           33333<-         44444
11111           22222<-         33333           44444<-

Output:
11111                           33333
22222                           44444
11111                           33333
22222                           44444
  • interleave_bottom, 5 โ€” Interleave the lower field from odd frames with the upper field from even frames, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222<-         33333           44444<-
11111<-         22222           33333<-         44444
11111           22222<-         33333           44444<-
11111<-         22222           33333<-         44444

Output:
22222                           44444
11111                           33333
22222                           44444
11111                           33333
  • interlacex2, 6 โ€” Double frame rate with unchanged height. Frames are inserted each containing the second temporal field from the previous input frame and the first temporal field from the next input frame. This mode relies on the top_field_first flag. Useful for interlaced video displays with no field synchronisation.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
 11111           22222           33333           44444
11111           22222           33333           44444
 11111           22222           33333           44444

Output:
11111   22222   22222   33333   33333   44444   44444
 11111   11111   22222   22222   33333   33333   44444
11111   22222   22222   33333   33333   44444   44444
 11111   11111   22222   22222   33333   33333   44444
  • mergex2, 7 โ€” Move odd frames into the upper field, even into the lower field, generating a double height frame at same frame rate.
------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111           33333           33333           55555
22222           22222           44444           44444
11111           33333           33333           55555
22222           22222           44444           44444
11111           33333           33333           55555
22222           22222           44444           44444
11111           33333           33333           55555
22222           22222           44444           44444

Okay so real talk: numeric values are deprecated but are accepted for backward compatibility reasons. Like, they still work, but bestieโ€ฆ they're giving โœจ legacy code โœจ.

Default mode is merge.


  • flags โ€” Specify flags influencing the filter process.

The available value for flags is:

  • low_pass_filter, vlpf โ€” Enable linear vertical low-pass filtering in the filter. Vertical low-pass filtering is required when creating an interlaced destination from a progressive source which contains high-frequency vertical detail. Filtering will reduce interlace 'twitter' and Moire patterning.
  • complex_filter, cvlpf โ€” Enable complex vertical low-pass filtering. This will slightly less reduce interlace 'twitter' and Moire patterning but better retain detail and subjective sharpness impression.
  • bypass_il โ€” Bypass already interlaced frames, only adjust the frame rate.
Heads up ๐Ÿซถ โ€” vertical low-pass filtering and bypassing already interlaced frames can only be enabled for mode interleave_top and interleave_bottom. Anywhere else? Nope. Not happening.

๐ŸŒธ tmedian ๐ŸŒธ

Pick median pixels from several successive input video frames. It's giving "majority vote but for pixels" ๐Ÿ’…

This filter accepts the following options:

  • radius โ€” Set radius of median filter. Default is 1. Allowed range is from 1 to 127.
  • planes โ€” Set which planes to filter. Default value is 15, by which all planes are processed.
  • percentile โ€” Set median percentile. Default value is 0.5. Default value of 0.5 will pick always median values, while 0 will pick minimum values, and 1 maximum values.

Commands

This filter supports all above options as commands, excluding option "radius". (Sorry radius, you're not invited to the command party ๐Ÿ™ˆ)


๐Ÿฆ‹ tmidequalizer ๐Ÿฆ‹

Apply Temporal Midway Video Equalization effect.

Midway Video Equalization adjusts a sequence of video frames to have the same histograms, while maintaining their dynamics as much as possible. It's useful for e.g. matching exposures from a video frames sequence. Literally the glow-up filter for your footage โœจ

This filter accepts the following option:

  • radius โ€” Set filtering radius. Default is 5. Allowed range is from 1 to 127.
  • sigma โ€” Set filtering sigma. Default is 0.5. This controls strength of filtering. Setting this option to 0 effectively does nothing. (Zero = no thoughts, head empty ๐Ÿ’€)
  • planes โ€” Set which planes to process. Default is 15, which is all available planes.

๐Ÿ’œ tmix ๐Ÿ’œ

Mix successive video frames. Blend era, no cap.

A description of the accepted options follows.

  • frames โ€” The number of successive frames to mix. If unspecified, it defaults to 3.
  • weights โ€” Specify weight of each input video frame. Each weight is separated by space. If number of weights is smaller than number of frames last specified weight will be used for all remaining unset weights.
  • scale โ€” Specify scale, if it is set it will be multiplied with sum of each weight multiplied with pixel values to give final destination pixel value. By default scale is auto scaled to sum of weights.
  • planes โ€” Set which planes to filter. Default is all. Allowed range is from 0 to 15.

Examples

  • Average 7 successive frames:
tmix=frames=7:weights="1 1 1 1 1 1 1"
  • Apply simple temporal convolution:
tmix=frames=3:weights="-1 3 -1"
  • Similar as above but only showing temporal differences:
tmix=frames=3:weights="-1 2 -1":scale=1

Commands

This filter supports the following commands:

  • weights
  • scale
  • planes

Syntax is same as option with same name. Kept it simple, icon behaviour ๐ŸŽ€

๐ŸŽจ tonemap

Okay so tonemap is the vibe-shifter that tone maps colors from different dynamic ranges ๐Ÿ’ซ

Real talk: this filter expects data in single precision floating point, because it genuinely needs to operate on (and can output!) out-of-range values. So you'll need another filter โ€” like zscale โ€” to convert the resulting frame back into a usable format. It's a team effort, bestie ๐Ÿซถ

And the tonemapping algorithms implemented only work on linear light, so your input data should be linearized beforehand (and possibly correctly tagged too, iykyk):

ffmpeg -i INPUT -vf zscale=transfer=linear,tonemap=clip,zscale=transfer=bt709,format=yuv420p OUTPUT

Options โœจ

The filter accepts the following options:

  • tonemap โ€” Set the tone map algorithm to use ๐Ÿ”ฅ

Possible values are:

  • none โ€” Do not apply any tone map, only desaturate overbright pixels.
  • clip โ€” Hard-clip any out-of-range values. Use it for perfect color accuracy for in-range values, while distorting out-of-range values.
  • linear โ€” Stretch the entire reference gamut to a linear multiple of the display.
  • gamma โ€” Fit a logarithmic transfer between the tone curves.
  • reinhard โ€” Preserve overall image brightness with a simple curve, using nonlinear contrast, which results in flattening details and degrading color accuracy.
  • hable โ€” Preserve both dark and bright details better than reinhard, at the cost of slightly darkening everything. Use it when detail preservation is more important than color and brightness accuracy.
  • mobius โ€” Smoothly map out-of-range values, while retaining contrast and colors for in-range material as much as possible. Use it when color accuracy is more important than detail preservation.

Default is none.

  • param โ€” Tune the tone mapping algorithm ๐ŸŽ›๏ธ

This affects the following algorithms:

  • none โ€” Ignored. Nothing to see here ๐Ÿ’€
  • linear โ€” Specifies the scale factor to use while stretching. Default to 1.0.
  • gamma โ€” Specifies the exponent of the function. Default to 1.8.
  • clip โ€” Specify an extra linear coefficient to multiply into the signal before clipping. Default to 1.0.
  • reinhard โ€” Specify the local contrast coefficient at the display peak. Default to 0.5, which means that in-gamut values will be about half as bright as when clipping.
  • hable โ€” Ignored.
  • mobius โ€” Specify the transition point from linear to mobius transform. Every value below this point is guaranteed to be mapped 1:1. The higher the value, the more accurate the result will be, at the cost of losing bright details. Default to 0.3, which due to the steep initial slope still preserves in-range colors fairly accurately.
  • desat โ€” Apply desaturation for highlights that exceed this level of brightness. The higher the parameter, the more color information will be preserved. This setting helps prevent unnaturally blown-out colors for super-highlights, by (smoothly) turning into white instead. This makes images feel more natural, at the cost of reducing information about out-of-range colors.

The default of 2.0 is somewhat conservative and will mostly just apply to skies or directly sunlit surfaces. A setting of 0.0 disables this option.

Heads up, bestie: this option works only if the input frame has a supported color tag ๐Ÿ™ˆ
  • peak โ€” Override signal/nominal/reference peak with this value. Useful when the embedded peak information in display metadata is not reliable or when tone mapping from a lower range to a higher range.

๐Ÿ›‹๏ธ tpad

Temporarily pad video frames ๐Ÿ’… Like, add some frames before or after your stream, no biggie.

The filter accepts the following options:

  • start โ€” Specify number of delay frames before input video stream. Default is 0.
  • stop โ€” Specify number of padding frames after input video stream. Set to -1 to pad indefinitely ๐Ÿ˜ญ Default is 0.
  • start_mode โ€” Set kind of frames added to beginning of stream. Can be either add or clone. With add frames of solid-color are added. With clone frames are clones of first frame. Default is add.
  • stop_mode โ€” Set kind of frames added to end of stream. Can be either add or clone. With add frames of solid-color are added. With clone frames are clones of last frame. Default is add.
  • start_duration, stop_duration โ€” Specify the duration of the start/stop delay. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax. These options override start and stop. Default is 0.
  • color โ€” Specify the color of the padded area. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual.

The default value of color is "black".


๐Ÿ”„ transpose

Transpose rows with columns in the input video and optionally flip it. It's giving "rotate my whole world" energy ๐ŸŒโœจ

It accepts the following parameters:

  • dir โ€” Specify the transposition direction.

Can assume the following values:

  • 0, 4, cclock_flip โ€” Rotate by 90 degrees counterclockwise and vertically flip (default), that is:
L.R     L.l
. . ->  . .
l.r     R.r
  • 1, 5, clock โ€” Rotate by 90 degrees clockwise, that is:
L.R     l.L
. . ->  . .
l.r     r.R
  • 2, 6, cclock โ€” Rotate by 90 degrees counterclockwise, that is:
L.R     R.r
. . ->  . .
l.r     L.l
  • 3, 7, clock_flip โ€” Rotate by 90 degrees clockwise and vertically flip, that is:
L.R     r.R
. . ->  . .
l.r     l.L
Real talk โš ๏ธ For values between 4-7, the transposition is only done if the input video geometry is portrait and not landscape. These values are deprecated โ€” the "passthrough" option should be used instead.
Also deprecated: numerical values. Drop them in favor of the symbolic constants, bestie ๐Ÿ™
  • passthrough โ€” Do not apply the transposition if the input geometry matches the one specified by the specified value. It accepts the following values:
    • none โ€” Always apply transposition.
    • portrait โ€” Preserve portrait geometry (when height >= width).
    • landscape โ€” Preserve landscape geometry (when width >= height).

Default value is "none".

So, for example, to rotate by 90 degrees clockwise and preserve portrait layout:

transpose=dir=1:passthrough=portrait

And the command above can also be specified as:

transpose=1:portrait

โœ‚๏ธ trim

Trim the input so that the output contains one continuous subpart of the input. Surgical. Precise. Iconic ๐ŸŽ€

It accepts the following parameters:

  • start โ€” Specify the time of the start of the kept section, i.e. the frame with the timestamp start will be the first frame in the output.
  • end โ€” Specify the time of the first frame that will be dropped, i.e. the frame immediately preceding the one with the timestamp end will be the last frame in the output.
  • start_pts โ€” This is the same as start, except this option sets the start timestamp in timebase units instead of seconds.
  • end_pts โ€” This is the same as end, except this option sets the end timestamp in timebase units instead of seconds.
  • duration โ€” The maximum duration of the output in seconds.
  • start_frame โ€” The number of the first frame that should be passed to the output.
  • end_frame โ€” The number of the first frame that should be dropped.

start, end, and duration are expressed as time duration specifications; see the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax.

Heads up ๐Ÿ’€ the first two sets of the start/end options and the duration option look at the frame timestamp, while the _frame variants simply count the frames that pass through the filter. Also note that this filter does not modify the timestamps. If you wish for the output timestamps to start at zero, insert a setpts filter after the trim filter.

If multiple start or end options are set, this filter tries to be greedy and keep all the frames that match at least one of the specified constraints. To keep only the part that matches all the constraints at once, chain multiple trim filters. Chain 'em, queen โ›“๏ธ๐Ÿ‘‘

The defaults are such that all the input is kept. So it is possible to set e.g. just the end values to keep everything before the specified time. Love that for you ๐Ÿ’–

Examples:

  • Drop everything except the second minute of input:
ffmpeg -i INPUT -vf trim=60:120
  • Keep only the first second:
ffmpeg -i INPUT -vf trim=duration=1

๐Ÿซฅ unpremultiply

Apply alpha unpremultiply effect to input video stream using first plane of second stream as alpha ๐ŸŒˆ

Both streams must have same dimensions and same pixel format. No mixing and matching, bestie โœ‹

The filter accepts the following option:

  • planes โ€” Set which planes will be processed, unprocessed planes will be copied. By default value 0xf, all planes will be processed.

If the format has 1 or 2 components, then luma is bit 0. If the format has 3 or 4 components: for RGB formats bit 0 is green, bit 1 is blue and bit 2 is red; for YUV formats bit 0 is luma, bit 1 is chroma-U and bit 2 is chroma-V. If present, the alpha channel is always the last bit. Bit math, but make it fashion ๐Ÿ’…

  • inplace โ€” Do not require 2nd input for processing, instead use alpha plane from input stream.

๐Ÿ” unsharp

Sharpen or blur the input video. Two moods, one filter ๐Ÿฆ‹

It accepts the following parameters:

  • luma_msize_x, lx โ€” Set the luma matrix horizontal size. It must be an odd integer between 3 and 23. The default value is 5.
  • luma_msize_y, ly โ€” Set the luma matrix vertical size. It must be an odd integer between 3 and 23. The default value is 5.
  • luma_amount, la โ€” Set the luma effect strength. It must be a floating point number, reasonable values lay between -1.5 and 1.5.

Negative values will blur the input video, while positive values will sharpen it, a value of zero will disable the effect.

Default value is 1.0.

  • chroma_msize_x, cx โ€” Set the chroma matrix horizontal size. It must be an odd integer between 3 and 23. The default value is 5.
  • chroma_msize_y, cy โ€” Set the chroma matrix vertical size. It must be an odd integer between 3 and 23. The default value is 5.
  • chroma_amount, ca โ€” Set the chroma effect strength. It must be a floating point number, reasonable values lay between -1.5 and 1.5.
  • alpha_amount, aa โ€” sets the alpha effect strength. It's a floating point number, and the reasonable range is between -1.5 and 1.5.

Negative values will blur the input video, while positive values will sharpen it, a value of zero will disable the effect.

Default value is 0.0.

okay so literally every parameter here is optional and they all default to the equivalent of the string '5:5:1.0:5:5:0.0' ๐Ÿซถ

โœจ Examples โœจ

  • Apply strong luma sharpen effect:
unsharp=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5
  • Apply a strong blur of both luma and chroma parameters:
unsharp=7:7:-2:7:7:-2

๐Ÿงฉ untile

Decompose a video made of tiled images into the individual images. It's the un-tiling, the de-cubing, the "bestie please give me back my frames" filter ๐Ÿ’…

The frame rate of the output video is the frame rate of the input video multiplied by the number of tiles. yes, it multiplies, that's not a typo ๐Ÿ”ฅ

This filter does the reverse of tile.

The filter accepts the following options:

  • layout โ€” set the grid size (i.e. the number of lines and columns). For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.

๐ŸŒธ Examples ๐ŸŒธ

  • Produce a 1-second video from a still image file made of 25 frames stacked vertically, like an analogic film reel:
ffmpeg -r 1 -i image.jpg -vf untile=1x25 movie.mkv

๐ŸŒ€ uspp

Apply ultra slow/simple postprocessing filter that compresses and decompresses the image at several (or โ€” in the case of quality level 8 โ€” all) shifts and average the results.

The way this differs from the behavior of spp is that uspp actually encodes & decodes each case with libavcodec Snow, whereas spp uses a simplified intra only 8x8 DCT similar to MJPEG. iykyk ๐Ÿงš

Heads up bestie: this filter is not available in ffmpeg versions between 5.0 and 6.0. ๐Ÿ˜ญ

The filter accepts the following options:

  • quality โ€” set quality. This option defines the number of levels for averaging. It accepts an integer in the range 0-8. If set to 0, the filter will have no effect. A value of 8 means the higher quality. For each increment of that value the speed drops by a factor of approximately 2. Default value is 3. so like, yes, 8 is gorgeous and also it will take a million years, choose wisely ๐Ÿ’€
  • qp โ€” force a constant quantization parameter. If not set, the filter will use the QP from the video stream (if available).
  • codec โ€” use specified codec instead of snow.

๐ŸŒ v360

Convert 360 videos between various formats. this one is a whole personality, buckle up ๐Ÿ‘‘

The filter accepts the following options:

  • input, output โ€” set format of the input/output video.

Available formats:

  • e, equirect โ€” equirectangular projection.
  • c3x2, c6x1, c1x6 โ€” cubemap with 3x2/6x1/1x6 layout.

Format specific options:

  • in_pad, out_pad โ€” set padding proportion for the input/output cubemap. Values in decimals.

Example values:

  • 0 โ€” no padding.
  • 0.01 โ€” 1% of face is padding. For example, with 1920x1280 resolution face size would be 640x640 and padding would be 3 pixels from each side. (640 * 0.01 = 6 pixels)

Default value is 0. Maximum value is 0.1.

  • fin_pad, fout_pad โ€” set fixed padding for the input/output cubemap. Values in pixels.

Default value is 0. If greater than zero it overrides other padding options. so it's like, the boss of the pad options โœจ

  • in_forder, out_forder โ€” set order of faces for the input/output cubemap. Choose one direction for each position.

Designation of directions:

  • r โ€” right
  • l โ€” left
  • u โ€” up
  • d โ€” down
  • f โ€” forward
  • b โ€” back

Default value is rludfb.

  • in_frot, out_frot โ€” set rotation of faces for the input/output cubemap. Choose one angle for each position.

Designation of angles:

  • 0 โ€” 0 degrees clockwise
  • 1 โ€” 90 degrees clockwise
  • 2 โ€” 180 degrees clockwise
  • 3 โ€” 270 degrees clockwise

Default value is 000000.

  • eac โ€” Equi-Angular Cubemap.
  • flat, gnomonic, rectilinear โ€” regular video.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • dfisheye โ€” dual fisheye.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • barrel, fb, barrelsplit โ€” Facebook's 360 formats.
  • sg โ€” stereographic format.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • mercator โ€” Mercator format.
  • ball โ€” Ball format, gives significant distortion toward the back.
  • hammer โ€” Hammer-Aitoff map projection format.
  • sinusoidal โ€” Sinusoidal map projection format.
  • fisheye โ€” fisheye projection.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • pannini โ€” Pannini projection.

Format specific options:

  • h_fov โ€” set output pannini parameter.
  • ih_fov โ€” set input pannini parameter.
  • cylindrical โ€” cylindrical projection.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • perspective โ€” perspective projection. (output only)

Format specific options:

  • v_fov โ€” set perspective parameter.
  • tetrahedron โ€” tetrahedron projection.
  • tsp โ€” truncated square pyramid projection.
  • he, hequirect โ€” half equirectangular projection.
  • equisolid โ€” equisolid format.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • og โ€” orthographic format.

Format specific options:

  • h_fov, v_fov, d_fov โ€” set output horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • ih_fov, iv_fov, id_fov โ€” set input horizontal/vertical/diagonal field of view. Values in degrees.

If diagonal field of view is set it overrides horizontal and vertical field of view.

  • octahedron โ€” octahedron projection.
  • cylindricalea โ€” cylindrical Equal Area projection.
  • interp โ€” set interpolation method. Note: more complex interpolation methods require much more memory to run. ๐Ÿซ 

Available methods:

  • near, nearest โ€” nearest neighbour.
  • line, linear โ€” bilinear interpolation.
  • lagrange9 โ€” Lagrange9 interpolation.
  • cube, cubic โ€” bicubic interpolation.
  • lanc, lanczos โ€” Lanczos interpolation.
  • sp16, spline16 โ€” Spline16 interpolation.
  • gauss, gaussian โ€” Gaussian interpolation.
  • mitchell โ€” Mitchell interpolation.

Default value is line.

  • w, h โ€” set the output video resolution. The default resolution depends on the formats, bestie, it's not a one-size-fits-all situation ๐Ÿ’…
  • in_stereo, out_stereo โ€” set the input/output stereo format. Your choices are:
    • 2d โ€” 2D mono
    • sbs โ€” side by side
    • tb โ€” top bottom

Default value is 2d for both the input and the output format. โœจ

  • yaw, pitch, roll โ€” set the rotation for the output video. Values are in degrees. ๐Ÿ“
  • rorder โ€” set the rotation order for the output video. Pick one item for each position:
    • y, Y โ€” yaw
    • p, P โ€” pitch
    • r, R โ€” roll

Default value is ypr.

  • h_flip, v_flip, d_flip โ€” flip the output video horizontally (swaps left-right) / vertically (swaps up-down) / in-depth (swaps back-forward). Boolean values. ๐Ÿ”„
  • ih_flip, iv_flip โ€” set if the input video is flipped horizontally/vertically. Boolean values.
  • in_trans โ€” set if the input video is transposed. Boolean value, by default disabled.
  • out_trans โ€” set if the output video needs to be transposed. Boolean value, by default disabled.
  • h_offset, v_offset โ€” set the output horizontal/vertical off-axis offset. Default is set to 0. Allowed range is from -1 to 1.
  • alpha_mask โ€” build a mask in the alpha plane for all unmapped pixels by marking them fully transparent. Boolean value, by default disabled. ๐Ÿ™ˆ
  • reset_rot โ€” reset the rotation of the output video. Boolean value, by default disabled.

๐ŸŽฌ Examples ๐ŸŽฌ

  • Convert equirectangular video to cubemap with a 3x2 layout and 1% padding using bicubic interpolation:
ffmpeg -i input.mkv -vf v360=e:c3x2:cubic:out_pad=0.01 output.mkv
  • Extract the back view of an Equi-Angular Cubemap:
ffmpeg -i input.mkv -vf v360=eac:flat:yaw=180 output.mkv
  • Convert a transposed and horizontally flipped Equi-Angular Cubemap in side-by-side stereo format to equirectangular top-bottom stereo format:
v360=eac:equirect:in_stereo=sbs:in_trans=1:ih_flip=1:out_stereo=tb

Commands

This filter supports a subset of the above options as commands. ๐Ÿซถ


๐ŸŒซ๏ธ vaguedenoiser ๐ŸŒซ๏ธ

Apply a wavelet based denoiser. Obsessed with this one ngl.

So what it does: it transforms each frame from the video input into the wavelet domain, using Cohen-Daubechies-Feauveau 9/7. Then it applies some filtering to the obtained coefficients. It does an inverse wavelet transform after. And because of wavelet properties, it should give you a nice smoothed result, and reduced noise, without blurring picture features. That's the whole dream, fr fr. โœจ

This filter accepts the following options:

  • threshold โ€” the filtering strength. The higher it is, the more filtered the video will be. Hard thresholding can use a higher threshold than soft thresholding before the video starts looking overfiltered. Default value is 2.
  • method โ€” the filtering method the filter will use. It accepts the following values:
    • hard โ€” all values under the threshold will be zeroed.
    • soft โ€” all values under the threshold will be zeroed. All values above will be reduced by the threshold.
    • garrote โ€” scales or nullifies coefficients โ€” an intermediary between (more) soft and (less) hard thresholding.

Default is garrote. ๐Ÿ’…

  • nsteps โ€” number of times the wavelet will decompose the picture. Heads up: the picture can't be decomposed beyond a particular point (typically, 8 for a 640x480 frame โ€” as 2^9 = 512 > 480). Valid values are integers between 1 and 32. Default value is 6.
  • percent โ€” partial of full denoising (limited coefficients shrinking), from 0 to 100. Default value is 85.
  • planes โ€” a list of the planes to process. By default all planes are processed.
  • type โ€” the threshold type the filter will use. It accepts the following values:
    • universal โ€” the threshold used is the same for all decompositions.
    • bayes โ€” the threshold used depends also on each decomposition's coefficients.

Default is universal.


๐ŸŒ€ varblur ๐ŸŒ€

Apply a variable blur filter by using a 2nd video stream to set the blur radius. The 2nd stream must have the same dimensions. Yes, that's a requirement, don't come for me ๐Ÿ˜ญ

This filter accepts the following options:

  • min_r โ€” set the min allowed radius. Allowed range is from 0 to 254. Default is 0.
  • max_r โ€” set the max allowed radius. Allowed range is from 1 to 255. Default is 8.
  • planes โ€” set which planes to process. By default, all are used.

The varblur filter also supports the framesync options. ๐Ÿซถ

Commands

This filter supports all the above options as commands. ๐Ÿ‘‘


๐ŸŒˆ vectorscope ๐ŸŒˆ

Display 2 color component values in the two dimensional graph (which is, iconic naming moment, called a vectorscope). Main character energy tbh.

This filter accepts the following options:

  • mode, m โ€” set vectorscope mode. It accepts the following values:
    • gray, tint โ€” gray values are displayed on the graph; higher brightness means more pixels have the same component color value at that location in the graph. This is the default mode.
    • color โ€” gray values are displayed on the graph. Surrounding pixel values which are not present in the video frame are drawn in a gradient of the 2 color components which are set by the options x and y. The 3rd color component is static.
    • color2 โ€” the actual color component values present in the video frame are displayed on the graph.
    • color3 โ€” similar to color2, but a higher frequency of the same values x and y on the graph increases the value of another color component, which is luminance by default values of x and y.
    • color4 โ€” the actual colors present in the video frame are displayed on the graph. If two different colors map to the same position on the graph, then the color with the higher value of the component not present in the graph is picked.
    • color5 โ€” gray values are displayed on the graph. Similar to color, but with the 3rd color component picked from a radial gradient.
  • x โ€” set which color component will be represented on the X-axis. Default is 1.
  • y โ€” set which color component will be represented on the Y-axis. Default is 2.
  • intensity, i โ€” set intensity, used by modes gray, color, color3 and color5 for increasing brightness of the color component which represents the frequency of the (X, Y) location in the graph.
  • envelope, e:
    • none โ€” no envelope, this is the default.
    • instant โ€” instant envelope, even the darkest single pixel will be clearly highlighted.
    • peak โ€” hold the maximum and minimum values presented in the graph over time. This way you can still spot out-of-range values without constantly looking at the vectorscope. ๐Ÿ”ฅ
    • peak+instant โ€” peak and instant envelope combined together.
  • graticule, g โ€” set what kind of graticule to draw:
    • none
    • green
    • color
    • invert
  • opacity, o โ€” set graticule opacity.
  • flags, f โ€” set graticule flags:
    • white โ€” draw graticule for the white point.
    • black โ€” draw graticule for the black point.
    • name โ€” draw color points' short names.
  • bgopacity, b โ€” set background opacity.
  • lthreshold, l โ€” set the low threshold for the color component not represented on the X or Y axis. Values lower than this value will be ignored. Default is 0. Note: this value is multiplied with the actual max possible value one pixel component can have. So for 8-bit input and a low threshold value of 0.1, the actual threshold is 0.1 * 255 = 25. ๐Ÿงฎ
  • hthreshold, h โ€” set the high threshold for the color component not represented on the X or Y axis. Values higher than this value will be ignored. Default is 1. Note: this value is multiplied with the actual max possible value one pixel component can have. So for 8-bit input and a high threshold value of 0.9, the actual threshold is 0.9 * 255 = 230.
  • colorspace, c โ€” set what kind of colorspace to use when drawing the graticule:
    • auto
    • 601
    • 709

Default is auto.

  • tint0, t0, tint1, t1 โ€” set color tint for gray/tint vectorscope mode. By default both options are zero. This means no tint, and the output will remain gray. ๐Ÿฉถ

๐ŸŽฅ vidstabdetect ๐ŸŽฅ

Analyze video stabilization/deshaking. This is pass 1 of 2 โ€” see vidstabtransform for pass 2. Bestie, you have to do both passes, it's a two-parter, no skipping ๐Ÿ’€

This filter generates a file with relative translation and rotation transform information about subsequent frames, which is then used by the vidstabtransform filter.

To enable compilation of this filter you need to configure FFmpeg with --enable-libvidstab. Don't forget the flag or you'll be sitting there like "why is it not there" ๐Ÿ˜ญ

This filter accepts the following options:

  • result โ€” set the path to the file used to write the transforms information. Default value is transforms.trf.
  • shakiness โ€” set how shaky the video is and how quick the camera is. It accepts an integer in the range 1-10; a value of 1 means little shakiness, a value of 10 means strong shakiness. Default value is 5.
  • accuracy โ€” set the accuracy of the detection process. It must be a value in the range 1-15. A value of 1 means low accuracy, a value of 15 means high accuracy. Default value is 15. ๐ŸŽฏ
  • stepsize โ€” set the stepsize of the search process. The region around the minimum is scanned with 1 pixel resolution. Default value is 6.
  • mincontrast โ€” set minimum contrast. Below this value a local measurement field is discarded. Must be a floating point value in the range 0-1. Default value is 0.3.
  • tripod โ€” set the reference frame number for tripod mode.

If enabled, the motion of the frames is compared to a reference frame in the filtered stream, identified by the specified number. The idea is to compensate all movements in a more-or-less static scene and keep the camera view absolutely still. ๐Ÿง˜โ€โ™€๏ธ

If set to 0, it is disabled. The frames are counted starting from 1.

  • show โ€” show fields and transforms in the resulting frames. It accepts an integer in the range 0-2. Default value is 0, which disables any visualization. ๐Ÿ™ˆ
  • fileformat โ€” format for the transforms data file to be written. Acceptable values are:
    • ascii โ€” human-readable plain text
    • binary โ€” binary format, roughly 40% smaller than ascii. (default)

๐ŸŽฌ Examples ๐ŸŽฌ

  • Use default values:
vidstabdetect
  • Analyze a strongly shaky movie and put the results in the file mytransforms.trf:
vidstabdetect=shakiness=10:accuracy=15:result="mytransforms.trf"
  • Visualize the result of internal transformations in the resulting video:

First, this little snippet:

vidstabdetect=show=1
  • Analyze a video with medium shakiness using ffmpeg:
ffmpeg -i input -vf vidstabdetect=shakiness=5:show=1 dummy.avi

vidstabtransform ๐ŸŽ€

Video stabilization/deshaking: pass 2 of 2, see vidstabdetect for pass 1.

Read a file with transform information for each frame and apply/compensate them. Together with the vidstabdetect filter this can be used to deshake videos. See also http://public.hronopik.de/vid.stab. It is important to also use the unsharp filter, see below. ๐Ÿ’–

To enable compilation of this filter you need to configure FFmpeg with --enable-libvidstab.

Options

  • input โ€” Set path to the file used to read the transforms. Default value is transforms.trf.
  • smoothing โ€” Set the number of frames (value*2 + 1) used for lowpass filtering the camera movements. Default value is 10.

For example a number of 10 means that 21 frames are used (10 in the past and 10 in the future) to smoothen the motion in the video. A larger value leads to a smoother video, but limits the acceleration of the camera (pan/tilt movements). 0 is a special case where a static camera is simulated.

  • optalgo โ€” Set the camera path optimization algorithm.

Accepted values are:

  • gauss โ€” gaussian kernel low-pass filter on camera motion (default)
  • avg โ€” averaging on transformations
  • maxshift โ€” Set maximal number of pixels to translate frames. Default value is -1, meaning no limit.
  • maxangle โ€” Set maximal angle in radians (degree*PI/180) to rotate frames. Default value is -1, meaning no limit.
  • crop โ€” Specify how to deal with borders that may be visible due to movement compensation.

Available values are:

  • keep โ€” keep image information from previous frame (default)
  • black โ€” fill the border black
  • invert โ€” Invert transforms if set to 1. Default value is 0.
  • relative โ€” Consider transforms as relative to previous frame if set to 1, absolute if set to 0. Default value is 0.
  • zoom โ€” Set percentage to zoom. A positive value will result in a zoom-in effect, a negative value in a zoom-out effect. Default value is 0 (no zoom).
  • optzoom โ€” Set optimal zooming to avoid borders.

Accepted values are:

  • 0 โ€” disabled
  • 1 โ€” optimal static zoom value is determined (only very strong movements will lead to visible borders) (default)
  • 2 โ€” optimal adaptive zoom value is determined (no borders will be visible), see zoomspeed

Note that the value given at zoom is added to the one calculated here.

  • zoomspeed โ€” Set percent to zoom maximally each frame (enabled when optzoom is set to 2). Range is from 0 to 5, default value is 0.25.
  • interpol โ€” Specify type of interpolation.

Available values are:

  • no โ€” no interpolation
  • linear โ€” linear only horizontal
  • bilinear โ€” linear in both directions (default)
  • bicubic โ€” cubic in both directions (slow)
  • tripod โ€” Enable virtual tripod mode if set to 1, which is equivalent to relative=0:smoothing=0. Default value is 0.

Use also tripod option of vidstabdetect.

  • debug โ€” Increase log verbosity if set to 1. Also the detected global motions are written to the temporary file global_motions.trf. Default value is 0.

Examples

  • Use ffmpeg for a typical stabilization with default values:
ffmpeg -i inp.mpeg -vf vidstabtransform,unsharp=5:5:0.8:3:3:0.4 inp_stabilized.mpeg

Note the use of the unsharp filter which is always recommended. ๐Ÿ’…

  • Zoom in a bit more and load transform data from a given file:
vidstabtransform=zoom=5:input="mytransforms.trf"
  • Smoothen the video even more:
vidstabtransform=smoothing=30

vflip ๐Ÿฆ‹

Flip the input video vertically.

For example, to vertically flip a video with ffmpeg:

ffmpeg -i in.avi -vf "vflip" out.avi

vfrdet ๐Ÿ’€

Detect variable frame rate video.

This filter tries to detect if the input is variable or constant frame rate.

At end it will output number of frames detected as having variable delta pts, and ones with constant delta pts. If there was frames with variable delta, than it will also show min, max and average delta encountered.


vibrance ๐ŸŒˆ

Boost or alter saturation.

The filter accepts the following options:

  • intensity โ€” Set strength of boost if positive value or strength of alter if negative value. Default is 0. Allowed range is from -2 to 2.
  • rbal โ€” Set the red balance. Default is 1. Allowed range is from -10 to 10.
  • gbal โ€” Set the green balance. Default is 1. Allowed range is from -10 to 10.
  • bbal โ€” Set the blue balance. Default is 1. Allowed range is from -10 to 10.
  • rlum โ€” Set the red luma coefficient.
  • glum โ€” Set the green luma coefficient.
  • blum โ€” Set the blue luma coefficient.
  • alternate โ€” If intensity is negative and this is set to 1, colors will change, otherwise colors will be less saturated, more towards gray.

Commands

This filter supports the all above options as commands. ๐Ÿ‘‘


vif ๐Ÿ”ฅ

Obtain the average VIF (Visual Information Fidelity) between two input videos.

This filter takes two input videos.

Both input videos must have the same resolution and pixel format for this filter to work correctly. Also it assumes that both inputs have the same number of frames, which are compared one by one.

The obtained average VIF score is printed through the logging system.

The filter stores the calculated VIF score of each frame.

This filter also supports the framesync options.

In the below example the input file main.mpg being processed is compared with the reference file ref.mpg.

ffmpeg -i main.mpg -i ref.mpg -lavfi vif -f null -

vignette ๐ŸŽ€

Make or reverse a natural vignetting effect.

The filter accepts the following options:

  • angle, a โ€” Set lens angle expression as a number of radians.

The value is clipped in the [0,PI/2] range.

Default value: PI/5

  • x0, y0 โ€” Set center coordinates expressions. Respectively w/2 and h/2 by default.
  • mode โ€” Set forward/backward mode.

Available modes are:

  • forward โ€” The larger the distance from the central point, the darker the image becomes.
  • backward โ€” The larger the distance from the central point, the brighter the image becomes. This can be used to reverse a vignette effect, though there is no automatic detection to extract the lens angle and other settings (yet). It can also be used to create a burning effect.

Default value is forward.

  • eval โ€” Set evaluation mode for the expressions (angle, x0, y0).

It accepts the following values:

  • init โ€” Evaluate expressions only once during the filter initialization.
  • frame โ€” Evaluate expressions for each incoming frame. This is way slower than the init mode since it requires all the scalers to be re-computed, but it allows advanced dynamic expressions.

Default value is init.

  • dither โ€” Set dithering to reduce the circular banding effects. Default is 1 (enabled).
  • aspect โ€” Set vignette aspect. This setting allows one to adjust the shape of the vignette. Setting this value to the SAR of the input will make a rectangular vignetting following the dimensions of the video.

Default is 1/1.

Expressions

The alpha, x0 and y0 expressions can contain the following parameters.

  • w, h โ€” input width and height
  • n โ€” the number of input frame, starting from 0
  • pts โ€” the PTS (Presentation TimeStamp) time of the filtered video frame, expressed in TB units, NAN if undefined
  • r โ€” frame rate of the input video, NAN if the input frame rate is unknown
  • t โ€” the PTS (Presentation TimeStamp) of the filtered video frame, expressed in seconds, NAN if undefined
  • tb โ€” time base of the input video

Examples

  • Apply simple strong vignetting effect:
vignette=PI/4
  • Make a flickering vignetting:
vignette='PI/4+random(1)*PI/50':eval=frame

vmafmotion โญ

Obtain the average VMAF motion score of a video. It is one of the component metrics of VMAF.

The obtained average motion score is printed through the logging system.

The filter accepts the following options:

  • stats_file โ€” If specified, the filter will use the named file to save the motion score of each frame with respect to the previous frame. When filename equals - the data is sent to standard output.

Example:

ffmpeg -i ref.mpg -vf vmafmotion -f null -

vpp_amf ๐Ÿ’œ

Scale (resize) and convert colorspace, transfer characteristics or color primaries for the input video, using AMD Advanced Media Framework library for hardware acceleration. Setting the output width and height works in the same way as for the scale filter.

The filter accepts the following options:

  • w, h โ€” Set the output video dimension expression. Default value is the input dimension.

Allows for the same expressions as the scale filter.

  • scale_type โ€” Sets the algorithm used for scaling:
    • bilinear โ€” Bilinear. This is the default.
    • bicubic โ€” Bicubic.
  • format โ€” Controls the output pixel format. By default, or if none is specified, the input pixel format is used.
  • force_original_aspect_ratio, force_divisible_by โ€” Work the same as the identical scale filter options.
  • reset_sar โ€” Works the same as the identical scale filter option.
  • color_profile โ€” Specify all color properties at once.

The accepted values are:

  • bt601 โ€” BT.601
  • bt709 โ€” BT.709
  • bt2020 โ€” BT.2020
  • trc โ€” Specify output transfer characteristics.

The accepted values are:

  • bt709 โ€” BT.709
  • gamma22 โ€” Constant gamma of 2.2
  • gamma28 โ€” Constant gamma of 2.8
  • smpte170m โ€” SMPTE-170M
  • smpte240m โ€” SMPTE-240M
  • linear โ€” Linear
  • log โ€” LOG
  • log-sqrt โ€” LOG_SQRT
  • iec61966-2-4 โ€” iec61966-2-4
  • bt1361-ecg โ€” BT1361_ECG
  • iec61966-2-1 โ€” iec61966-2-1
  • bt2020-10 โ€” BT.2020 for 10-bits content
  • bt2020-12 โ€” BT.2020 for 12-bits content
  • smpte2084 โ€” SMPTE2084
  • smpte428 โ€” SMPTE428
  • arib-std-b67 โ€” ARIB_STD_B67
  • primaries โ€” Specify output color primaries. The accepted values are:
    • bt709 โ€” BT.709
    • bt470m โ€” BT.470M
    • bt470bg โ€” BT.470BG or BT.601-6 625
    • smpte170m โ€” SMPTE-170M or BT.601-6 525
    • smpte240m โ€” SMPTE-240M
    • film โ€” film
    • bt2020 โ€” BT.2020
    • smpte428 โ€” SMPTE-428
    • smpte431 โ€” SMPTE-431
    • smpte432 โ€” SMPTE-432
    • jedec-p22 โ€” JEDEC P22 phosphors

โœจ Examples โœจ

  • Scale input to 720p, keeping aspect ratio and ensuring the output is yuv420p.
vpp_amf=-2:720:format=yuv420p
  • Upscale to 4K and change color profile to bt2020.
vpp_amf=4096:2160:color_profile=bt2020

๐Ÿงบ vstack ๐Ÿงบ

Stack input videos vertically. Bestie, it's giving tidy little video pancake stack.

All streams must be of same pixel format and of same width.

Note that this filter is faster than using overlay and pad filter to create same output.

The filter accepts the following options:

  • inputs โ€” Set number of input streams. Default is 2.
  • shortest โ€” If set to 1, force the output to terminate when the shortest input terminates. Default value is 0.

๐ŸŽž๏ธ w3fdif ๐ŸŽž๏ธ

Deinterlace the input video (w3fdif stands for Weston 3 Field Deinterlacing Filter).

Based on the process described by Martin Weston for BBC R&D, and implemented based on the de-interlace algorithm written by Jim Easterbrook for BBC R&D, the Weston 3 field deinterlacing filter uses filter coefficients calculated by BBC R&D.

This filter uses field-dominance information in frame to decide which of each pair of fields to place first in the output. If it gets it wrong use setfield filter before w3fdif filter.

There are two sets of filter coefficients, so called simple and complex. Which set of filter coefficients is used can be set by passing an optional parameter:

  • filter โ€” Set the interlacing filter coefficients. Accepts one of the following values:
    • simple โ€” Simple filter coefficient set.
    • complex โ€” More-complex filter coefficient set. Default value is complex.
  • mode โ€” The interlacing mode to adopt. It accepts one of the following values:
    • frame โ€” Output one frame for each frame.
    • field โ€” Output one frame for each field. The default value is field.
  • parity โ€” The picture field parity assumed for the input interlaced video. It accepts one of the following values:
    • tff โ€” Assume the top field is first.
    • bff โ€” Assume the bottom field is first.
    • auto โ€” Enable automatic detection of field parity. The default value is auto. If the interlacing is unknown or the decoder does not export this information, top field first will be assumed.
  • deint โ€” Specify which frames to deinterlace. Accepts one of the following values:
    • all โ€” Deinterlace all frames.
    • interlaced โ€” Only deinterlace frames marked as interlaced. Default value is all.

๐ŸŽฎ Commands ๐ŸŽฎ

This filter supports same commands as options.

๐ŸŒŠ waveform ๐ŸŒŠ

Video waveform monitor. It's lowkey the vibe check for your color components.

The waveform monitor plots color component intensity. By default luma only. Each column of the waveform corresponds to a column of pixels in the source video.

It accepts the following options:

  • mode, m โ€” Can be either row, or column. Default is column. In row mode, the graph on the left side represents color component value 0 and the right side represents value = 255. In column mode, the top side represents color component value = 0 and bottom side represents value = 255.
  • intensity, i โ€” Set intensity. Smaller values are useful to find out how many values of the same luminance are distributed across input rows/columns. Default value is 0.04. Allowed range is [0, 1].
  • mirror, r โ€” Set mirroring mode. 0 means unmirrored, 1 means mirrored. In mirrored mode, higher values will be represented on the left side for row mode and at the top for column mode. Default is 1 (mirrored).
  • display, d โ€” Set display mode. It accepts the following values:
    • overlay โ€” Presents information identical to that in the parade, except that the graphs representing color components are superimposed directly over one another. This display mode makes it easier to spot relative differences or similarities in overlapping areas of the color components that are supposed to be identical, such as neutral whites, grays, or blacks.
    • stack โ€” Display separate graph for the color components side by side in row mode or one below the other in column mode.
    • parade โ€” Display separate graph for the color components side by side in column mode or one below the other in row mode. Using this display mode makes it easy to spot color casts in the highlights and shadows of an image, by comparing the contours of the top and the bottom graphs of each waveform. Since whites, grays, and blacks are characterized by exactly equal amounts of red, green, and blue, neutral areas of the picture should display three waveforms of roughly equal width/height. If not, the correction is easy to perform by making level adjustments the three waveforms. Default is stack.
  • components, c โ€” Set which color components to display. Default is 1, which means only luma or red color component if input is in RGB colorspace. If is set for example to 7 it will display all 3 (if) available color components.
  • envelope, e โ€”
    • none โ€” No envelope, this is default.
    • instant โ€” Instant envelope, minimum and maximum values presented in graph will be easily visible even with small step value.
    • peak โ€” Hold minimum and maximum values presented in graph across time. This way you can still spot out of range values without constantly looking at waveforms.
    • peak+instant โ€” Peak and instant envelope combined together.
  • filter, f โ€”
    • lowpass โ€” No filtering, this is default.
    • flat โ€” Luma and chroma combined together.
    • aflat โ€” Similar as above, but shows difference between blue and red chroma.
    • xflat โ€” Similar as above, but use different colors.
    • yflat โ€” Similar as above, but again with different colors.
    • chroma โ€” Displays only chroma.
    • color โ€” Displays actual color value on waveform.
    • acolor โ€” Similar as above, but with luma showing frequency of chroma values.
  • graticule, g โ€” Set which graticule to display.
    • none โ€” Do not display graticule.
    • green โ€” Display green graticule showing legal broadcast ranges.
    • orange โ€” Display orange graticule showing legal broadcast ranges.
    • invert โ€” Display invert graticule showing legal broadcast ranges.
  • opacity, o โ€” Set graticule opacity.
  • flags, fl โ€” Set graticule flags.
    • numbers โ€” Draw numbers above lines. By default enabled.
    • dots โ€” Draw dots instead of lines.
  • scale, s โ€” Set scale used for displaying graticule. Accepts digital, millivolts, ire. Default is digital.
  • bgopacity, b โ€” Set background opacity.
  • tint0, t0, tint1, t1 โ€” Set tint for output. Only used with lowpass filter and when display is not overlay and input pixel formats are not RGB.
  • fitmode, fm โ€” Set sample aspect ratio of video output frames. Can be used to configure waveform so it is not stretched too much in one of directions.
    • none โ€” Set sample aspect ratio to 1/1.
    • size โ€” Set sample aspect ratio to match input size of video. Default is none.
  • input โ€” Set input formats for filter to pick from. Can be all, for selecting from all available formats, or first, for selecting first available format. Default is first.

๐Ÿงต weave, doubleweave ๐Ÿงต

The weave takes a field-based video input and join each two sequential fields into single frame, producing a new double height clip with half the frame rate and half the frame count.

The doubleweave works same as weave but without halving frame rate and frame count.

It accepts the following option:

  • first_field โ€” Set first field. Available values are:
    • top, t โ€” Set the frame as top-field-first.
    • bottom, b โ€” Set the frame as bottom-field-first.

๐ŸŒธ Examples ๐ŸŒธ

  • Interlace video using select and separatefields filter:
separatefields,select=eq(mod(n,4),0)+eq(mod(n,4),3),weave

๐Ÿ” xbr ๐Ÿ”

Apply the xBR high-quality magnification filter which is designed for pixel art. It follows a set of edge-detection rules, see https://forums.libretro.com/t/xbr-algorithm-tutorial/123.

It accepts the following option:

  • n โ€” Set the scaling dimension: 2 for 2xBR, 3 for 3xBR and 4 for 4xBR. Default is 3.

๐Ÿงฎ xcorrelate ๐Ÿงฎ

Apply normalized cross-correlation between first and second input video stream.

Second input video stream dimensions must be lower than first input video stream.

The filter accepts the following options:

  • planes โ€” Set which planes to process.
  • secondary โ€” Set which secondary video frames will be processed from second input video stream, can be first or all. Default is all.

The xcorrelate filter also supports the framesync options.

๐Ÿ’ซ xfade ๐Ÿ’ซ

Apply cross fade from one input video stream to another input video stream. The cross fade is applied for specified duration.

Both inputs must be constant frame-rate and have the same resolution, pixel format, frame rate and timebase.

The filter accepts the following options:

  • transition โ€” Set one of available transition effects:

โ€ฆand the transition value menu keeps going, bestie โ€” here are the rest of the valid names, every single one, no cap:

  • custom
  • fade
  • wipeleft
  • wiperight
  • wipeup
  • wipedown
  • slideleft
  • slideright
  • slideup
  • slidedown
  • circlecrop
  • rectcrop
  • distance
  • fadeblack
  • fadewhite
  • radial
  • smoothleft
  • smoothright
  • smoothup
  • smoothdown
  • circleopen
  • circleclose
  • vertopen
  • vertclose
  • horzopen
  • horzclose
  • dissolve
  • pixelize
  • diagtl
  • diagtr
  • diagbl
  • diagbr
  • hlslice
  • hrslice
  • vuslice
  • vdslice
  • hblur
  • fadegrays
  • wipetl
  • wipetr
  • wipebl
  • wipebr
  • squeezeh
  • squeezev
  • zoomin
  • fadefast
  • fadeslow
  • hlwind
  • hrwind
  • vuwind
  • vdwind
  • coverleft
  • coverright
  • coverup
  • coverdown
  • revealleft
  • revealright
  • revealup
  • revealdown

Default transition effect is fade โ€” sheโ€™s the default for a reason ๐Ÿ’….

  • duration โ€” Set cross fade duration in seconds. Range is 0 to 60 seconds. Default duration is 1 second.
  • offset โ€” Set cross fade start relative to first input stream in seconds. Default offset is 0.
  • expr โ€” Set expression for custom transition effect.

The expressions can use these variables and functions:

  • X, Y โ€” The coordinates of the current sample.
  • W, H โ€” The width and height of the image.
  • P โ€” Progress of transition effect.
  • PLANE โ€” Currently processed plane.
  • A โ€” Return value of first input at current location and plane.
  • B โ€” Return value of second input at current location and plane.
  • a0(x, y), a1(x, y), a2(x, y), a3(x, y) โ€” Return the value of the pixel at location (x,y) of the first/second/third/fourth component of first input.
  • b0(x, y), b1(x, y), b2(x, y), b3(x, y) โ€” Return the value of the pixel at location (x,y) of the first/second/third/fourth component of second input.

โœจ Examples

  • Cross fade from one input video to another input video, with fade transition and duration of transition of 2 seconds starting at offset of 5 seconds:
ffmpeg -i first.mp4 -i second.mp4 -filter_complex xfade=transition=fade:duration=2:offset=5 output.mp4

๐ŸŽ€ xmedian

Pick median pixels from several input videos ๐Ÿ’–.

The filter accepts the following options:

  • inputs โ€” Set number of inputs. Default is 3. Allowed range is from 3 to 255. If number of inputs is even number, than result will be mean value between two median values.
  • planes โ€” Set which planes to filter. Default value is 15, by which all planes are processed.
  • percentile โ€” Set median percentile. Default value is 0.5. Default value of 0.5 will pick always median values, while 0 will pick minimum values, and 1 maximum values.

๐Ÿ’… Commands

This filter supports all above options as commands, excluding option "inputs".


๐ŸŒˆ xpsnr

Obtain the average (across all input frames) and minimum (across all color plane averages) eXtended Perceptually weighted peak Signal-to-Noise Ratio (XPSNR) between two input videos ๐Ÿ‘‘.

The XPSNR is a low-complexity psychovisually motivated distortion measurement algorithm for assessing the difference between two video streams or images. This is especially useful for objectively quantifying the distortions caused by video and image codecs, as an alternative to a formal subjective test. The logarithmic XPSNR output values are in a similar range as those of traditional psnr assessments but better reflect human impressions of visual coding quality. More details on the XPSNR measure, which essentially represents a blockwise weighted variant of the PSNR measure, can be found in the following freely available papers:

  • C. R. Helmrich, M. Siekmann, S. Becker, S. Bosse, D. Marpe, and T. Wiegand, "XPSNR: A Low-Complexity Extension of the Perceptually Weighted Peak Signal-to-Noise Ratio for High-Resolution Video Quality Assessment," in Proc. IEEE Int. Conf. Acoustics, Speech, Sig. Process. (ICASSP), virt./online, May 2020. <www.ecodis.de/xpsnr.htm>
  • C. R. Helmrich, S. Bosse, H. Schwarz, D. Marpe, and T. Wiegand, "A Study of the Extended Perceptually Weighted Peak Signal-to-Noise Ratio (XPSNR) for Video Compression with Different Resolutions and Bit Depths," ITU Journal: ICT Discoveries, vol. 3, no. 1, pp. 65 - 72, May 2020. <http://handle.itu.int/11.1002/pub/8153d78b-en>

When publishing the results of XPSNR assessments obtained using, e.g., this FFmpeg filter, a reference to the above papers as a means of documentation is strongly encouraged. The filter requires two input videos. The first input is considered a (usually not distorted) reference source and is passed unchanged to the output, whereas the second input is a (distorted) test signal. Except for the bit depth, these two video inputs must have the same pixel format. In addition, for best performance, both compared input videos should be in YCbCr color format.

The obtained overall XPSNR values mentioned above are printed through the logging system. In case of input with multiple color planes, we suggest reporting of the minimum XPSNR average.

The following parameter, which behaves like the one for the psnr filter, is accepted:

  • stats_file, f โ€” If specified, the filter will use the named file to save the XPSNR value of each individual frame and color plane. When the file name equals -, that data is sent to standard output.

This filter also supports the framesync options.

๐ŸŒธ Examples

  • XPSNR analysis of two 1080p HD videos, ref_source.yuv and test_video.yuv, both at 24 frames per second, with color format 4:2:0, bit depth 8, and output of a logfile named "xpsnr.log":
ffmpeg -s 1920x1080 -framerate 24 -pix_fmt yuv420p -i ref_source.yuv -s 1920x1080 -framerate
24 -pix_fmt yuv420p -i test_video.yuv -lavfi xpsnr="stats_file=xpsnr.log" -f null -
  • XPSNR analysis of two 2160p UHD videos, ref_source.yuv with bit depth 8 and test_video.yuv with bit depth 10, both at 60 frames per second with color format 4:2:0, no logfile output:
ffmpeg -s 3840x2160 -framerate 60 -pix_fmt yuv420p -i ref_source.yuv -s 3840x2160 -framerate
60 -pix_fmt yuv420p10le -i test_video.yuv -lavfi xpsnr="stats_file=-" -f null -

๐Ÿงš xstack

Stack video inputs into custom layout ๐Ÿฆ‹.

All streams must be of same pixel format.

The filter accepts the following options:

  • inputs โ€” Set number of input streams. Default is 2.
  • layout โ€” Specify layout of inputs. This option requires the desired layout configuration to be explicitly set by the user. This sets position of each video input in output. Each input is separated by '|'. The first number represents the column, and the second number represents the row. Numbers start at 0 and are separated by '_'. Optionally one can use wX and hX, where X is video input from which to take width or height. Multiple values can be used when separated by '+'. In such case values are summed together.

Note that if inputs are of different sizes gaps may appear, as not all of the output video frame will be filled. Similarly, videos can overlap each other if their position doesn't leave enough space for the full frame of adjoining videos.

For 2 inputs, a default layout of "0_0|w0_0" (equivalent to "grid=2x1") is set. In all other cases, a layout or a grid must be set by the user. Either "grid" or "layout" can be specified at a time. Specifying both will result in an error.

  • grid โ€” Specify a fixed size grid of inputs. This option is used to create a fixed size grid of the input streams. Set the grid size in the form "COLUMNSxROWS". There must be "ROWS * COLUMNS" input streams and they will be arranged as a grid with "ROWS" rows and "COLUMNS" columns. When using this option, each input stream within a row must have the same height and all the rows must have the same width.

If "grid" is set, then "inputs" option is ignored and is implicitly set to "ROWS * COLUMNS".

For 2 inputs, a default grid of "2x1" (equivalent to "layout=0_0|w0_0") is set. In all other cases, a layout or a grid must be set by the user. Either "grid" or "layout" can be specified at a time. Specifying both will result in an error.

  • shortest โ€” If set to 1, force the output to terminate when the shortest input terminates. Default value is 0.
  • fill โ€” If set to valid color, all unused pixels will be filled with that color. By default fill is set to none, so it is disabled.

๐ŸŒˆ Examples

  • Display 4 inputs into 2x2 grid.

Layout:

input1(0, 0)  | input3(w0, 0)
input2(0, h0) | input4(w0, h0)

xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0

Note that if inputs are of different sizes, gaps or overlaps may occur.

  • Display 4 inputs into 1x4 grid.

Layout:

input1(0, 0)
input2(0, h0)
input3(0, h0+h1)
input4(0, h0+h1+h2)

xstack=inputs=4:layout=0_0|0_h0|0_h0+h1|0_h0+h1+h2

Note that if inputs are of different widths, unused space will appear.

  • Display 9 inputs into 3x3 grid.

Layout:

input1(0, 0)       | input4(w0, 0)      | input7(w0+w3, 0)
input2(0, h0)      | input5(w0, h0)     | input8(w0+w3, h0)
input3(0, h0+h1)   | input6(w0, h0+h1)  | input9(w0+w3, h0+h1)

xstack=inputs=9:layout=0_0|0_h0|0_h0+h1|w0_0|w0_h0|w0_h0+h1|w0+w3_0|w0+w3_h0|w0+w3_h0+h1

Note that if inputs are of different sizes, gaps or overlaps may occur.

  • Display 16 inputs into 4x4 grid.

Layout:

input1(0, 0)       | input5(w0, 0)       | input9 (w0+w4, 0)       | input13(w0+w4+w8, 0)
input2(0, h0)      | input6(w0, h0)      | input10(w0+w4, h0)      | input14(w0+w4+w8, h0)
input3(0, h0+h1)   | input7(w0, h0+h1)   | input11(w0+w4, h0+h1)   | input15(w0+w4+w8, h0+h1)
input4(0, h0+h1+h2)| input8(w0, h0+h1+h2)| input12(w0+w4, h0+h1+h2)| input16(w0+w4+w8, h0+h1+h2)

xstack=inputs=16:layout=0_0|0_h0|0_h0+h1|0_h0+h1+h2|w0_0|w0_h0|w0_h0+h1|w0_h0+h1+h2|w0+w4_0|
w0+w4_h0|w0+w4_h0+h1|w0+w4_h0+h1+h2|w0+w4+w8_0|w0+w4+w8_h0|w0+w4+w8_h0+h1|w0+w4+w8_h0+h1+h2
โš ๏ธ heads up bestie: if your inputs are different sizes, you might get gaps or overlaps. it's giving "seams." just so you know ๐Ÿ’€

โœจ yadif โœจ

Deinterlace your input video, periodt. (and yes, "yadif" literally stands for "yet another deinterlacing filter" โ€” the naming committee was tired, okay? ๐Ÿ˜ญ)

It accepts these parameters:

  • mode โ€” the interlacing mode to adopt. accepted values are:
    • 0, send_frame โ€” output one frame for each frame ๐ŸŽ€
    • 1, send_field โ€” output one frame for each field ๐Ÿฆ‹
    • 2, send_frame_nospatial โ€” like send_frame, but it skips the spatial interlacing check
    • 3, send_field_nospatial โ€” like send_field, but it skips the spatial interlacing check

default value is send_frame. slay.

  • parity โ€” the picture field parity assumed for the input interlaced video. it accepts:
    • 0, tff โ€” assume the top field is first
    • 1, bff โ€” assume the bottom field is first
    • -1, auto โ€” enable automatic detection of field parity โœจ

default value is auto. and if the interlacing is unknown or the decoder doesn't export this info, top field first will be assumed. iykyk.

  • deint โ€” specify which frames to deinterlace. accepts:
    • 0, all โ€” deinterlace all frames
    • 1, interlaced โ€” only deinterlace frames marked as interlaced

default value is all. ๐Ÿ‘‘


โœจ yaepblur โœจ

Apply a blur filter while preserving edges โ€” "yaepblur" means "yet another edge preserving blur filter" (the acronym girlies stay winning ๐Ÿ’…). the algorithm is described in J. S. Lee, Digital image enhancement and noise filtering by use of local statistics, IEEE Trans. Pattern Anal. Mach. Intell. PAMI-2, 1980.

It accepts these parameters:

  • radius, r โ€” set the window radius. default value is 3.
  • planes, p โ€” set which planes to filter. default is only the first plane.
  • sigma, s โ€” set blur strength. default value is 128.

๐Ÿ’ฌ Commands

This filter supports same commands as options. easy.


โœจ zoompan โœจ

Apply that Zoom & Pan effect, main character energy only ๐ŸŽฌโœจ

This filter accepts the following options:

  • zoom, z โ€” set the zoom expression. range is 1-10. default is 1.
  • x, y โ€” set the x and y expression. default is 0.
  • d โ€” set the duration expression in number of frames. this sets for how many number of frames the effect will last for a single input image. default is 90.
  • s โ€” set the output image size, default is hd720.
  • fps โ€” set the output frame rate, default is 25.

Each expression can contain the following constants:

  • in_w, iw โ€” input width.
  • in_h, ih โ€” input height.
  • out_w, ow โ€” output width.
  • out_h, oh โ€” output height.
  • in โ€” input frame count.
  • on โ€” output frame count.
  • in_time, it โ€” the input timestamp expressed in seconds. it's NAN if the input timestamp is unknown.
  • out_time, time, ot โ€” the output timestamp expressed in seconds.
  • x, y โ€” last calculated x and y position from x and y expression for current input frame.
  • px, py โ€” x and y of last output frame of previous input frame, or 0 when there was not yet such frame (first input frame).
  • zoom โ€” last calculated zoom from z expression for current input frame.
  • pzoom โ€” last calculated zoom of last output frame of previous input frame.
  • duration โ€” number of output frames for current input frame. calculated from d expression for each input frame.
  • pduration โ€” number of output frames created for previous input frame.
  • a โ€” rational number: input width / input height.
  • sar โ€” sample aspect ratio.
  • dar โ€” display aspect ratio.

๐ŸŒธ Examples

  • zoom in up to 1.5x and pan at the same time to some spot near the center of the picture:
zoompan=z='min(zoom+0.0015,1.5)':d=700:x='if(gte(zoom,1.5),x,x+1/a)':y='if(gte(zoom,1.5),y,y+1)':s=640x360
  • zoom in up to 1.5x and pan always at the center of the picture:
zoompan=z='min(zoom+0.0015,1.5)':d=700:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'
  • same as above but without pausing:
zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'
  • zoom in 2x into the center of the picture only for the first second of the input video:
zoompan=z='if(between(in_time,0,1),2,1)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'

โœจ zscale โœจ

Scale (resize) the input video using the z.lib library: <https://github.com/sekrit-twc/zimg>. to enable compilation of this filter, you need to configure FFmpeg with --enable-libzimg. no cap, that flag is mandatory ๐Ÿซถ

The zscale filter forces the output display aspect ratio to be the same as the input, by changing the output sample aspect ratio. iconic behaviour.

If the input image format is different from the format requested by the next filter, the zscale filter will convert the input to the requested format. it just handles it ๐Ÿ’…

๐ŸŽ€ Options

The filter accepts the following options.

  • width, w / height, h โ€” set the output video dimension expression. default value is the input dimension.

If the width or w value is 0, the input width is used for the output. if the height or h value is 0, the input height is used for the output.

If one and only one of the values is -n with n >= 1, the zscale filter will use a value that maintains the aspect ratio of the input image, calculated from the other specified dimension. after that it will, however, make sure that the calculated dimension is divisible by n and adjust the value if necessary. math girlie behaviour โœจ

If both values are -n with n >= 1, the behavior will be identical to both values being set to 0 as previously detailed.

See below for the list of accepted constants for use in the dimension expression.

  • size, s โ€” set the video size. for the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.
  • dither, d โ€” set the dither type. possible values are: none, ordered, random, error_diffusion. default is none.
  • filter, f โ€” set the resize filter type. possible values are: point, bilinear, bicubic, spline16, spline36, spline64, lanczos. default is bilinear.
  • range, r โ€” set the color range. possible values are: input, limited, full. default is same as input.
  • primaries, p โ€” set the color primaries. possible values are: input, 709, unspecified, 170m, 240m, 2020. default is same as input.
  • transfer, t โ€” set the transfer characteristics. possible values are: input, 709, unspecified, 601, linear, 2020_10, 2020_12, smpte2084, iec61966-2-1, arib-std-b67. default is same as input.
  • matrix, m โ€” set the colorspace matrix. possible values are: input, 709, unspecified, 470bg, 170m, 2020_ncl, 2020_cl. default is same as input.
  • rangein, rin โ€” set the input color range. possible values are: input, limited, full. default is same as input.
  • primariesin, pin โ€” set the input color primaries. possible values are: input, 709, unspecified, 170m, 240m, 2020. default is same as input.
  • transferin, tin โ€” set the input transfer characteristics. possible values are: input, 709, unspecified, 601, linear, 2020_10, 2020_12. default is same as input.
  • matrixin, min โ€” set the input colorspace matrix. possible values are: input, 709, unspecified, 470bg, 170m, 2020_ncl, 2020_cl.
  • chromal, c โ€” set the output chroma location. possible values are: input, left, center, topleft, top, bottomleft, bottom.
  • chromalin, cin โ€” set the input chroma location. possible values are: input, left, center, topleft, top, bottomleft, bottom.
  • npl โ€” set the nominal peak luminance.
  • param_a โ€” parameter A for scaling filters. parameter b for bicubic, and the number of filter taps for lanczos.
  • param_b โ€” parameter B for scaling filters. parameter c for bicubic.

The values of the w and h options are expressions containing the following constants:

  • in_w, in_h โ€” the input width and height.
  • iw, ih โ€” these are the same as in_w and in_h.
  • out_w, out_h โ€” the output (scaled) width and height.
  • ow, oh โ€” these are the same as out_w and out_h.
  • a โ€” the same as iw / ih.
  • sar โ€” input sample aspect ratio.
  • dar โ€” the input display aspect ratio. calculated from (iw / ih) * sar.
  • hsub, vsub โ€” horizontal and vertical input chroma subsample values. for example for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • ohsub, ovsub โ€” horizontal and vertical output chroma subsample values. for example for the pixel format yuv422p, hsub is 2 and vsub is 1.

๐Ÿ’ฌ Commands

This filter supports the following commands:

  • width, w / height, h โ€” set the output video dimension expression. the command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current value. no crash, no drama ๐Ÿซถ


๐Ÿฆ‹ CUDA VIDEO FILTERS ๐Ÿฆ‹

To enable CUDA and/or NPP filters please refer to configuration guidelines for CUDA and for CUDA NPP filters. (yes, you actually have to read those. i know. i'm sorry ๐Ÿ˜ญ)

Running CUDA filters requires you to initialize a hardware device and to pass that device to all filters in any filter graph. non-negotiable, bestie.

  • -init_hw_device cuda[=name][:device[,key=value...]] โ€” initialise a new hardware device of type cuda called name, using the given device parameters.
  • -filter_hw_device name โ€” pass the hardware device called name to all filters in any filter graph.

For more detailed information see <https://www.ffmpeg.org/ffmpeg.html#Advanced-Video-options> โœจ

  • example of initializing the second CUDA device on the system and running scale_cuda and bilateral_cuda filters:
./ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -init_hw_device cuda:1 -filter_complex \
"[0:v]scale_cuda=format=yuv444p[scaled_video];[scaled_video]bilateral_cuda=window_size=9:sigmaS=3.0:sigmaR=50.0" \
-an -sn -c:v h264_nvenc -cq 20 out.mp4

GPU girlies, that one's for you ๐Ÿ‘‘๐Ÿ”ฅ

  • If the input frames are already in GPU memory</p> (like when you're using -hwaccel cuda or -hwaccel_output_format cuda) โ€” bestie you do NOT need to call hwupload yourself, the data is literally already sitting in the right memory space. slay.
  • If the input frames are in CPU memory</p> (so: software-decoded frames, or frames some CPU filter already touched) โ€” okay yeah, now you DO have to use hwupload to shove that data over to GPU memory so the CUDA filters can actually do their thing.
  • If the output of the CUDA filters needs more work</p> โ€” like from software-based filters, or it's gotta be saved in a format that GPU-based encoders just don't support โ€” then you need hwdownload to bring it back to CPU memory. no shortcuts, sorry ๐Ÿซถ
Heads up fr: hwupload uploads data to a surface with the same layout as the software frame, so you might have to drop a format filter right before hwupload to make sure the input is in the correct format. Same energy in reverse: hwdownload may not support all output formats, so an extra format filter right after hwdownload in the filter graph might be needed for compatibility. lowkey important, don't skip it ๐Ÿ’…

CUDA ๐Ÿ‘‘

Below is the whole rundown of the currently available Nvidia CUDA video filters. iconic.

Prerequisites โ€” the vibe check before you start:

  • Install Nvidia CUDA Toolkit
Note: if FFmpeg detects the Nvidia CUDA Toolkit during configuration, it will enable CUDA filters automatically โ€” no extra flags, no stress, it just works ๐Ÿ˜Œ. But if you want to explicitly enable them (main character energy), use these:
  • Configure FFmpeg with --enable-cuda-nvcc --enable-nonfree.
  • Configure FFmpeg with --enable-cuda-llvm. Extra requirement bestie: the llvm lib must be installed.

bilateral_cuda ๐Ÿฆ‹

CUDA accelerated bilateral filter โ€” an edge preserving filter. The way this one is mathematically accurate thanks to GPU accelerationโ€ฆ obsessed. For best output quality, use one to one chroma subsampling, i.e. yuv444p format.

The filter accepts the following options:

  • sigmaS โ€” Set sigma of gaussian function to calculate spatial weight, also called sigma space. Allowed range is 0.1 to 512. Default is 0.1.
  • sigmaR โ€” Set sigma of gaussian function to calculate color range weight, also called sigma color. Allowed range is 0.1 to 512. Default is 0.1.
  • window_size โ€” Set window size of the bilateral function to determine the number of neighbours to loop on. If the number entered is even, one will be added automatically. Allowed range is 1 to 255. Default is 1.

Examples

  • Apply the bilateral filter on a video. periodt:
./ffmpeg -v verbose \
-hwaccel cuda -hwaccel_output_format cuda -i input.mp4  \
-init_hw_device cuda \
-filter_complex \
" \
[0:v]scale_cuda=format=yuv444p[scaled_video];
[scaled_video]bilateral_cuda=window_size=9:sigmaS=3.0:sigmaR=50.0" \
-an -sn -c:v h264_nvenc -cq 20 out.mp4

bwdif_cuda ๐ŸŒธ

Deinterlace the input video using the bwdif algorithm, but implemented in CUDA so it can work as part of a GPU accelerated pipeline with nvdec and/or nvenc. it's giving teamwork ๐Ÿ’–

It accepts the following parameters:

  • mode โ€” The interlacing mode to adopt. It accepts one of the following values:
    • 0, send_frame โ€” Output one frame for each frame.
    • 1, send_field โ€” Output one frame for each field.

The default value is send_field.

  • parity โ€” The picture field parity assumed for the input interlaced video. It accepts one of the following values:
    • 0, tff โ€” Assume the top field is first.
    • 1, bff โ€” Assume the bottom field is first.
    • -1, auto โ€” Enable automatic detection of field parity.

The default value is auto. If the interlacing is unknown or the decoder does not export this information, top field first will be assumed.

  • deint โ€” Specify which frames to deinterlace. Accepts one of the following values:
    • 0, all โ€” Deinterlace all frames.
    • 1, interlaced โ€” Only deinterlace frames marked as interlaced.

The default value is all.


chromakey_cuda ๐Ÿ’š

CUDA accelerated YUV colorspace color/chroma keying. green screen but make it GPU โœจ

This filter works like the normal chromakey filter but operates on CUDA frames. For more details and parameters see chromakey.

Examples

  • Make all the green pixels in the input video transparent and use it as an overlay for another video โ€” the classic:
./ffmpeg \
    -hwaccel cuda -hwaccel_output_format cuda -i input_green.mp4  \
    -hwaccel cuda -hwaccel_output_format cuda -i base_video.mp4 \
    -init_hw_device cuda \
    -filter_complex \
    " \
        [0:v]chromakey_cuda=0x25302D:0.1:0.12:1[overlay_video]; \
        [1:v]scale_cuda=format=yuv420p[base]; \
        [base][overlay_video]overlay_cuda" \
    -an -sn -c:v h264_nvenc -cq 20 output.mp4
  • Process two software sources, explicitly uploading the frames:
./ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda \
    -f lavfi -i color=size=800x600:color=white,format=yuv420p \
    -f lavfi -i yuvtestsrc=size=200x200,format=yuv420p \
    -filter_complex \
    " \
        [0]hwupload[under]; \
        [1]hwupload,chromakey_cuda=green:0.1:0.12[over]; \
        [under][over]overlay_cuda" \
    -c:v hevc_nvenc -cq 18 -preset slow output.mp4

colorspace_cuda ๐ŸŒˆ

CUDA accelerated implementation of the colorspace filter.

Ok real talk: it is by no means feature complete compared to the software colorspace filter, and at the current time it only supports color range conversion between jpeg/full and mpeg/limited range. that's it, that's the filter ๐Ÿ’€

The filter accepts the following options:

  • range โ€” Specify output color range.

The accepted values are:

  • tv โ€” TV (restricted) range
  • mpeg โ€” MPEG (restricted) range
  • pc โ€” PC (full) range
  • jpeg โ€” JPEG (full) range

overlay_cuda ๐ŸŽ€

Overlay one video on top of another. the collab we all needed ๐Ÿซถ

This is the CUDA variant of the overlay filter. It only accepts CUDA frames. The underlying input pixel formats have to match โ€” no mixing, bestie.

It takes two inputs and has one output. The first input is the "main" video on which the second input is overlaid.

It accepts the following parameters:

  • x, y โ€” Set expressions for the x and y coordinates of the overlaid video on the main video.

They can contain the following parameters:

  • main_w, W โ€” The main input width and height.
  • main_h, H โ€” The main input width and height.
  • overlay_w, w โ€” The overlay input width and height.
  • overlay_h, h โ€” The overlay input width and height.
  • x, y โ€” The computed values for x and y. They are evaluated for each new frame.
  • n โ€” The ordinal index of the main input frame, starting from 0.
  • pos โ€” The byte offset position in the file of the main input frame, NAN if unknown. Deprecated, do not use. (like fr, don't)
  • t โ€” The timestamp of the main input frame, expressed in seconds, NAN if unknown.

Default value is 0 for both expressions.

  • eval โ€” Set when the expressions for x and y are evaluated.

It accepts the following values:

  • init โ€” Evaluate expressions once during filter initialization or when a command is processed.
  • frame โ€” Evaluate expressions for each incoming frame

Default value is frame.

  • eof_action โ€” See framesync.
  • shortest โ€” See framesync.
  • repeatlast โ€” See framesync.

This filter also supports the framesync options.


pad_cuda ๐Ÿ–ผ๏ธ

Add paddings to an input video stream using CUDA.

This filter is the CUDA-accelerated version of the pad filter. It accepts the same options and expressions and provides the same core functionality. For a detailed description of available options, please see the documentation for the pad filter.

Examples

  • Add a 200-pixel black border to all sides of a video frame:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -vf "pad_cuda=w=iw+400:h=ih+400:x=200:y=200" -c:v h264_nvenc out.mp4
  • Pad the input video to a 16:9 aspect ratio, filling with the color blue:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -vf "pad_cuda=w=ih*16/9/sar:h=ih:x=(ow-iw)/2:y=(oh-ih)/2:color=blue" -c:v h264_nvenc out.mp4

scale_cuda ๐Ÿ”ฅ

Scale (resize) and convert (pixel format) the input video, using accelerated CUDA kernels. Setting the output width and height works in the same way as for the scale filter. resize but make it fast, we love to see it ๐Ÿ’…

The filter accepts the following options:

  • w, h โ€” Set the output video dimension expression. Default value is the input dimension.

Allows for the same expressions as the scale filter.

  • interp_algo โ€” Sets the algorithm used for scaling:
    • nearest โ€” Nearest neighbour

Used by default if input parameters match the desired output.

  • bilinear โ€” Bilinear
  • bicubic โ€” Bicubic

This is the default.

  • lanczos โ€” Lanczos
  • format โ€” Controls the output pixel format. By default, or if none is specified, the input pixel format is used.
The filter does not support converting between YUV and RGB pixel formats. no cap, it just won't.
  • passthrough โ€” If set to 0, every frame is processed, even if no conversion is necessary. This mode can be useful to use the filter as a buffer for a downstream frame-consumer that exhausts the limited decoder frame pool.

If set to 1, frames are passed through as-is if they match the desired output parameters. This is the default behaviour.

  • use_filters โ€” If set to 1, filter with a generic weight LUT instead of using fixed-function shader kernels. May be faster or slower depending on the hardware. A value of auto (the default) enables this automatically when required for correct anti-aliasing when downscaling.
  • param โ€” Algorithm-Specific parameter.

Affects the curves of the bicubic algorithm.

  • force_original_aspect_ratio, force_divisible_by โ€” Work the same as the identical scale filter options.
  • reset_sar โ€” Works the same as the identical scale filter option.

Examples

  • Scale input to 720p, keeping aspect ratio and ensuring the output is yuv420p.
scale_cuda=-2:720:format=yuv420p
  • Upscale to 4K using nearest neighbour algorithm.
scale_cuda=4096:2160:interp_algo=nearest
  • Don't do any conversion or scaling, but copy all input frames into newly allocated ones. This can be useful to deal with a filter and encode chain that otherwise exhausts the decoders frame pool.
scale_cuda=passthrough=0

thumbnail_cuda

Picks the most representative frame out of a run of consecutive frames, and does it on the GPU with CUDA โœจ It's giving "which one of y'all is the main character" energy.

The filter accepts the following options:

  • n โ€” sets the frames batch size to analyze. In a set of n frames, the filter picks one of them, then handles the next batch of n frames until the end. Default is 100.
Heads up bestie: since the filter keeps track of the whole frames sequence, a bigger n value will result in higher memory usage, so a high value is not recommended. ๐Ÿ’€

Example

  • Thumbnails are extracted from every n=150-frame batch, selecting one per batch. Chosen frames are then scaled with scale_cuda.
./ffmpeg  -hwaccel cuda -hwaccel_output_format cuda  -i ./input.mp4 -vf "thumbnail_cuda=150,scale_cuda=1920:1080,hwdownload,format=nv12" ./output/out%03d.png

yadif_cuda

Deinterlaces the input video using the yadif algorithm, except it's implemented in CUDA so it can vibe as part of a GPU accelerated pipeline with nvdec and/or nvenc ๐Ÿ”ฅ

It accepts the following parameters:

  • mode โ€” the interlacing mode to adopt. It accepts one of the following values:
    • 0, send_frame โ€” output one frame for each frame.
    • 1, send_field โ€” output one frame for each field.
    • 2, send_frame_nospatial โ€” like send_frame, but it skips the spatial interlacing check.
    • 3, send_field_nospatial โ€” like send_field, but it skips the spatial interlacing check.

The default value is send_frame.

  • parity โ€” the picture field parity assumed for the input interlaced video. It accepts one of the following values:
    • 0, tff โ€” assume the top field is first.
    • 1, bff โ€” assume the bottom field is first.
    • -1, auto โ€” enable automatic detection of field parity.

The default value is auto. If the interlacing is unknown or the decoder does not export this information, top field first will be assumed.

  • deint โ€” specifies which frames to deinterlace. Accepts one of the following values:
    • 0, all โ€” deinterlace all frames.
    • 1, interlaced โ€” only deinterlace frames marked as interlaced.

The default value is all.


๐Ÿฆ‹ CUDA NPP ๐Ÿฆ‹

Below is a description of the currently available NVIDIA Performance Primitives (libnpp) video filters ๐Ÿ’œ

Prerequisites:

  • Install Nvidia CUDA Toolkit
  • Install libnpp

To enable CUDA NPP filters:

  • Configure FFmpeg with --enable-nonfree --enable-libnpp.

scale_npp

Uses the NVIDIA Performance Primitives (libnpp) to perform scaling and/or pixel format conversion on CUDA video frames. Setting the output width and height works in the same way as for the scale filter ๐Ÿ‘‘

The following additional options are accepted:

  • format โ€” the pixel format of the output CUDA frames. If set to the string same (the default), the input format will be kept. Note that automatic format negotiation and conversion is not yet supported for hardware frames.
  • interp_algo โ€” the interpolation algorithm used for resizing. One of the following:
    • nn โ€” nearest neighbour.
    • linear
    • cubic
    • cubic2p_bspline โ€” 2-parameter cubic (B=1, C=0)
    • cubic2p_catmullrom โ€” 2-parameter cubic (B=0, C=1/2)
    • cubic2p_b05c03 โ€” 2-parameter cubic (B=1/2, C=3/10)
    • super โ€” supersampling
    • lanczos
  • force_original_aspect_ratio โ€” enable decreasing or increasing output video width or height if necessary to keep the original aspect ratio. Possible values:
    • disable โ€” scale the video as specified and disable this feature.
    • decrease โ€” the output video dimensions will automatically be decreased if needed.
    • increase โ€” the output video dimensions will automatically be increased if needed.

One useful instance of this option is that when you know a specific device's maximum allowed resolution, you can use this to limit the output video to that, while retaining the aspect ratio. For example, device A allows 1280x720 playback, and your video is 1920x800. Using this option (set it to decrease) and specifying 1280x720 to the command line makes the output 1280x533.

Please note that this is a different thing than specifying -1 for w or h โ€” you still need to specify the output resolution for this option to work ๐Ÿ’…
  • force_divisible_by โ€” ensures that both the output dimensions, width and height, are divisible by the given integer when used together with force_original_aspect_ratio. This works similar to using -n in the w and h options.

This option respects the value set for force_original_aspect_ratio, increasing or decreasing the resolution accordingly. The video's aspect ratio may be slightly modified.

This option can be handy if you need to have a video fit within or exceed a defined resolution using force_original_aspect_ratio but also have encoder restrictions on width or height divisibility.

  • reset_sar โ€” works the same as the identical scale filter option.
  • eval โ€” specify when to evaluate width and height expression. It accepts the following values:
    • init โ€” only evaluate expressions once during the filter initialization or when a command is processed.
    • frame โ€” evaluate expressions for each incoming frame.

The values of the w and h options are expressions containing the following constants:

  • in_w, in_h โ€” the input width and height
  • iw, ih โ€” these are the same as in_w and in_h.
  • out_w, out_h โ€” the output (scaled) width and height
  • ow, oh โ€” these are the same as out_w and out_h
  • a โ€” the same as iw / ih
  • sar โ€” input sample aspect ratio
  • dar โ€” the input display aspect ratio. Calculated from (iw / ih) * sar.
  • n โ€” the (sequential) number of the input frame, starting from 0. Only available with eval=frame.
  • t โ€” the presentation timestamp of the input frame, expressed as a number of seconds. Only available with eval=frame.
  • pos โ€” the position (byte offset) of the frame in the input stream, or NaN if this information is unavailable and/or meaningless (for example in case of synthetic video). Only available with eval=frame. Deprecated, do not use. ๐Ÿ™ˆ

scale2ref_npp

Uses the NVIDIA Performance Primitives (libnpp) to scale (resize) the input video, based on a reference video โœจ

See the scale_npp filter for available options โ€” scale2ref_npp supports the same but uses the reference video instead of the main input as basis. scale2ref_npp also supports the following additional constants for the w and h options:

  • main_w, main_h โ€” the main input video's width and height
  • main_a โ€” the same as main_w / main_h
  • main_sar โ€” the main input video's sample aspect ratio
  • main_dar, mdar โ€” the main input video's display aspect ratio. Calculated from (main_w / main_h) * main_sar.
  • main_n โ€” the (sequential) number of the main input frame, starting from 0. Only available with eval=frame.
  • main_t โ€” the presentation timestamp of the main input frame, expressed as a number of seconds. Only available with eval=frame.
  • main_pos โ€” the position (byte offset) of the frame in the main input stream, or NaN if this information is unavailable and/or meaningless (for example in case of synthetic video). Only available with eval=frame.

Examples

  • Scale a subtitle stream (b) to match the main video (a) in size before overlaying
'scale2ref_npp[b][a];[a][b]overlay_cuda'
  • Scale a logo to 1/10th the height of a video, while preserving its display aspect ratio.
[logo-in][video-in]scale2ref_npp=w=oh*mdar:h=ih/10[logo-out][video-out]

sharpen_npp

Uses the NVIDIA Performance Primitives (libnpp) to perform image sharpening with border control ๐ŸŽ€

The following additional options are accepted:

  • border_type โ€” type of sampling to be used ad frame borders. One of the following:
    • replicate โ€” replicate pixel values.

transpose_npp

Transpose rows with columns in the input video and optionally flip it. For more in depth examples see the transpose video filter, which shares mostly the same options.

It accepts the following parameters:

  • dir โ€” specify the transposition direction.

Can assume the following values:

  • cclock_flip โ€” rotate by 90 degrees counterclockwise and vertically flip. (default)
  • clock โ€” rotate by 90 degrees clockwise.
  • cclock โ€” rotate by 90 degrees counterclockwise.
  • clock_flip โ€” rotate by 90 degrees clockwise and vertically flip.
  • passthrough โ€” do not apply the transposition if the input geometry matches the one specified by the specified value. It accepts the following values:
    • none โ€” always apply transposition. (default)
    • portrait โ€” preserve portrait geometry (when height >= width).
    • landscape โ€” preserve landscape geometry (when width >= height).

๐ŸŒˆ OPENCL VIDEO FILTERS ๐ŸŒˆ

Below is a description of the currently available OpenCL video filters ๐Ÿ’–

To enable compilation of these filters you need to configure FFmpeg with --enable-opencl.

Running OpenCL filters requires you to initialize a hardware device and to pass that device to all filters in any filter graph.

  • -init_hw_device opencl[=name][:device[,key=value...]] โ€” initialise a new hardware device of type opencl called name, using the given device parameters.
  • -filter_hw_device name โ€” pass the hardware device called name to all filters in any filter graph.

For more detailed information see <https://www.ffmpeg.org/ffmpeg.html#Advanced-Video-options>

  • Example of choosing the first device on the second platform and running avgblur_opencl filter with default parameters on it.
-init_hw_device opencl=gpu:1.0 -filter_hw_device gpu -i INPUT -vf "hwupload, avgblur_opencl, hwdownload" OUTPUT

Okay so real talk, bestie: OpenCL filters canโ€™t just reach into normal memory and grab frame data. Nope. All frame data needs to be uploaded (hwupload) to hardware surfaces connected to the appropriate device before it gets used, and then downloaded (hwdownload) back to normal memory. โœจ

Note that hwupload will upload to a surface with the same layout as the software frame, so it may be necessary to add a format filter immediately before to get the input into the right format. And hwdownload does not support all formats on the output โ€” it may be necessary to insert an additional format filter immediately following in the graph to get the output in a supported format. iykyk ๐Ÿ’…

๐Ÿซง avgblur_opencl ๐Ÿซง

Apply average blur filter. It accepts the following options:

  • sizeX โ€” Set horizontal radius size. Range is [1, 1024] and default value is 1.
  • planes โ€” Set which planes to filter. Default value is 0xf, by which all planes are processed.
  • sizeY โ€” Set vertical radius size. Range is [1, 1024] and default value is 0. If zero, sizeX value will be used.

Example

Apply average blur filter with horizontal and vertical size of 3, setting each pixel of the output to the average value of the 7x7 region centered on it in the input. For pixels on the edges of the image, the region does not extend beyond the image boundaries, and so out-of-range coordinates are not used in the calculations.

-i INPUT -vf "hwupload, avgblur_opencl=3, hwdownload" OUTPUT

๐ŸŒธ boxblur_opencl ๐ŸŒธ

Apply a boxblur algorithm to the input video.

It accepts the following parameters:

  • luma_radius, lr
  • luma_power, lp
  • chroma_radius, cr
  • chroma_power, cp
  • alpha_radius, ar
  • alpha_power, ap

A description of the accepted options follows. ๐Ÿ’–

  • luma_radius, lr โ€” Set an expression for the box radius in pixels used for blurring the luma plane. The radius value must be a non-negative number, and must not be greater than the value of the expression min(w,h)/2 for the luma and alpha planes, and of min(cw,ch)/2 for the chroma planes. Default value for luma_radius is 2. If not specified, chroma_radius and alpha_radius default to the corresponding value set for luma_radius. The expressions can contain the following constants:
    • w, h โ€” The input width and height in pixels.
    • cw, ch โ€” The input chroma image width and height in pixels.
    • hsub, vsub โ€” The horizontal and vertical chroma subsample values. For example, for the pixel format yuv422p, hsub is 2 and vsub is 1.
  • chroma_radius, cr โ€” Same radius expression setup for the chroma plane; if not specified, it defaults to the corresponding value set for luma_radius.
  • alpha_radius, ar โ€” Same radius expression setup for the alpha plane; if not specified, it defaults to the corresponding value set for luma_radius.
  • luma_power, lp โ€” Specify how many times the boxblur filter is applied to the luma plane. Default value for luma_power is 2. A value of 0 will disable the effect.
  • chroma_power, cp โ€” Specify how many times the boxblur filter is applied to the chroma plane. If not specified, it defaults to the corresponding value set for luma_power.
  • alpha_power, ap โ€” Specify how many times the boxblur filter is applied to the alpha plane. If not specified, it defaults to the corresponding value set for luma_power.

Examples

Apply boxblur filter, setting each pixel of the output to the average value of box-radiuses luma_radius, chroma_radius, alpha_radius for each plane respectively. The filter will apply luma_power, chroma_power, alpha_power times onto the corresponding plane. For pixels on the edges of the image, the radius does not extend beyond the image boundaries, and so out-of-range coordinates are not used in the calculations.

  • Apply a boxblur filter with the luma, chroma, and alpha radius set to 2 and luma, chroma, and alpha power set to 3. The filter will run 3 times with box-radius set to 2 for every plane of the image.
-i INPUT -vf "hwupload, boxblur_opencl=luma_radius=2:luma_power=3, hwdownload" OUTPUT
-i INPUT -vf "hwupload, boxblur_opencl=2:3, hwdownload" OUTPUT
  • Apply a boxblur filter with luma radius set to 2, luma_power to 1, chroma_radius to 4, chroma_power to 5, alpha_radius to 3 and alpha_power to 7.

For the luma plane, a 2x2 box radius will be run once.

For the chroma plane, a 4x4 box radius will be run 5 times.

For the alpha plane, a 3x3 box radius will be run 7 times.

-i INPUT -vf "hwupload, boxblur_opencl=2:1:4:5:3:7, hwdownload" OUTPUT

๐ŸŽ€ colorkey_opencl ๐ŸŽ€

RGB colorspace color keying.

The filter accepts the following options:

  • color โ€” The color which will be replaced with transparency.
  • similarity โ€” Similarity percentage with the key color. 0.01 matches only the exact key color, while 1.0 matches everything.
  • blend โ€” Blend percentage. 0.0 makes pixels either fully transparent, or not transparent at all. Higher values result in semi-transparent pixels, with a higher transparency the more similar the pixels color is to the key color.

Examples

  • Make every semi-green pixel in the input transparent with some slight blending:
-i INPUT -vf "hwupload, colorkey_opencl=green:0.3:0.1, hwdownload" OUTPUT

๐Ÿฆ‹ convolution_opencl ๐Ÿฆ‹

Apply convolution of 3x3, 5x5, 7x7 matrix.

The filter accepts the following options:

  • 0m, 1m, 2m, 3m โ€” Set matrix for each plane. Matrix is sequence of 9, 25 or 49 signed numbers. Default value for each plane is 0 0 0 0 1 0 0 0 0.
  • 0rdiv, 1rdiv, 2rdiv, 3rdiv โ€” Set multiplier for calculated value for each plane. If unset or 0, it will be sum of all matrix elements. The option value must be a float number greater or equal to 0.0. Default value is 1.0.
  • 0bias, 1bias, 2bias, 3bias โ€” Set bias for each plane. This value is added to the result of the multiplication. Useful for making the overall image brighter or darker. The option value must be a float number greater or equal to 0.0. Default value is 0.0.

Examples

  • Apply sharpen:
-i INPUT -vf "hwupload, convolution_opencl=0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0, hwdownload" OUTPUT
  • Apply blur:
-i INPUT -vf "hwupload, convolution_opencl=1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9, hwdownload" OUTPUT
  • Apply edge enhance:
-i INPUT -vf "hwupload, convolution_opencl=0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128, hwdownload" OUTPUT
  • Apply edge detect:
-i INPUT -vf "hwupload, convolution_opencl=0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128, hwdownload" OUTPUT
  • Apply laplacian edge detector which includes diagonals:
-i INPUT -vf "hwupload, convolution_opencl=1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:5:5:5:1:0:128:128:0, hwdownload" OUTPUT
  • Apply emboss:
-i INPUT -vf "hwupload, convolution_opencl=-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2, hwdownload" OUTPUT

๐ŸŒˆ erosion_opencl ๐ŸŒˆ

Apply erosion effect to the video.

This filter replaces the pixel by the local(3x3) minimum.

It accepts the following options:

  • threshold0, threshold1, threshold2, threshold3 โ€” Limit the maximum change for each plane. Range is [0, 65535] and default value is 65535. If 0, plane will remain unchanged.
  • coordinates โ€” Flag which specifies the pixel to refer to. Range is [0, 255] and default value is 255, i.e. all eight pixels are used.

Flags to local 3x3 coordinates region centered on x:

1 2 3

4 x 5

6 7 8

Example

  • Apply erosion filter with threshold0 set to 30, threshold1 set 40, threshold2 set to 50 and coordinates set to 231, setting each pixel of the output to the local minimum between pixels: 1, 2, 3, 6, 7, 8 of the 3x3 region centered on it in the input. If the difference between input pixel and local minimum is more then threshold of the corresponding plane, output pixel will be set to input pixel - threshold of corresponding plane.
-i INPUT -vf "hwupload, erosion_opencl=30:40:50:coordinates=231, hwdownload" OUTPUT

๐Ÿ’œ deshake_opencl ๐Ÿ’œ

Feature-point based video stabilization filter.

The filter accepts the following options:

  • tripod โ€” Simulates a tripod by preventing any camera movement whatsoever from the original frame. Defaults to 0.
  • debug โ€” Whether or not additional debug info should be displayed, both in the processed output and in the console. Note that in order to see console debug output you will also need to pass -v verbose to ffmpeg. Viewing point matches in the output video is only supported for RGB input. Defaults to 0.
  • adaptive_crop โ€” Whether or not to do a tiny bit of cropping at the borders to cut down on the amount of mirrored pixels. Defaults to 1.
  • refine_features โ€” Whether or not feature points should be refined at a sub-pixel level. This can be turned off for a slight performance gain at the cost of precision. Defaults to 1.
  • smooth_strength โ€” The strength of the smoothing applied to the camera path from 0.0 to 1.0. 1.0 is the maximum smoothing strength while values less than that result in less smoothing. 0.0 causes the filter to adaptively choose a smoothing strength on a per-frame basis. Defaults to 0.0.
  • smooth_window_multiplier โ€” Controls the size of the smoothing window (the number of frames buffered to determine motion information from). The size of the smoothing window is determined by multiplying the framerate of the video by this number. Acceptable values range from 0.1 to 10.0. Larger values increase the amount of motion data available for determining how to smooth the camera path, potentially improving smoothness, but also increase latency and memory usage. Defaults to 2.0.

Examples

  • Stabilize a video with a fixed, medium smoothing strength:
-i INPUT -vf "hwupload, deshake_opencl=smooth_strength=0.5, hwdownload" OUTPUT
  • Stabilize a video with debugging (both in console and in rendered video):
-i INPUT -filter_complex "[0:v]format=rgba, hwupload, deshake_opencl=debug=1, hwdownload, format=rgba, format=yuv420p" -v verbose OUTPUT

๐Ÿงš dilation_opencl ๐Ÿงš

Apply dilation effect to the video.

This filter replaces the pixel by the local(3x3) maximum.

It accepts the following options:

  • threshold0, threshold1, threshold2, threshold3 โ€” bestie these cap how much any single plane is allowed to change ๐Ÿ’…. Range is [0, 65535] and the default is 65535. If you set one to 0, that plane just stays exactly as it was, untouched, frozen, not moving, periodt.
  • coordinates โ€” this flag says which pixels we're comparing against ๐Ÿ‘€. Range is [0, 255] and the default is 255, which literally means all eight neighbours get used.

The flags map onto a local 3x3 region centered on x, like this:

1 2 3

4 x 5

6 7 8

๐ŸŒผ Example

  • Slap on the dilation filter with threshold0 set to 30, threshold1 set 40, threshold2 set to 50 and coordinates set to 231 โ€” so every output pixel becomes the local maximum between pixels 1, 2, 3, 6, 7, 8 of the 3x3 region centered on it in the input ๐Ÿ”ฅ. And if the difference between the input pixel and that local maximum is more then the threshold of the corresponding plane, the output pixel gets set to input pixel + threshold of corresponding plane. iykyk.
-i INPUT -vf "hwupload, dilation_opencl=30:40:50:coordinates=231, hwdownload" OUTPUT

๐Ÿงš nlmeans_opencl

Non-local Means denoise filter, but through OpenCL โšก. The way this one works is it accepts the same options as nlmeans โ€” so go peek at that one, no cap, same deal.

๐Ÿฆ‹ overlay_opencl

Overlay one video on top of another, main character energy on main character energy ๐Ÿ‘‘.

It takes two inputs and has one output. The first input is the "main" video, and the second input is the one getting overlaid on top of it. Heads up though: this filter requires the same memory layout for all the inputs, so you might need to do some format conversion first โ€” consider that your vibe check ๐Ÿซถ.

The filter accepts the following options:

  • x โ€” sets the x coordinate of the overlaid video on the main video. Default value is 0.
  • y โ€” sets the y coordinate of the overlaid video on the main video. Default value is 0.

๐Ÿ’– Examples

  • Overlay an image LOGO at the top-left corner of the INPUT video. Both inputs are yuv420p format, slay:
-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuv420p, hwupload[b], [a][b]overlay_opencl, hwdownload" OUTPUT
  • Here the inputs have the same memory layout for color channels, and the overlay has an additional alpha plane โ€” like INPUT is yuv420p and the LOGO is yuva420p ๐ŸŽ€:
-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuva420p, hwupload[b], [a][b]overlay_opencl, hwdownload" OUTPUT

๐ŸŒธ pad_opencl

Add paddings to the input image, then place the original input at the x, y coordinates you handed it โœจ. It accepts the following options:

  • width, w / height, h โ€” specify an expression for the size of the output image with the paddings added. If the value for width or height is 0, the corresponding input size is used for the output.

The width expression can reference the value set by the height expression, and vice versa โ€” they're mutually supportive besties ๐Ÿ’ž.

The default value of width and height is 0.

  • x / y โ€” specify the offsets to place the input image at within the padded area, with respect to the top/left border of the output image.

The x expression can reference the value set by the y expression, and vice versa.

The default value of x and y is 0.

If x or y evaluate to a negative number, they'll be changed so the input image is centered on the padded area ๐ŸŽฏ.

  • color โ€” specify the color of the padded area. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual.
  • aspect โ€” pad to an aspect instead to a resolution.

The value for the width, height, x, and y options are expressions containing the following constants:

  • in_w / in_h โ€” the input video width and height.
  • iw / ih โ€” these are the same as in_w and in_h.
  • out_w / out_h โ€” the output width and height (the size of the padded area), as specified by the width and height expressions.
  • ow / oh โ€” these are the same as out_w and out_h.
  • x / y โ€” the x and y offsets as specified by the x and y expressions, or NAN if not yet specified.
  • a โ€” same as iw / ih
  • sar โ€” input sample aspect ratio
  • dar โ€” input display aspect ratio, it is the same as (iw / ih) * sar

๐Ÿ’œ prewitt_opencl

Apply the Prewitt operator (<https://en.wikipedia.org/wiki/Prewitt_operator>) to the input video stream ๐ŸŒ€. This filter accepts the following option:

  • planes โ€” set which planes to filter. Default value is 0xf, by which all planes are processed.
  • scale โ€” set value which will be multiplied with the filtered result. Range is [0.0, 65535] and the default value is 1.0.
  • delta โ€” set value which will be added to the filtered result. Range is [-65535, 65535] and the default value is 0.0.

๐ŸŒˆ Example

  • Apply the Prewitt operator with scale set to 2 and delta set to 10:
-i INPUT -vf "hwupload, prewitt_opencl=scale=2:delta=10, hwdownload" OUTPUT

โญ program_opencl

Filter video using an OpenCL program ๐Ÿงš. Options bestie:

  • source โ€” OpenCL program source file.
  • kernel โ€” kernel name in program.
  • inputs โ€” number of inputs to the filter. Defaults to 1.
  • size, s โ€” size of output frames. Defaults to the same as the first input.

The program_opencl filter also supports the framesync options ๐Ÿ‘‘.

The program source file must contain a kernel function with the given name, which will be run once for each plane of the output ๐Ÿ”ฅ. Each run on a plane gets enqueued as a separate 2D global NDRange with one work-item for each pixel to be generated. The global ID offset for each work-item is therefore the coordinates of a pixel in the destination image.

The kernel function needs to take the following arguments:

  • Destination image, __write_only image2d_t.

This image will become the output; the kernel should write all of it.

  • Frame index, unsigned int.

This is a counter starting from zero and increasing by one for each frame.

  • Source images, __read_only image2d_t.

These are the most recent images on each input. The kernel may read from them to generate the output, but they can't be written to.

๐ŸŽ€ Example programs

  • Copy the input to the output (output must be the same size as the input):
__kernel void copy(__write_only image2d_t destination,
                   unsigned int index,
                   __read_only  image2d_t source)
{
    const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE;

    int2 location = (int2)(get_global_id(0), get_global_id(1));

    float4 value = read_imagef(source, sampler, location);

    write_imagef(destination, location, value);
}
  • Apply a simple transformation, rotating the input by an amount increasing with the index counter. Pixel values are linearly interpolated by the sampler, and the output need not have the same dimensions as the input ๐Ÿ’ซ:
__kernel void rotate_image(__write_only image2d_t dst,
                           unsigned int index,
                           __read_only  image2d_t src)
{
    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
                               CLK_FILTER_LINEAR);

    float angle = (float)index / 100.0f;

    float2 dst_dim = convert_float2(get_image_dim(dst));
    float2 src_dim = convert_float2(get_image_dim(src));

    float2 dst_cen = dst_dim / 2.0f;
    float2 src_cen = src_dim / 2.0f;

    int2   dst_loc = (int2)(get_global_id(0), get_global_id(1));

    float2 dst_pos = convert_float2(dst_loc) - dst_cen;
    float2 src_pos = {
        cos(angle) * dst_pos.x - sin(angle) * dst_pos.y,
        sin(angle) * dst_pos.x + cos(angle) * dst_pos.y
    };
    src_pos = src_pos * src_dim / dst_dim;

    float2 src_loc = src_pos + src_cen;

    if (src_loc.x < 0.0f      || src_loc.y < 0.0f ||
        src_loc.x > src_dim.x || src_loc.y > src_dim.y)
        write_imagef(dst, dst_loc, 0.5f);
    else
        write_imagef(dst, dst_loc, read_imagef(src, sampler, src_loc));
}
  • Blend two inputs together, with the amount of each input used varying with the index counter ๐ŸŒˆ:
__kernel void blend_images(__write_only image2d_t dst,
                           unsigned int index,
                           __read_only  image2d_t src1,
                           __read_only  image2d_t src2)
{
    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
                               CLK_FILTER_LINEAR);

    float blend = (cos((float)index / 50.0f) + 1.0f) / 2.0f;

    int2  dst_loc = (int2)(get_global_id(0), get_global_id(1));
    int2 src1_loc = dst_loc * get_image_dim(src1) / get_image_dim(dst);
    int2 src2_loc = dst_loc * get_image_dim(src2) / get_image_dim(dst);

    float4 val1 = read_imagef(src1, sampler, src1_loc);
    float4 val2 = read_imagef(src2, sampler, src2_loc);

    write_imagef(dst, dst_loc, val1 * blend + val2 * (1.0f - blend));
}

๐Ÿซถ remap_opencl

Remap pixels using 2nd: Xmap and 3rd: Ymap input video stream ๐Ÿ—บ๏ธ.

Destination pixel at position (X, Y) will be picked from source (x, y) position where x = Xmap(X, Y) and y = Ymap(X, Y). If mapping values are out of range, zero value for pixel will be used for destination pixel.

Xmap and Ymap input video streams must be of same dimensions. Output video stream will have Xmap/Ymap video stream dimensions. Xmap and Ymap input video streams are 32bit float pixel format, single channel ๐Ÿ’….

  • interp โ€” specify interpolation used for remapping of pixels. Allowed values are "near" and "linear". Default value is "linear".
  • fill โ€” specify the color of the unmapped pixels. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual. Default color is "black".

๐Ÿ“ roberts_opencl

Apply the Roberts cross operator (<https://en.wikipedia.org/wiki/Roberts_cross>) to the input video stream ๐ŸŒŸ. This filter accepts the following option:

  • planes โ€” set which planes to filter. Default value is 0xf, by which all planes are processed.
  • scale โ€” set value which will be multiplied with the filtered result. Range is [0.0, 65535] and the default value is 1.0.
  • delta โ€” set value which will be added to the filtered result. Range is [-65535, 65535] and the default value is 0.0.

๐Ÿงš Example

  • Apply the Roberts cross operator with scale set to 2 and delta set to 10:
-i INPUT -vf "hwupload, roberts_opencl=scale=2:delta=10, hwdownload" OUTPUT

sobel_opencl ๐Ÿ’…

okay so this one literally just applies the Sobel operator to your input video stream โ€” edge detection core, iykyk (<https://en.wikipedia.org/wiki/Sobel_operator>).

It takes these options, bestie:

  • planes โ€” which planes get filtered. Default is 0xf, which means all the planes get processed. slay.
  • scale โ€” the value that gets multiplied with the filtered result. Range is [0.0, 65535] and the default is 1.0.
  • delta โ€” the value that gets added to the filtered result. Range is [-65535, 65535] and the default is 0.0.

โœจ Example โœจ

  • Apply the sobel operator with scale set to 2 and delta set to 10:
-i INPUT -vf "hwupload, sobel_opencl=scale=2:delta=10, hwdownload" OUTPUT

tonemap_opencl ๐ŸŒˆ

This one does HDR(PQ/HLG) โ†’ SDR conversion with tone-mapping. literally the glow-down of your dreams ๐Ÿ’–

It accepts the following parameters:

  • tonemap โ€” specify the tone-mapping operator to use. Same as the tonemap option in tonemap.
  • param โ€” tunes the tone mapping algorithm. Same as the param option in tonemap.
  • desat โ€” applies desaturation for highlights that exceed this level of brightness. The higher the parameter, the more color information gets preserved. This setting helps prevent unnaturally blown-out colors for super-highlights, by (smoothly) turning them into white instead. It makes images feel more natural, at the cost of reducing information about out-of-range colors.

The default value is 0.5, and heads up: the algorithm here is a little different from the cpu version tonemap currently. A setting of 0.0 disables this option.

  • threshold โ€” the tonemapping algorithm parameters are fine-tuned per each scene. And a threshold is used to detect whether the scene has changed or not. If the distance between the current frame average brightness and the current running average exceeds a threshold value, we would re-calculate scene average and peak brightness. The default value is 0.2.
  • format โ€” specify the output pixel format.

Currently supported formats are:

  • p010
  • nv12
  • range, r โ€” set the output color range.

Possible values are:

  • tv/mpeg
  • pc/jpeg

Default is same as input.

  • primaries, p โ€” set the output color primaries.

Possible values are:

  • bt709
  • bt2020

Default is same as input.

  • transfer, t โ€” set the output transfer characteristics.

Possible values are:

  • bt709
  • bt2020

Default is bt709.

  • matrix, m โ€” set the output colorspace matrix.

Possible value are:

  • bt709
  • bt2020

Default is same as input.

โœจ Example โœจ

  • Convert HDR(PQ/HLG) video to bt2020-transfer-characteristic p010 format using the linear operator:
-i INPUT -vf "format=p010,hwupload,tonemap_opencl=t=bt2020:tonemap=linear:format=p010,hwdownload,format=p010" OUTPUT

unsharp_opencl ๐ŸŽ€

Sharpen or blur the input video โ€” pick your fighter, bestie ๐Ÿ’…

It accepts the following parameters:

  • luma_msize_x, lx โ€” set the luma matrix horizontal size. Range is [1, 23] and the default value is 5.
  • luma_msize_y, ly โ€” set the luma matrix vertical size. Range is [1, 23] and the default value is 5.
  • luma_amount, la โ€” set the luma effect strength. Range is [-10, 10] and the default value is 1.0.

Negative values will blur the input video, while positive values will sharpen it โ€” a value of zero disables the effect entirely.

  • chroma_msize_x, cx โ€” set the chroma matrix horizontal size. Range is [1, 23] and the default value is 5.
  • chroma_msize_y, cy โ€” set the chroma matrix vertical size. Range is [1, 23] and the default value is 5.
  • chroma_amount, ca โ€” set the chroma effect strength. Range is [-10, 10] and the default value is 0.0.

Negative values will blur the input video, while positive values will sharpen it โ€” a value of zero disables the effect entirely.

All parameters are optional and default to the equivalent of the string '5:5:1.0:5:5:0.0'. ๐Ÿซถ

โœจ Examples โœจ

  • Apply a strong luma sharpen effect:
-i INPUT -vf "hwupload, unsharp_opencl=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5, hwdownload" OUTPUT
  • Apply a strong blur of both luma and chroma parameters:
-i INPUT -vf "hwupload, unsharp_opencl=7:7:-2:7:7:-2, hwdownload" OUTPUT

xfade_opencl ๐Ÿฆ‹

Cross fade two videos with a custom transition effect, using OpenCL. this is the main character transition filter ngl ๐Ÿ‘‘

It accepts the following options:

  • transition โ€” set one of the possible transition effects.
    • custom

Select the custom transition effect โ€” the actual transition description gets picked from the source and kernel options.

  • fade
  • wipeleft
  • wiperight
  • wipeup
  • wipedown
  • slideleft
  • slideright
  • slideup
  • slidedown

Default transition is fade.

  • source โ€” OpenCL program source file for the custom transition.
  • kernel โ€” set the name of the kernel to use for the custom transition, from the program source file.
  • duration โ€” set the duration of the video transition.
  • offset โ€” set the time of the start of the transition, relative to the first video.

Okay so here's the lore: the program source file must contain a kernel function with the given name, and that kernel will be run once for each plane of the output. Each run on a plane gets enqueued as a separate 2D global NDRange with one work-item for each pixel to be generated. The global ID offset for each work-item is therefore the coordinates of a pixel in the destination image. ๐Ÿงš

The kernel function needs to take the following arguments:

  • Destination image, __write_only image2d_t.

This image will become the output; the kernel should write all of it.

  • First Source image, __read_only image2d_t. Second Source image, __read_only image2d_t.

These are the most recent images on each input. The kernel may read from them to generate the output, but they can't be written to.

  • Transition progress, float. This value is always between 0 and 1 inclusive.

Example programs:

  • Apply the dots curtain transition effect:
__kernel void blend_images(__write_only image2d_t dst,
                           __read_only  image2d_t src1,
                           __read_only  image2d_t src2,
                           float progress)
{
    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
                               CLK_FILTER_LINEAR);
    int2  p = (int2)(get_global_id(0), get_global_id(1));
    float2 rp = (float2)(get_global_id(0), get_global_id(1));
    float2 dim = (float2)(get_image_dim(src1).x, get_image_dim(src1).y);
    rp = rp / dim;

    float2 dots = (float2)(20.0, 20.0);
    float2 center = (float2)(0,0);
    float2 unused;

    float4 val1 = read_imagef(src1, sampler, p);
    float4 val2 = read_imagef(src2, sampler, p);
    bool next = distance(fract(rp * dots, &unused), (float2)(0.5, 0.5)) < (progress / distance(rp, center));

    write_imagef(dst, p, next ? val1 : val2);
}

literally iconic, no cap ๐Ÿ’œ

โœจ VAAPI VIDEO FILTERS โœจ

Okay bestie, so VAAPI video filters are literally the power couple of the VAAPI world โ€” they're almost always used together with a VAAPI decoder and a VAAPI encoder. Below is the full rundown of every VAAPI video filter, no cap ๐Ÿ’…

So like, to even compile these filters you gotta configure FFmpeg with --enable-vaapi. That's the entry fee, babes ๐ŸŽ€

And to actually use the vaapi filters, you need to set up your vaapi device properly first (ik, ik, hardware stuff is a whole vibe). For more info, go read <https://trac.ffmpeg.org/wiki/Hardware/VAAPI> ๐Ÿฆ‹


๐ŸŒธ overlay_vaapi ๐ŸŒธ

Overlay one video right on top of another. It's giving collage energy, honestly โœจ

It takes two inputs and has one output. The first input is the "main" video, and the second input is the one getting overlaid on top of it. Main character + supporting cast, yk?

The filter accepts the following options:

  • x, y โ€” Set expressions for the x and y coordinates of the overlaid video on the main video. Default value is 0 for both expressions.
  • w, h โ€” Set expressions for the width and height of the overlaid video on the main video. Default values are overlay_iw for w and overlay_ih*w/overlay_iw for h.

The expressions can contain the following parameters:

  • main_w, W and main_h, H โ€” the main input width and height.
  • overlay_iw and overlay_ih โ€” the overlay input width and height.
  • overlay_w, w and overlay_h, h โ€” the overlay output width and height.
  • overlay_x, x and overlay_y, y โ€” position of the overlay layer inside of main.

More options:

  • alpha โ€” Set transparency of overlaid video. Allowed range is 0.0 to 1.0. Higher value means lower transparency. Default value is 1.0.
  • eof_action โ€” see framesync.
  • shortest โ€” see framesync.
  • repeatlast โ€” see framesync.

This filter also supports the framesync options. ๐Ÿซถ

๐Ÿ’– Examples ๐Ÿ’–

  • Overlay an image LOGO at the top-left corner of the INPUT video. Both inputs for this filter are yuv420p format.
-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuv420p, hwupload[b], [a][b]overlay_vaapi" OUTPUT
  • Overlay an image LOGO at the offset (200, 100) from the top-left corner of the INPUT video. The inputs have same memory layout for color channels, the overlay has additional alpha plane, like INPUT is yuv420p, and the LOGO is yuva420p.
-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuva420p, hwupload[b], [a][b]overlay_vaapi=x=200:y=100:w=400:h=300:alpha=1.0, hwdownload, format=nv12" OUTPUT

๐Ÿฆ‹ tonemap_vaapi ๐Ÿฆ‹

Perform HDR-to-SDR or HDR-to-HDR tone-mapping. It currently only accepts HDR10 as input โ€” so like, that's the vibe it's locked into rn ๐Ÿ”ฅ

It accepts the following parameters:

  • format โ€” Specify the output pixel format. Default is nv12 for HDR-to-SDR tone-mapping and p010 for HDR-to-HDR tone-mapping.
  • primaries, p โ€” Set the output color primaries. Default is bt709 for HDR-to-SDR tone-mapping and same as input for HDR-to-HDR tone-mapping.
  • transfer, t โ€” Set the output transfer characteristics. Default is bt709 for HDR-to-SDR tone-mapping and same as input for HDR-to-HDR tone-mapping.
  • matrix, m โ€” Set the output colorspace matrix. Default is bt709 for HDR-to-SDR tone-mapping and same as input for HDR-to-HDR tone-mapping.
  • display โ€” Set the output mastering display colour volume. It is given by a |-separated list of two values, two values are space separated. It set display primaries x & y in G, B, R order, then white point x & y, the nominal minimum & maximum display luminances. HDR-to-HDR tone-mapping will be performed when this option is set.
  • light โ€” Set the output content light level information. It accepts 2 space-separated values, the first input is the maximum light level and the second input is the maximum average light level. It is ignored for HDR-to-SDR tone-mapping, and optional for HDR-to-HDR tone-mapping.
Lowkey important: display is literally what flips the switch to HDR-to-HDR mode, so don't set it unless that's what you want, bestie ๐Ÿ’€

๐Ÿ’œ Example ๐Ÿ’œ

  • Convert HDR(HDR10) video to bt2020-transfer-characteristic p010 format
tonemap_vaapi=format=p010:t=bt2020-10
  • Convert HDR video to HDR video
tonemap_vaapi=display=7500\ 3000|34000\ 16000|13250\ 34500|15635\ 16450|500\ 10000000

๐ŸŽ€ hstack_vaapi ๐ŸŽ€

Stack input videos horizontally. Side-by-side slay ๐Ÿ’…

This is the VA-API variant of the hstack filter. Each input stream may have a different height, and this filter will scale down/up each input stream while keeping the original aspect โ€” so nobody gets squished, we respect proportions here ๐Ÿซถ

It accepts the following options:

  • inputs โ€” see hstack.
  • shortest โ€” see hstack.
  • height โ€” Set height of output. If set to 0, this filter will set height of output to height of the first input stream. Default value is 0.

๐ŸŒˆ vstack_vaapi ๐ŸŒˆ

Stack input videos vertically. Now we're going up, not across, okurrr โœจ

This is the VA-API variant of the vstack filter. Each input stream may have a different width, and this filter will scale down/up each input stream while keeping the original aspect.

It accepts the following options:

  • inputs โ€” see vstack.
  • shortest โ€” see vstack.
  • width โ€” Set width of output. If set to 0, this filter will set width of output to width of the first input stream. Default value is 0.

โญ xstack_vaapi โญ

Stack video inputs into a custom layout. This is the full graphic-design-is-my-passion one, ngl ๐ŸŽจ

This is the VA-API variant of the xstack filter. Each input stream may have a different size, and this filter will scale down/up each input stream to the given output size, or the size of the first input stream.

It accepts the following options:

  • inputs โ€” see xstack.
  • shortest โ€” see xstack.
  • layout โ€” see xstack. Moreover, this permits the user to supply output size for each input stream.
xstack_vaapi=inputs=4:layout=0_0_1920x1080|0_h0_1920x1080|w0_0_1920x1080|w0_h0_1920x1080
  • grid โ€” see xstack.
  • grid_tile_size โ€” Set output size for each input stream when grid is set. If this option is not set, this filter will set output size by default to the size of the first input stream. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.
  • fill โ€” see xstack.

๐Ÿงš pad_vaapi ๐Ÿงš

Add paddings to the input image, and place the original input at the provided x, y coordinates. Basically giving your video some breathing room, boundaries are healthy bestie ๐Ÿ’–

It accepts the following options:

  • width, w and height, h โ€” Specify an expression for the size of the output image with the paddings added. If the value for width or height is 0, the corresponding input size is used for the output. The width expression can reference the value set by the height expression, and vice versa. The default value of width and height is 0.
  • x, y โ€” Specify the offsets to place the input image at within the padded area, with respect to the top/left border of the output image. The x expression can reference the value set by the y expression, and vice versa. The default value of x and y is 0. If x or y evaluate to a negative number, they'll be changed so the input image is centered on the padded area.
  • color โ€” Specify the color of the padded area. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual.
  • aspect โ€” Pad to an aspect instead to a resolution.

The value for the width, height, x, and y options are expressions containing the following constants:

  • in_w, in_h โ€” the input video width and height.
  • iw, ih โ€” these are the same as in_w and in_h.
  • out_w, out_h โ€” the output width and height (the size of the padded area), as specified by the width and height expressions.
  • ow, oh โ€” these are the same as out_w and out_h.
  • x, y โ€” the x and y offsets as specified by the x and y expressions, or NAN if not yet specified.
  • a โ€” same as iw / ih.
  • sar โ€” input sample aspect ratio.
  • dar โ€” input display aspect ratio, it is the same as (iw / ih) * sar.

๐Ÿ’… drawbox_vaapi ๐Ÿ’…

Draw a colored box on the input image. It's giving "circling things in the group chat screenshot" energy ๐ŸŽ€

It accepts the following parameters:

  • x, y โ€” The expressions which specify the top left corner coordinates of the box. It defaults to 0.
  • width, w and height, h โ€” The expressions which specify the width and height of the box; if 0 they are interpreted as the input width and height. It defaults to 0.
  • color, c โ€” Specify the color of the box to write. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual.
  • thickness, t โ€” The expression which sets the thickness of the box edge. A value of fill will create a filled box. Default value is 3. See below for the list of accepted constants.
  • replace โ€” With value 1, the pixels of the painted box will overwrite the video's color and alpha pixels. Default is 0, which composites the box onto the input video.

The parameters for x, y, w and h and t are expressions containing the following constants:

  • in_h, ih and in_w, iw โ€” the input width and height.
  • x, y โ€” the x and y offset coordinates where the box is drawn.
  • w, h โ€” the width and height of the drawn box.
  • t โ€” the thickness of the drawn box.

๐Ÿ“ Examples ๐Ÿ“

  • Draw a black box around the edge of the input image:
drawbox
  • Draw a box with color red and an opacity of 50%:
drawbox=10:20:200:60:red@0.5

The previous example can be specified as:

drawbox=x=10:y=20:w=200:h=60:color=red@0.5
  • Fill the box with pink color:
drawbox=x=10:y=10:w=100:h=100:color=pink@0.5:t=fill
  • Draw a 2-pixel red 2.40:1 mask:
drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red
That last one is a whole cinema mask, iconic honestly ๐Ÿ‘‘

๐ŸŽ€ VIDEOTOOLBOX VIDEO FILTERS ๐ŸŽ€

Okay so hereโ€™s the rundown of the currently available VideoToolbox video filters, bestie. The VideoToolbox filter depends on the VideoToolbox framework, and it gets auto-detected when youโ€™re building ffmpeg for an Apple platform like macOS. If autodetect is disabled, add --enable-videotoolbox when you configure. โœจ

๐Ÿ’– scale_vt

This one scales and converts the color parameters using VTPixelTransferSession. Itโ€™s giving โ€œresize plus color glow-upโ€ energy. ๐Ÿฆ‹

The filter takes these options:

  • w โ€” set the output video dimension expression. Default value is the input dimension.
  • h โ€” set the output video dimension expression. Default value is the input dimension.
  • color_matrix โ€” set the output colorspace matrix.
  • color_primaries โ€” set the output color primaries.
  • color_transfer โ€” set the output transfer characteristics.

๐ŸŒˆ Examples

  • Perform HDR to SDR conversion, and scale to half size of input. Literally iconic:
ffmpeg -hwaccel videotoolbox \
        -hwaccel_output_format videotoolbox_vld \
        -i hdr.mov \
        -c:v hevc_videotoolbox \
        -profile:v main \
        -b:v 3M \
        -vf scale_vt=w=iw/2:h=ih/2:color_matrix=bt709:color_primaries=bt709:color_transfer=bt709 \
        -c:a copy \
        -tag:v hvc1 \
        sdr.mp4

๐Ÿฆ‹ transpose_vt

This one transposes rows with columns in the input video and optionally flips it. For more in-depth examples, go peek at the transpose video filter โ€” it shares mostly the same options. ๐Ÿ‘‘

It takes these parameters:

  • dir โ€” specify the transposition direction.

It can assume these values:

  • cclock_flip โ€” rotate by 90 degrees counterclockwise and vertically flip. (This is the default.)
  • clock โ€” rotate by 90 degrees clockwise.
  • cclock โ€” rotate by 90 degrees counterclockwise.
  • clock_flip โ€” rotate by 90 degrees clockwise and vertically flip.
  • hflip โ€” flip the input video horizontally.
  • vflip โ€” flip the input video vertically.
  • passthrough โ€” do not apply the transposition if the input geometry matches the one you specify. It accepts these values:
    • none โ€” always apply transposition. (This is the default.)
    • portrait โ€” preserve portrait geometry (when height >= width).
    • landscape โ€” preserve landscape geometry (when width >= height).

๐Ÿ”ฅ VULKAN VIDEO FILTERS ๐Ÿ”ฅ

Okay bestie, so here's the rundown on all the Vulkan video filters we've got rn. ๐Ÿ’…

So like, to even compile these filters you need to configure FFmpeg with --enable-vulkan and either --enable-libglslang or --enable-libshaderc. Both. Not one. Both. ๐Ÿ˜ค

And running Vulkan filters? You gotta initialize a hardware device and pass that device to all filters in any filter graph. No shortcuts, no cap.

  • -init_hw_device vulkan[=name][:device[,key=value...]] โ€” Initialise a new hardware device of type vulkan called name, using the given device parameters and options in key=value. The following options are supported:
    • debug โ€” Switches validation layers on if set to 1.
    • linear_images โ€” Allocates linear images. Does not apply to decoding.
    • disable_multiplane โ€” Disables multiplane images. Does not apply to decoding.
    • avoid_host_import โ€” Avoids the use of dynamic host memory imports, in favor of a regular memcpy() into a previously mapped buffer.
  • -filter_hw_device name โ€” Pass the hardware device called name to all filters in any filter graph.

For more detailed information see <https://www.ffmpeg.org/ffmpeg.html#Advanced-Video-options> โ€” go read it, iykyk. ๐Ÿ“–


Here's an example of choosing the first device and running nlmeans_vulkan filter with default parameters on it. Slay:

-init_hw_device vulkan=vk:0 -filter_hw_device vk -i INPUT -vf "hwupload,nlmeans_vulkan,hwdownload" OUTPUT

So here's the tea โ˜•: Vulkan filters can't access frame data in normal memory, so literally all frame data needs to be uploaded (hwupload) to hardware surfaces connected to the appropriate device before being used, and then downloaded (hwdownload) back to normal memory. And heads up โ€” hwupload will upload to a frame with the same layout as the software frame, so it may be necessary to add a format filter immediately before to get the input into the right format. And hwdownload does not support all formats on the output โ€” it's usually necessary to insert an additional format filter immediately following in the graph to get the output in a supported format. Annoying? Maybe. Necessary? Absolutely. ๐Ÿ™ˆ


โœจ avgblur_vulkan โœจ

Apply an average blur filter, implemented on the GPU using Vulkan. Gorgeous.

The filter accepts the following options:

  • sizeX โ€” Set horizontal radius size. Range is [1, 32] and default value is 3.
  • sizeY โ€” Set vertical radius size. Range is [1, 32] and default value is 3.
  • planes โ€” Set which planes to filter. Default value is 0xf, by which all planes are processed.

๐Ÿฆ‹ blend_vulkan ๐Ÿฆ‹

Blend two Vulkan frames into each other. It's giving collage energy.

The blend filter takes two input streams and outputs one stream, the first input is the "top" layer and second input is "bottom" layer. By default, the output terminates when the longest input terminates.

A description of the accepted options follows.

  • c0_mode
  • c1_mode
  • c2_mode
  • c3_mode
  • all_mode โ€” Set blend mode for specific pixel component or all pixel components in case of all_mode. Default value is normal.

Available values for component modes are:

  • normal
  • multiply

๐ŸŽ€ bwdif_vulkan ๐ŸŽ€

Deinterlacer using bwdif, the "Bob Weaver Deinterlacing Filter" algorithm, implemented on the GPU using Vulkan. Iconic name honestly.

It accepts the following parameters:

  • mode โ€” The interlacing mode to adopt. It accepts one of the following values:
    • 0, send_frame โ€” Output one frame for each frame.
    • 1, send_field โ€” Output one frame for each field.

The default value is send_field.

  • parity โ€” The picture field parity assumed for the input interlaced video. It accepts one of the following values:
    • 0, tff โ€” Assume the top field is first.
    • 1, bff โ€” Assume the bottom field is first.
    • -1, auto โ€” Enable automatic detection of field parity.

The default value is auto. If the interlacing is unknown or the decoder does not export this information, top field first will be assumed.

  • deint โ€” Specify which frames to deinterlace. Accepts one of the following values:
    • 0, all โ€” Deinterlace all frames.
    • 1, interlaced โ€” Only deinterlace frames marked as interlaced.

The default value is all.

๐ŸŒˆ chromaber_vulkan ๐ŸŒˆ

Apply an effect that emulates chromatic aberration. Works best with RGB inputs, but provides a similar effect with YCbCr inputs too. Aesthetic af. ๐Ÿ’œ

  • dist_x โ€” Horizontal displacement multiplier. Each chroma pixel's position will be multiplied by this amount, starting from the center of the image. Default is 0.
  • dist_y โ€” Similarly, this sets the vertical displacement multiplier. Default is 0.

๐Ÿ“ color_vulkan ๐Ÿ“

Video source that creates a Vulkan frame of a solid color. Useful for benchmarking, or overlaying. Main character energy for a solid color ngl.

It accepts the following parameters:

  • color โ€” The color to use. Either a name, or a hexadecimal value. The default value is black.
  • size โ€” The size of the output frame. Default value is 1920x1080.
  • rate โ€” The framerate to output at. Default value is 60 frames per second.
  • duration โ€” The video duration. Default value is -0.000001.
  • sar โ€” The video signal aspect ratio. Default value is 1/1.
  • format โ€” The pixel format of the output Vulkan frames. Default value is yuv444p.
  • out_range โ€” Set the output YCbCr sample range.

This allows the autodetected value to be overridden as well as allows forcing a specific value used for the output and encoder. If not specified, the range depends on the pixel format. Possible values:

  • auto/unknown โ€” Choose automatically.
  • jpeg/full/pc โ€” Set full range (0-255 in case of 8-bit luma).
  • mpeg/limited/tv โ€” Set "MPEG" range (16-235 in case of 8-bit luma).

๐ŸŒธ vflip_vulkan ๐ŸŒธ

Flips an image vertically. Upside down bestie.

๐ŸŒธ hflip_vulkan ๐ŸŒธ

Flips an image horizontally. Mirror mirror.

๐ŸŒธ flip_vulkan ๐ŸŒธ

Flips an image along both the vertical and horizontal axis. Double flip, double slay.

โญ gblur_vulkan โญ

Apply Gaussian blur filter on Vulkan frames. Soft glow vibes only.

The filter accepts the following options:

  • sigma โ€” Set horizontal sigma, standard deviation of Gaussian blur. Default is 0.5.
  • sigmaV โ€” Set vertical sigma, if negative it will be same as sigma. Default is -1.
  • planes โ€” Set which planes to filter. By default all planes are filtered.
  • size โ€” Set the kernel size along the horizontal axis. Default is 19.
  • sizeV โ€” Set the kernel size along the vertical axis. Default is 0, which sets to use the same value as size.

๐Ÿ’– nlmeans_vulkan ๐Ÿ’–

Denoise frames using Non-Local Means algorithm, implemented on the GPU using Vulkan. Supports more pixel formats than nlmeans or nlmeans_opencl, including alpha channel support. She's that girl fr fr.

The filter accepts the following options.

  • s โ€” Set denoising strength for all components. Default is 1.0. Must be in range [0.0, 100.0].
  • p โ€” Set patch size for all planes. Default is 7. Must be odd number in range [0, 99].
  • r โ€” Set research size. Default is 15. Must be odd number in range [0, 99].
  • t โ€” Set parallelism. Default is 8. Must be a number in the range [1, 64]. Larger values will use more VRAM but may not result in greater speed. The optimal value is hardware and input dependent.
  • s0
  • s1
  • s2
  • s3 โ€” Set denoising strength for a specific component. Default is 1.0, equal to s. Must be in range [0.0, 100.0]. 0.0 disables denoising in that component.
  • p0
  • p1
  • p2
  • p3 โ€” Set patch size for a specific component. Default is 7, equal to p. Must be odd number in range [0, 99].

๐Ÿซถ overlay_vulkan ๐Ÿซถ

Overlay one video on top of another. Collab era.

It takes two inputs and has one output. The first input is the "main" video on which the second input is overlaid. This filter requires all inputs to use the same pixel format. So, format conversion may be needed. Yes, that means you. ๐Ÿ‘€

The filter accepts the following options:

  • x โ€” Set the x coordinate of the overlaid video on the main video. Default value is 0.
  • y โ€” Set the y coordinate of the overlaid video on the main video. Default value is 0.

๐Ÿงš transpose_vulkan ๐Ÿงš

Transpose rows with columns in the input video and optionally flip it. For more in depth examples see the transpose video filter, which shares mostly the same options.

It accepts the following parameters:

  • dir โ€” Specify the transposition direction.

Can assume the following values:

  • cclock_flip โ€” Rotate by 90 degrees counterclockwise and vertically flip. (default)
  • clock โ€” Rotate by 90 degrees clockwise.
  • cclock โ€” Rotate by 90 degrees counterclockwise.
  • clock_flip โ€” Rotate by 90 degrees clockwise and vertically flip.
  • passthrough โ€” Do not apply the transposition if the input geometry matches the one specified by the specified value. It accepts the following values:
    • none โ€” Always apply transposition. (default)
    • portrait โ€” Preserve portrait geometry (when height >= width).
    • landscape โ€” Preserve landscape geometry (when width >= height).

โœจ QSV VIDEO FILTERS โœจ

okay so these are the QSV (Quick Sync Video) filters that are currently available, bestie ๐Ÿ’…

To even compile these filters, you need to configure FFmpeg with --enable-libmfx or --enable-libvpl. no cap, that's the entry fee.

And to actually use QSV filters, you gotta set up the QSV device correctly first. For more info, please read: <https://trac.ffmpeg.org/wiki/Hardware/QuickSync>


๐ŸŽ€ hstack_qsv

Stack input videos horizontally. It's giving... a horizontal pile-up โœจ

This is the QSV variant of the hstack filter, and here's the thing โ€” each input stream may have a different height, and this filter will scale down/up each input stream while keeping the original aspect. slay, aspect ratios stay iconic ๐Ÿ’–

It accepts the following options:

  • inputs โ€” See hstack.
  • shortest โ€” See hstack.
  • height โ€” Set height of output. If set to 0, this filter will set height of output to height of the first input stream. Default value is 0.

๐Ÿฆ‹ vstack_qsv

Stack input videos vertically. Now we're going up instead of sideways ๐Ÿซถ

This is the QSV variant of the vstack filter, each input stream may have different width, this filter will scale down/up each input stream while keeping the original aspect. yes bestie, proportions understood ๐Ÿ’…

It accepts the following options:

  • inputs โ€” See vstack.
  • shortest โ€” See vstack.
  • width โ€” Set width of output. If set to 0, this filter will set width of output to width of the first input stream. Default value is 0.

๐ŸŒธ xstack_qsv

Stack video inputs into a custom layout. this is the main character of stacking fr fr ๐Ÿ‘‘

This is the QSV variant of the xstack filter.

It accepts the following options:

  • inputs โ€” See xstack.
  • shortest โ€” See xstack.
  • layout โ€” See xstack. Moreover, this permits the user to supply output size for each input stream.
xstack_qsv=inputs=4:layout=0_0_1920x1080|0_h0_1920x1080|w0_0_1920x1080|w0_h0_1920x1080
  • grid โ€” See xstack.
  • grid_tile_size โ€” Set output size for each input stream when grid is set. If this option is not set, this filter will set output size by default to the size of the first input stream. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.
  • fill โ€” See xstack.

๐ŸŒˆ VIDEO SOURCES ๐ŸŒˆ

Below is a description of the currently available video sources. your video had to come from somewhere, bestie ๐Ÿ’–

๐Ÿ“ buffer

Buffer video frames, and make them available to the filter chain.

This source is mainly intended for a programmatic use, in particular through the interface defined in libavfilter/buffersrc.h. so like... it's for the code girlies, not the command-line girlies, iykyk ๐Ÿ’…

It accepts the following parameters:

  • video_size โ€” Specify the size (width and height) of the buffered video frames. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.
  • width โ€” The input video width.
  • height โ€” The input video height.
  • pix_fmt โ€” A string representing the pixel format of the buffered video frames. It may be a number corresponding to a pixel format, or a pixel format name.
  • time_base โ€” Specify the timebase assumed by the timestamps of the buffered frames.
  • frame_rate โ€” Specify the frame rate expected for the video stream.
  • colorspace โ€” A string representing the color space of the buffered video frames. It may be a number corresponding to a color space, or a color space name.
  • range โ€” A string representing the color range of the buffered video frames. It may be a number corresponding to a color range, or a color range name.
  • alpha_mode โ€” A string representing the alpha mode of the buffered video frames. It may be a number corresponding to an alpha mode, or an alpha mode name.
  • pixel_aspect, sar โ€” The sample (pixel) aspect ratio of the input video.
  • hw_frames_ctx โ€” When using a hardware pixel format, this should be a reference to an AVHWFramesContext describing input frames.

For example:

buffer=width=320:height=240:pix_fmt=yuv410p:time_base=1/24:sar=1

will instruct the source to accept video frames with size 320x240 and with format yuv410p, assuming 1/24 as the timestamps timebase and square pixels (1:1 sample aspect ratio). Since the pixel format with name yuv410p corresponds to the number 6 (check the enum AVPixelFormat definition in libavutil/pixfmt.h), this example corresponds to:

buffer=size=320x240:pixfmt=6:time_base=1/24:pixel_aspect=1/1

Alternatively, the options can be specified as a flat string, but this syntax is deprecated:

width:height:pix_fmt:time_base.num:time_base.den:pixel_aspect.num:pixel_aspect.den
okay bestie, that flat-string version is deprecated โ€” read the room, use the named options ๐Ÿ’€

๐Ÿงš cellauto

Create a pattern generated by an elementary cellular automaton. literally math girlie magic โœจ๐Ÿ”ข

The initial state of the cellular automaton can be defined through the filename and pattern options. If such options are not specified an initial state is created randomly. chaos is always an option ๐ŸŒ€

At each new frame a new row in the video is filled with the result of the cellular automaton next generation. The behavior when the whole frame is filled is defined by the scroll option.

This source accepts the following options:

  • filename, f โ€” Read the initial cellular automaton state, i.e. the starting row, from the specified file. In the file, each non-whitespace character is considered an alive cell, a newline will terminate the row, and further characters in the file will be ignored.
  • pattern, p โ€” Read the initial cellular automaton state, i.e. the starting row, from the specified string.

Each non-whitespace character in the string is considered an alive cell, a newline will terminate the row, and further characters in the string will be ignored.

  • rate, r โ€” Set the video rate, that is the number of frames generated per second. Default is 25.
  • random_fill_ratio, ratio โ€” Set the random fill ratio for the initial cellular automaton row. It is a floating point number value ranging from 0 to 1, defaults to 1/PHI.

This option is ignored when a file or a pattern is specified.

  • random_seed, seed โ€” Set the seed for filling randomly the initial row, must be an integer included between 0 and UINT32_MAX. If not specified, or if explicitly set to -1, the filter will try to use a good random seed on a best effort basis.
  • rule โ€” Set the cellular automaton rule, it is a number ranging from 0 to 255. Default value is 110.
  • size, s โ€” Set the size of the output video. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.

If filename or pattern is specified, the size is set by default to the width of the specified initial state row, and the height is set to width * PHI.

If size is set, it must contain the width of the specified pattern string, and the specified pattern will be centered in the larger row.

If a filename or a pattern string is not specified, the size value defaults to 320x518 (used for a randomly generated initial state).

  • scroll โ€” If set to 1, scroll the output upward when all the rows in the output have been already filled. If set to 0, the new generated row will be written over the top row just after the bottom row is filled. Defaults to 1.
  • start_full, full โ€” If set to 1, completely fill the output with generated rows before outputting the first frame. This is the default behavior, for disabling set the value to 0.
  • stitch โ€” If set to 1, stitch the left and right row edges together. This is the default behavior, for disabling set the value to 0.

๐ŸŒŸ Examples

  • Read the initial state from pattern, and specify an output of size 200x400.
cellauto=f=pattern:s=200x400
  • Generate a random initial row with a width of 200 cells, with a fill ratio of 2/3:
cellauto=ratio=2/3:s=200x200
  • Create a pattern generated by rule 18 starting by a single alive cell centered on an initial row with width 100:
cellauto=p=@s=100x400:full=0:rule=18
  • Specify a more elaborated initial pattern:
cellauto=p='@@ @ @@':s=100x400:full=0:rule=18

๐Ÿฆ‹ coreimagesrc

Video source generated on GPU using Apple's CoreImage API on OSX. apple girlies rise ๐ŸŽโœจ

This video source is a specialized version of the coreimage video filter. Use a core image generator at the beginning of the applied filterchain to generate the content.

The coreimagesrc video source accepts the following options:

  • list_generators โ€” List all available generators along with all their respective options as well as possible minimum and maximum values along with the default values.
list_generators=true
  • size, s โ€” Specify the size of the sourced video. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. The default value is 320x240.
  • rate, r โ€” Specify the frame rate of the sourced video, as the number of frames generated per second. It has to be a string in the format frame_rate_num/frame_rate_den, an integer number, a floating point number or a valid video frame rate abbreviation. The default value is 25.
  • sar โ€” Set the sample aspect ratio of the sourced video.
  • duration, d โ€” Set the duration of the sourced video. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax.

If not specified, or the expressed duration is negative, the video is supposed to be generated forever. infinite video era ๐Ÿ’ซ

Additionally, all options of the coreimage video filter are accepted. A complete filterchain can be used for further processing of the generated input without CPU-HOST transfer. See coreimage documentation and examples for details. iconic behavior honestly ๐Ÿ’…

๐ŸŒŸ Examples

  • Use CIQRCodeGenerator to create a QR code for the FFmpeg homepage, given as complete and escaped command-line for Apple's standard bash shell:
ffmpeg -f lavfi -i coreimagesrc=s=100x100:filter=CIQRCodeGenerator@inputMessage=https\\\\\://FFmpeg.org/@inputCorrectionLevel=H -frames:v 1 QRCode.png

This example is equivalent to the QRCode example of coreimage without the need for a nullsrc video source. yes bestie, no extra source needed, we love efficiency ๐Ÿซถ


๐Ÿ’œ ddagrab

Captures the Windows Desktop via Desktop Duplication API. windows girlies, this one's for you ๐ŸชŸโœจ

The filter exclusively returns D3D11 Hardware Frames, for on-gpu encoding or processing. So an explicit hwdownload is needed for any kind of software processing. no cap โ€” hardware frames only, so download first if you wanna touch them in software ๐Ÿ’€

It accepts the following options:

  • output_idx โ€” DXGI Output Index to capture.

Usually corresponds to the index Windows has given the screen minus one, so it's starting at 0.

Defaults to output 0.

  • draw_mouse โ€” Whether to draw the mouse cursor.

Defaults to true.

Only affects hardware cursors. If a game or application renders its own cursor, it'll always be captured. so if the app draws its own cursor, it's coming along whether you like it or not ๐Ÿ™ˆ

  • framerate โ€” the max framerate your desktop gets captured at, bestie. The gap between frames literally cannot be smaller than one-over-the-framerate, that's just math ๐Ÿ’… When dup_frames is true (which it is by default) and your desktop is being lazy and not updating often enough, the filter just re-serves a previous frame like leftovers. Lowkey important: there's no background buffering happening, so if the filter isn't polled often enough, the actual inter-frame interval can be significantly larger than you'd expect ๐Ÿ˜ญ

Defaults to 30 FPS.

  • video_size โ€” tell it how big the captured video should be.

Defaults to the full size of the screen.

Cropped from the bottom/right if smaller than screen size.

  • offset_x โ€” horizontal offset of the captured video.
  • offset_y โ€” vertical offset of the captured video.
  • output_fmt โ€” the output format you want. Defaults to 8 Bit BGRA.

It accepts the following values:

  • auto โ€” passes all supported output formats to DDA and returns whatever DDA decides to use.
  • 8bit, bgra โ€” 8 bit formats always work, and DDA will convert to them if necessary.
  • 10bit, x2bgr10 โ€” filter initialization will fail if 10 bit format is requested but unavailable. no cap, it just gives up ๐Ÿ’€
  • dup_frames โ€” when this is true (the default), the filter duplicates frames when the desktop hasn't been updated, so it can keep approximately constant target framerate. When it's false, the filter waits for the desktop to be updated instead โ€” and in that case the inter-frame intervals may vary significantly ๐Ÿ™ˆ

Examples

Capture primary screen and encode using nvenc:

ffmpeg -f lavfi -i ddagrab -c:v h264_nvenc -cq 18 output.mp4

You can also skip the lavfi device and directly use the filter. This one also demonstrates downloading the frame and encoding with libx264. Explicit output format specification is required in this case:

ffmpeg -filter_complex ddagrab=output_idx=1:framerate=60,hwdownload,format=bgra -c:v libx264 -crf 18 output.mp4

If you want to capture only a subsection of the desktop, this can be achieved by specifying a smaller size and its offsets into the screen:

ddagrab=video_size=800x600:offset_x=100:offset_y=100

๐ŸชŸ gfxcapture

Capture windows or monitors using Windows.Graphics.Capture API. Obsessed with how clean this is โœจ

This source provides low overhead capture of application windows or entire monitors. The filter outputs hardware frames in d3d11 format; use hwdownload,format= if system memory frames are required.

The window to be captured can be selected via regular expressions on its title, class name or backing executable name, by explicit native handles, or by monitor index or explicit native handle. A window must match all provided expressions to be selected. The first matching window will be picked, in whatever order Windows returns them. (chaotic of Windows, honestly ๐Ÿซ )

Explicit handles (hwnd, hmonitor) override pattern or index based selection. If neither handles nor a monitor index are given, the first window matching the provided regular expressions is captured.

This source does NOT hold a stable FPS. It returns frames at whatever rate the compositor provides them, only capped by the max_framerate. If you need a stable rate, you need to add an fps filter to drop/duplicate frames as needed. fr fr, don't say I didn't warn you ๐Ÿ’€

If the capture source disappears mid-capture (window closed, monitor disconnected), the filter will return EOF.

This source accepts the following options:

  • window_title โ€” ECMAScript regular expression matched against the window title. Supports a PCRE style (?i) prefix for case-insensitive matching.
  • window_class โ€” as window_title, but matched against the window class name.
  • window_exe โ€” as window_title, but matched against the executable file name of the window's process.
  • monitor_idx โ€” zero-based index of the monitor to capture.

Can also be set to window to capture the monitor the selected window is displayed on at filter initialization time. cute ๐Ÿ’–

  • hwnd โ€” explicit native window handle (HWND).
  • hmonitor โ€” explicit native monitor handle (HMONITOR).
  • capture_cursor โ€” capture the mouse cursor. Enabled by default.
  • capture_border โ€” capture the full area of the window, including its window decorarions/border. Disabled by default.
  • display_border โ€” draw a yellow highlight border around the captured window. Disabled by default. aesthetic โœจ
  • max_framerate โ€” maximum capture frame rate. Accepts a video rate (e.g. 30, 60/1, 24000/1001). The default is 60 FPS. The actual rate is the rate at which the compositor renders the window/monitor, capped by this option.
  • width โ€” force the output canvas width. If zero (default) the initial captured source width is used. If a negative number is provided, the width will be rounded down to the next multiple of that number.

See resize_mode.

  • height โ€” force the output canvas height. If zero (default) the initial captured source height is used. If a negative number is provided, the height will be rounded down to the next multiple of that number.

See resize_mode.

  • crop_left โ€” crop this many pixels from the left side of the captured frames.
  • crop_top โ€” crop this many pixels from the left side of the captured frames.
  • crop_right โ€” crop this many pixels from the left side of the captured frames.
  • crop_bottom โ€” crop this many pixels from the left side of the captured frames.
  • premultiplied โ€” if set to 1, return frames with premultiplied alpha. Default is 0 (straight alpha).
  • resize_mode โ€” defines how the captured content is fitted into the output canvas size. Possible values:
    • crop โ€” crop (or pad with black) to the canvas size. (default)
    • scale โ€” scale the source to fill the canvas, potentially altering aspect ratio. ๐Ÿ™ˆ
    • scale_aspect โ€” scale the source to fit inside the canvas while preserving aspect ratio. Remaining area is filled with black.
  • scale_mode โ€” scaling algorithm used when resizing is required. Possible values:
    • point โ€” nearest neighbour (pixelated) scaling.
    • bilinear โ€” bilinear filtering. (default)
    • bicubic โ€” bicubic filtering. Potentially more blurry, but fewer scaling artifacts depending on contents.
  • output_fmt โ€” desired output pixel format inside the D3D11 hardware frames. Possible values:
    • bgra, 8bit โ€” 8 bit BGRA output (default)
    • x2bgr10, 10bit โ€” 10 bit BGR output
    • rgbaf16, 16bit โ€” 16bit float RGBA output

Examples

<Capture a window by title (case-insensitive) at a maximum of 60 fps:>

ffmpeg -filter_complex gfxcapture=window_title='(?i)My Application':max_framerate=60,hwdownload,format=bgra,format=yuv420p -c:v libx264 -crf 15 capture.mp4

<Capture monitor 1 at native refresh, 10bit color depth, scale to 1920x1080 preserving aspect:>

ffmpeg -filter_complex gfxcapture=monitor_idx=1:width=1920:height=1080:resize_mode=scale_aspect:output_fmt=10bit -c:v hevc_nvenc -cq 15 capture.mp4

<Capture a window by executable name, draw border, force point scaling, fixed 60 fps:>

ffmpeg -filter_complex gfxcapture=window_exe='^firefox.exe$':display_border=1:scale_mode=point,fps=60 -rc qvbr -qvbr_quality_level 15 -c:v h264_amf capture.mp4

๐ŸŒˆ gradients

Generate several gradients. it's giving vaporwave screensaver and I'm here for it ๐Ÿ’œ

  • size, s โ€” set frame size. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is 640x480.
  • rate, r โ€” set frame rate, expressed as number of frames per second. Default value is 25.
  • c0, c1, c2, c3, c4, c5, c6, c7 โ€” set 8 colors. Default values for colors is to pick random one. chaos mode ๐ŸŽฒ
  • x0, y0, y0, y1 โ€” set gradient line source and destination points. If negative or out of range, random ones are picked.
  • nb_colors, n โ€” set number of colors to use at once. Allowed range is from 2 to 8. Default value is 2.
  • seed โ€” set seed for picking gradient line points.
  • duration, d โ€” set the duration of the sourced video. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax.

If not specified, or the expressed duration is negative, the video is supposed to be generated forever. infinite gradient era โ™พ๏ธ

  • speed โ€” set speed of gradients rotation.
  • type, t โ€” set type of gradients. Available values are:
    • linear
    • radial
    • circular
    • spiral
    • square

Default type is linear.

Commands

This source supports the some above options as commands. yup, live tweaking, main character energy ๐Ÿ‘‘


๐ŸŒ€ mandelbrot

Generate a Mandelbrot set fractal, and progressively zoom towards the point specified with start_x and start_y. literally infinite zoom, iconic โœจ

This source accepts the following options:

  • end_pts โ€” set the terminal pts value. Default value is 400.
  • end_scale โ€” set the terminal scale value. Must be a floating point value. Default value is 0.3.
  • inner โ€” set the inner coloring mode, that is the algorithm used to draw the Mandelbrot fractal internal region.

It shall assume one of the following values:

  • black โ€” set black mode.
  • convergence โ€” show time until convergence.
  • mincol โ€” set color based on point closest to the origin of the iterations.
  • period โ€” set period mode.

Default value is mincol.

  • bailout โ€” set the bailout value. Default value is 10.0.
  • maxiter โ€” set the maximum of iterations performed by the rendering algorithm. Default value is 7189.
  • outer โ€” set outer coloring mode. It shall assume one of following values:
    • iteration_count โ€” set iteration count mode.
    • normalized_iteration_count โ€” set normalized iteration count mode.

Default value is normalized_iteration_count.

  • rate, r โ€” set frame rate, expressed as number of frames per second. Default value is 25.
  • size, s โ€” set frame size. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is 640x480.
  • start_scale โ€” set the initial scale value. Default value is 3.0.
  • start_x โ€” set the initial x position. Must be a floating point value between -100 and 100. Default value is -0.743643887037158704752191506114774.
  • start_y โ€” set the initial y position. Must be a floating point value between -100 and 100. Default value is -0.131825904205311970493132056385139.

like look at those default coordinates, someone really sat there and typed all those digits ๐Ÿ’€ respect tho ๐Ÿซถ

๐ŸŒธ mptestsrc ๐ŸŒธ

Generates a whole bunch of test patterns, exactly the way the MPlayer test filter does it. Iconic crossover moment tbh.

The size of the generated video is fixed, bestie, and it's 512x512. No negotiating. This source is lowkey perfect for testing encoding features, fr fr.

This source accepts the following options:

  • rate, r โ€” Sets the frame rate of the sourced video, aka the number of frames generated per second. Gotta be a string in the format frame_rate_num/frame_rate_den, an integer number, a floating point number, or a valid video frame rate abbreviation. Default is "25". ๐Ÿ’…
  • duration, d โ€” Sets the duration of the sourced video. Peep the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax.

If you don't specify it, or the expressed duration is negative, the video is supposed to be generated forever. no cap, infinite vibes โœจ

  • test, t โ€” Sets the number or the name of the test to perform. The supported tests are:
    • dc_luma
    • dc_chroma
    • freq_luma
    • freq_chroma
    • amp_luma
    • amp_chroma
    • cbp
    • mv
    • ring1
    • ring2
    • all
    • max_frames, m โ€” Sets the maximum number of frames generated for each test, default value is 30.

Default value is "all", which cycles through the list of all the tests ๐ŸŒ€

Some examples:

mptestsrc=t=dc_luma

will generate a "dc_luma" test pattern. slay ๐Ÿ’–


๐ŸŽ€ frei0r_src ๐ŸŽ€

Provides a frei0r source. yup, that's the whole vibe.

To enable compilation of this filter you need to install the frei0r header and configure FFmpeg with --enable-frei0r. (do not skip this step bestie, it literally will not exist otherwise ๐Ÿ˜ญ)

This source accepts the following parameters:

  • size โ€” The size of the video to generate. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.
  • framerate โ€” The framerate of the generated video. It may be a string of the form num/den or a frame rate abbreviation.
  • filter_name โ€” The name of the frei0r source to load. For more information regarding frei0r and how to set the parameters, read the frei0r section in the video filters documentation.
  • filter_params โ€” A '|'-separated list of parameters to pass to the frei0r source.

For example, to generate a frei0r partik0l source with size 200x200 and frame rate 10 which is overlaid on the overlay filter main input:

frei0r_src=size=200x200:framerate=10:filter_name=partik0l:filter_params=1234 [overlay]; [in][overlay] overlay

๐Ÿฆ‹ life ๐Ÿฆ‹

Generates a life pattern. we love a cellular automaton moment ๐Ÿงš

This source is based on a generalization of John Conway's life game.

The sourced input represents a life grid โ€” each pixel represents a cell which can be in one of two possible states: alive or dead. Every cell interacts with its eight neighbours, which are the cells that are horizontally, vertically, or diagonally adjacent.

At each interaction the grid evolves according to the adopted rule, which specifies the number of neighbor alive cells which will make a cell stay alive or be born. The rule option lets you specify the rule to adopt.

This source accepts the following options:

  • filename, f โ€” Sets the file from which to read the initial grid state. In the file, each non-whitespace character is considered an alive cell, and newline is used to delimit the end of each row.

If this option is not specified, the initial grid is generated randomly. ๐ŸŽฒ

  • rate, r โ€” Sets the video rate, that is the number of frames generated per second. Default is 25.
  • random_fill_ratio, ratio โ€” Sets the random fill ratio for the initial random grid. It's a floating point number value ranging from 0 to 1, defaults to 1/PHI. It is ignored when a file is specified.
  • random_seed, seed โ€” Sets the seed for filling the initial random grid, must be an integer included between 0 and UINT32_MAX. If not specified, or if explicitly set to -1, the filter will try to use a good random seed on a best effort basis.
  • rule โ€” Sets the life rule.

A rule can be specified with a code of the kind "SNS/BNB", where NS and NB are sequences of numbers in the range 0-8. NS specifies the number of alive neighbor cells which make a live cell stay alive, and NB the number of alive neighbor cells which make a dead cell become alive (i.e. to be "born"). "s" and "b" can be used in place of "S" and "B", respectively.

Alternatively a rule can be specified by an 18-bits integer. The 9 high order bits are used to encode the next cell state if it is alive for each number of neighbor alive cells, the low order bits specify the rule for "borning" new cells. Higher order bits encode for a higher number of neighbor cells. For example the number 6153 = "(12<<9)+9" specifies a stay alive rule of 12 and a born rule of 9, which corresponds to "S23/B03".

Default value is "S23/B3", which is the original Conway's game of life rule, and will keep a cell alive if it has 2 or 3 neighbor alive cells, and will born a new cell if there are three alive cells around a dead cell. ๐Ÿ‘‘

  • size, s โ€” Sets the size of the output video. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual.

If filename is specified, the size is set by default to the same size of the input file. If size is set, it must contain the size specified in the input file, and the initial grid defined in that file is centered in the larger resulting area.

If a filename is not specified, the size value defaults to "320x240" (used for a randomly generated initial grid). โœจ

  • stitch โ€” If set to 1, stitch the left and right grid edges together, and the top and bottom edges also. Defaults to 1.
  • mold โ€” Sets cell mold speed. If set, a dead cell will go from death_color to mold_color with a step of mold. mold can have a value from 0 to 255.
  • life_color โ€” Sets the color of living (or new born) cells. ๐Ÿ’š
  • death_color โ€” Sets the color of dead cells. If mold is set, this is the first color used to represent a dead cell.
  • mold_color โ€” Sets mold color, for definitely dead and moldy cells. ๐Ÿ’€

For the syntax of these 3 color options, check the "Color" section in the ffmpeg-utils manual.

Examples

  • Read a grid from pattern, and center it on a grid of size 300x300 pixels:
life=f=pattern:s=300x300
  • Generate a random grid of size 200x200, with a fill ratio of 2/3:
life=ratio=2/3:s=200x200
  • Specify a custom rule for evolving a randomly generated grid:
life=rule=S14/B34
  • Full example with slow death effect (mold) using ffplay:
ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16

absolutely ate that one, ngl ๐Ÿ”ฅ


๐ŸŒˆ perlin ๐ŸŒˆ

Generates Perlin noise. it's giving texture, it's giving vibes โœจ

Perlin noise is a kind of noise with local continuity in space. This can be used to generate patterns with continuity in space and time, e.g. to simulate smoke, fluids, or terrain. so many possibilities bestie ๐Ÿซถ

In case more than one octave is specified through the octaves option, Perlin noise is generated as a sum of components, each one with doubled frequency. In this case the persistence option specifies the ratio of the amplitude with respect to the previous component. More octave components let you specify more high frequency details in the generated noise (e.g. small size variations due to boulders in a generated terrain).

Options

  • size, s โ€” Specifies the size (width and height) of the buffered video frames. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "320x240".
  • rate, r โ€” Specifies the frame rate expected for the video stream, expressed as a number of frames per second. Default value is 25.
  • octaves โ€” Specifies the total number of components making up the noise, each one with doubled frequency. Default value is 1.
  • persistence โ€” Sets the ratio used to compute the amplitude of the next octave component with respect to the previous component amplitude. Default value is 1.
  • xscale
  • yscale โ€” Define a scale factor used to multiple the x, y coordinates. This can be useful to define an effect with a pattern stretched along the x or y axis. Default value is 1.
  • tscale โ€” Defines a scale factor used to multiple the time coordinate. This can be useful to change the time variation speed. Default value is 1.
  • random_mode โ€” Sets the random mode used to compute the initial pattern.

The supported values are:

  • random โ€” Compute and use random seed.
  • ken โ€” Use the predefined initial pattern defined by Ken Perlin in the original article, can be useful to compare the output with other sources.
  • seed โ€” Use the value specified by the random_seed option.

Default value is "random".

  • random_seed, seed โ€” When random_mode is set to random_seed, use this value to compute the initial pattern. Default value is 0.

Examples

  • Generate single component:
perlin
  • Use Perlin noise with 7 components, each one with a halved contribution to total amplitude:
perlin=octaves=7:persistence=0.5
  • Chain Perlin noise with the lutyuv to generate a black&white effect:
perlin=octaves=3:tscale=0.3,lutyuv=y='if(lt(val\,128)\,255\,0)'
  • Stretch noise along the y axis, and convert gray level to red-only signal:
perlin=octaves=7:tscale=0.4:yscale=0.3,lutrgb=r=val:b=0:g=0

the way these examples just work?? obsessed ๐Ÿ’œ


๐ŸŽ€ qrencodesrc ๐ŸŽ€

Generates a QR code using the libqrencode library (see <https://fukuchi.org/works/qrencode/>). literally making scannable art, we love to see it ๐Ÿ“ฑโœจ

To enable the compilation of this source, you need to configure FFmpeg with --enable-libqrencode.

The QR code is generated from the provided text or text pattern. The corresponding QR code is scaled and put in the video output according to the specified output size options.

In case no text is specified, the QR code is not generated, but an empty colored output is returned instead. (yes, just a blank lil rectangle ๐Ÿ˜ญ)

This source accepts the following options:

  • qrcode_width, q
  • padded_qrcode_width, Q โ€” Specify an expression for the width of the rendered QR code, with and without padding. The qrcode_width expression can reference the value set by the padded_qrcode_width expression, and vice versa. By default padded_qrcode_width is set to qrcode_width, meaning that there is no padding.

These expressions are evaluated only once, when initializing the source. See the qrencode Expressions section for details.

Bestie PSA: some of the constants literally do not exist for the source (like x or t or ยธn), and that's on purpose โ€” they only make sense when you're evaluating the expression per-frame, not at initialization time. iykyk ๐Ÿ’…
  • rate, r โ€” sets the frame rate of the sourced video, aka how many frames get generated per second. It's gotta be a string in the format frame_rate_num/frame_rate_den, a plain integer, a floating point number, or a valid video frame rate abbreviation. Default? "25". ๐Ÿ’ซ
  • case_sensitive, cs โ€” tells libqrencode to do case sensitive encoding. On by default โœจ. You can turn it off to shrink the QR encoding size (smaller code, iconic).
  • level, l โ€” picks the QR encoding error correction level. Higher correction level = bigger encoding size, but the code is way more robust to corruption. Lower level is L. It accepts these values:
    • L
    • M
    • Q
    • H
  • expansion โ€” chooses how the input text gets expanded. Either "none" or "normal" (that's the default). The deets live in the qrencode Text expansion section ๐ŸŽ€
  • text, textfile โ€” define the text to be rendered. If neither one is specified, no QR gets encoded at all (you just get an empty colored frame, kind of a vibe but useless ๐Ÿ™ˆ).

If expansion is enabled, the text is treated as a text template using the qrencode expansion mechanism โ€” again, see the qrencode Text expansion section.

  • background_color, bc, foreground_color, fc โ€” set the QR code and background color. Default for foreground_color is "black", default for background_color is "white", classic. For the syntax of the color options, check the "Color" section in the ffmpeg-utils manual ๐ŸŒˆ

โœจ Examples (steal these) โœจ

  • Generate a QR code encoding the specified text with the default size:
qrencodesrc=text=www.ffmpeg.org
  • Same as below, but select blue on pink colors (yes, the serve is real ๐Ÿ’–):
qrencodesrc=text=www.ffmpeg.org:bc=pink:fc=blue
  • Generate a QR code with width of 200 pixels and padding, making the padded width 4/3 of the QR code width:
qrencodesrc=text=www.ffmpeg.org:q=200:Q=4/3*q
  • Generate a QR code with padded width of 200 pixels and padding, making the QR code width 3/4 of the padded width:
qrencodesrc=text=www.ffmpeg.org:Q=200:q=3/4*Q
  • Generate a QR code encoding the frame number:
qrencodesrc=text=%{n}
  • Generate a QR code encoding the GMT timestamp:
qrencodesrc=text=%{gmtime}
  • Generate a QR code encoding the timestamp expressed as a float:
qrencodesrc=text=%{pts}

๐Ÿฆ‹ allrgb, allyuv, color, colorchart, colorspectrum, haldclutsrc, nullsrc, pal75bars, pal100bars, rgbtestsrc, smptebars, smptehdbars, testsrc, testsrc2, yuvtestsrc ๐Ÿฆ‹

Okay so this is the whole test-pattern friend group, and here's who's who:

  • The "allrgb" source returns frames of size 4096x4096 of all rgb colors. Yeah, all of them. ๐Ÿ”ฅ
  • The "allyuv" source returns frames of size 4096x4096 of all yuv colors.
  • The "color" source provides an uniformly colored input โ€” one color, full screen, minimal effort, main character energy.
  • The "colorchart" source provides a colors checker chart.
  • The "colorspectrum" source provides a color spectrum input.
  • The "haldclutsrc" source provides an identity Hald CLUT. See also the haldclut filter (they're mutuals ๐Ÿซถ).
  • The "nullsrc" source returns unprocessed video frames. It's mainly useful in analysis / debugging tools, or as the source for filters which ignore the input data.
  • The "pal75bars" source generates a color bars pattern, based on EBU PAL recommendations with 75% color levels.
  • The "pal100bars" source generates a color bars pattern, based on EBU PAL recommendations with 100% color levels.
  • The "rgbtestsrc" source generates an RGB test pattern useful for detecting RGB vs BGR issues. You should see a red, green and blue stripe from top to bottom ๐ŸŒˆ.
  • The "smptebars" source generates a color bars pattern, based on the SMPTE Engineering Guideline EG 1-1990.
  • The "smptehdbars" source generates a color bars pattern, based on the SMPTE RP 219-2002.
  • The "testsrc" source generates a test video pattern, showing a color pattern, a scrolling gradient and a timestamp. This is mainly intended for testing purposes.
  • The "testsrc2" source is similar to testsrc, but supports more pixel formats instead of just rgb24. This allows using it as an input for other tests without requiring a format conversion โ€” so convenient, honestly ๐Ÿ‘‘
  • The "yuvtestsrc" source generates an YUV test pattern. You should see a y, cb and cr stripe from top to bottom.

The sources accept the following parameters ๐Ÿ’…:

  • level โ€” specify the level of the Hald CLUT, only available in the "haldclutsrc" source. A level of N generates a picture of N*N*N by N*N*N pixels to be used as identity matrix for 3D lookup tables. Each component is coded on a 1/(N*N) scale.
  • color, c โ€” specify the color of the source, only available in the "color" source. For the syntax of this option, check the "Color" section in the ffmpeg-utils manual.
  • size, s โ€” specify the size of the sourced video. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. The default value is 320x240.

Heads up: this option is not available with the "allrgb", "allyuv", and "haldclutsrc" filters. ๐Ÿ™…โ€โ™€๏ธ

  • rate, r โ€” specify the frame rate of the sourced video, as the number of frames generated per second. It has to be a string in the format frame_rate_num/frame_rate_den, an integer number, a floating point number or a valid video frame rate abbreviation. The default value is "25".
  • duration, d โ€” set the duration of the sourced video. See the Time duration section in the ffmpeg-utils(1) manual for the accepted syntax.

If it's not specified, or the expressed duration is negative, the video is supposed to be generated forever (iconic, unhinged, never ends ๐Ÿ˜ญ).

Since the frame rate is used as time base, all frames including the last one will have their full duration. If the specified duration is not a multiple of the frame duration, it will be rounded up.

  • sar โ€” set the sample aspect ratio of the sourced video.
  • alpha โ€” specify the alpha (opacity) of the background, only available in the "testsrc2" source. The value must be between 0 (fully transparent) and 255 (fully opaque, the default).
  • decimals, n โ€” set the number of decimals to show in the timestamp, only available in the "testsrc" source.

The displayed timestamp value will correspond to the original timestamp value multiplied by the power of 10 of the specified value. Default value is 0.

  • type โ€” set the type of the color spectrum, only available in the "colorspectrum" source. Can be one of the following:
    • black
    • white
    • all
  • patch_size โ€” set patch size of single color patch, only available in the "colorchart" source. Default is 64x64.
  • preset โ€” set colorchecker colors preset, only available in the "colorchart" source.

Available values are:

  • reference
  • skintones

Default value is "reference".

๐Ÿ’– Examples ๐Ÿ’–

  • Generate a video with a duration of 5.3 seconds, with size 176x144 and a frame rate of 10 frames per second:
testsrc=duration=5.3:size=qcif:rate=10
  • The following graph description will generate a red source with an opacity of 0.2, with size "qcif" and a frame rate of 10 frames per second:
color=c=red@0.2:s=qcif:r=10
  • If the input content is to be ignored, "nullsrc" can be used. The following command generates noise in the luma plane by employing the "geq" filter:
nullsrc=s=256x256, geq=random(1)*255:128:128

๐ŸŽฎ Commands ๐ŸŽฎ

The "color" source supports the following commands:

  • c, color โ€” set the color of the created image. Accepts the same syntax of the corresponding color option.

โšก openclsrc โšก

Generate video using an OpenCL program. Literally compute, but make it fashion ๐Ÿ’…

  • source โ€” OpenCL program source file.
  • kernel โ€” kernel name in program.
  • size, s โ€” size of frames to generate. This must be set. No default, bestie, you have to tell it.
  • format โ€” pixel format to use for the generated frames. This must be set too.
  • rate, r โ€” number of frames generated every second. Default value is '25'.

For details of how the program loading works, see the program_opencl filter ๐Ÿ‘€

Example programs

  • Generate a colour ramp by setting pixel values from the position of the pixel in the output image. (Note that this will work with all pixel formats, but the generated output will not be the same.)
__kernel void ramp(__write_only image2d_t dst,
                   unsigned int index)
{
    int2 loc = (int2)(get_global_id(0), get_global_id(1));

    float4 val;
    val.xy = val.zw = convert_float2(loc) / convert_float2(get_image_dim(dst));

    write_imagef(dst, loc, val);
}
  • Generate a Sierpinski carpet pattern, panning by a single pixel each frame.
__kernel void sierpinski_carpet(__write_only image2d_t dst,
                                unsigned int index)
{
    int2 loc = (int2)(get_global_id(0), get_global_id(1));

    float4 value = 0.0f;
    int x = loc.x + index;
    int y = loc.y + index;
    while (x > 0 || y > 0) {
        if (x % 3 == 1 && y % 3 == 1) {
            value = 1.0f;
            break;
        }
        x /= 3;
        y /= 3;
    }

    write_imagef(dst, loc, value);
}

๐Ÿงš sierpinski ๐Ÿงš

Generate a Sierpinski carpet/triangle fractal, and randomly pan around. Fractal chaos but make it cute ๐ŸŒ€

This source accepts the following options:

  • size, s โ€” set frame size. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "640x480".
  • rate, r โ€” set frame rate, expressed as number of frames per second. Default value is "25".
  • seed โ€” set seed which is used for random panning.
  • jump โ€” set max jump for single pan destination. Allowed range is from 1 to 10000.
  • type โ€” set fractal type, can be default "carpet" or "triangle".

๐Ÿ“ zoneplate ๐Ÿ“

Generate a zoneplate test video pattern.

This source accepts the following options:

  • size, s โ€” set frame size. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "320x240".
  • rate, r โ€” sets the frame rate, i.e. how many frames per second. default is 25.
  • duration, d โ€” sets how long the sourced video lives. like, the accepted syntax is in the Time duration section of the ffmpeg-utils(1) manual, go look bestie. if you don't set it, or you set a negative duration, the video is presumed to be generated forever (spooky infinite video ๐Ÿ‘€).
  • sar โ€” sets the sample aspect ratio of the sourced video.
  • precision โ€” sets the precision, in bits, for the look-up table used for the sine calculations. default is 10. allowed range is from 4 to 16.
  • xo โ€” sets the horizontal axis offset for the output signal. default is 0.
  • yo โ€” sets the vertical axis offset for the output signal. default is 0.
  • to โ€” sets the time axis offset for the output signal. default is 0.
  • k0 โ€” sets the 0-order constant added to the signal phase. default is 0.
  • kx โ€” sets the 1-order phase factor multiplier for the horizontal axis. default is 0.
  • ky โ€” sets the 1-order phase factor multiplier for the vertical axis. default is 0.
  • kt โ€” sets the 1-order phase factor multiplier for the time axis. default is 0.
  • kxt, kyt, kxy โ€” set the phase factor multipliers for combinations of the spatial and temporal axes. default is 0.
  • kx2 โ€” sets the 2-order phase factor multiplier for the horizontal axis. default is 0.
  • ky2 โ€” sets the 2-order phase factor multiplier for the vertical axis. default is 0.
  • kt2 โ€” sets the 2-order phase factor multiplier for the time axis. default is 0.
  • ku โ€” sets the constant added to the final phase to produce the chroma-blue component of the signal. default is 0.
  • kv โ€” sets the constant added to the final phase to produce the chroma-red component of the signal. default is 0.

Commands ๐ŸŽ€

this source supports some of the above options as commands, iykyk.

Examples โœจ

  • generate a horizontal color sine sweep:
zoneplate=ku=512:kv=0:kt2=0:kx2=256:s=wvga:xo=-426:kt=11
  • generate a vertical color sine sweep:
zoneplate=ku=512:kv=0:kt2=0:ky2=156:s=wvga:yo=-240:kt=11
  • generate a circular zone-plate:
zoneplate=ku=512:kv=100:kt2=0:ky2=256:kx2=556:s=wvga:yo=0:kt=11

๐ŸŽฌ VIDEO SINKS

below is the rundown of the video sinks that currently exist. sinks are the little buckets at the end of the graph, bestie ๐Ÿ’…

buffersink

buffers the video frames and makes them available to the end of the filter graph.

this sink is mainly intended for programmatic use โ€” in particular through the interface defined in libavfilter/buffersink.h, or through the options system.

it accepts a pointer to an AVBufferSinkContext structure, which defines the incoming buffers' formats, and that pointer gets passed as the opaque parameter to avfilter_init_filter for initialization.

nullsink

the null video sink: does absolutely nothing with the input video, fr fr. mainly useful as a template ๐Ÿงš and for use in analysis / debugging tools.


๐ŸŒˆ MULTIMEDIA FILTERS

below is the rundown of the multimedia filters that currently exist. these ones do audio and video, main character energy ๐Ÿ‘‘

a3dscope

converts input audio into a 3d scope video output. it's giving audio in three dimensions ๐Ÿฆ‹

the filter accepts the following options:

  • rate, r โ€” sets the frame rate, expressed as number of frames per second. default value is "25".
  • size, s โ€” specifies the video size for the output. for the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. default value is "hd720".
  • fov โ€” sets the camera field of view. default is 90 degrees. allowed range is from 40 to 150.
  • roll โ€” sets the camera roll.
  • pitch โ€” sets the camera pitch.
  • yaw โ€” sets the camera yaw.
  • xzoom โ€” sets the camera zoom on the X-axis.
  • yzoom โ€” sets the camera zoom on the Y-axis.
  • zzoom โ€” sets the camera zoom on the Z-axis.
  • xpos โ€” sets the camera position on the X-axis.
  • ypos โ€” sets the camera position on the Y-axis.
  • zpos โ€” sets the camera position on the Z-axis.
  • length โ€” sets the length of the displayed audio waves, in number of frames.

Commands ๐Ÿ’ซ

the filter supports some of the above options as commands.

abitscope

converts the input audio into a video output, displaying the audio bit scope. literal bit vibes ๐Ÿ“Š

the filter accepts the following options:

  • rate, r โ€” sets the frame rate, expressed as number of frames per second. default value is "25".
  • size, s โ€” specifies the video size for the output. for the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. default value is "1024x256".
  • colors โ€” specifies a list of colors separated by a space or by '|', and those get used to draw the channels. any unrecognized or missing colors get replaced by white, no cap.
  • mode, m โ€” sets the output mode. can be "bars" or "trace". default is "bars".

adrawgraph

draws a graph using the input audio metadata. it's a whole art project ๐ŸŽจ

see drawgraph.

agraphmonitor

see graphmonitor.

ahistogram

converts the input audio into a video output, displaying the volume histogram. so satisfying to watch ngl ๐Ÿ“ˆ

the filter accepts the following options:

  • dmode โ€” specifies how the histogram is calculated.

it accepts the following values:

  • single โ€” use a single histogram for all channels.
  • separate โ€” use a separate histogram for each channel.

default is "single".

  • rate, r โ€” sets the frame rate, expressed as number of frames per second. default value is "25".
  • size, s โ€” specifies the video size for the output. for the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. default value is "hd720".
  • scale โ€” sets the display scale.

it accepts the following values:

  • log โ€” logarithmic
  • sqrt โ€” square root
  • cbrt โ€” cubic root
  • lin โ€” linear
  • rlog โ€” reverse logarithmic

default is "log".

  • ascale โ€” sets the amplitude scale.

it accepts the following values:

  • log โ€” logarithmic
  • lin โ€” linear

default is "log".

  • acount โ€” sets how many frames to accumulate in the histogram. default is 1. setting this to -1 accumulates all frames.
  • rheight โ€” sets the histogram ratio of the window height.
  • slide โ€” sets the sonogram sliding.

it accepts the following values:

  • replace โ€” replace old rows with new ones.
  • scroll โ€” scroll from top to bottom.

default is "replace".

  • hmode โ€” sets the histogram mode.

it accepts the following values:

  • abs โ€” use absolute values of the samples.
  • sign โ€” use untouched values of the samples.

default is "abs".

aphasemeter

measures the phase of the input audio, and that gets exported as the metadata lavfi.aphasemeter.phase, which represents the mean phase of the current audio frame. a video output can also be produced, and it's enabled by default. the audio is passed through as the first output.

the audio gets rematrixed to stereo if it has a different channel layout. the phase value is in the range [-1, 1], where -1 means the left and right channels are completely out of phase, and 1 means the channels are in phase. slay ๐Ÿ’…

the filter accepts the following options, all of them related to its video output:

  • rate, r โ€” sets the output frame rate. default value is 25.
  • size, s โ€” sets the video size for the output. for the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. default value is "800x400".
  • rc, gc, bc โ€” specify the red, green and blue contrast. default values are 2, 7 and 1. allowed range is [0, 255].
  • mpc โ€” sets the color that will be used for drawing the median phase. if the color is "none", which is the default, no median phase value will be drawn.
  • video โ€” enables the video output. default is enabled.

phasing detection ๐Ÿฆ‹

the filter also detects out-of-phase and mono sequences in stereo streams. it logs the sequence's start, end and duration when it lasts longer than โ€” or as long as โ€” the minimum set.

the filter accepts the following options for this detection:

  • phasing โ€” enables mono and out-of-phase detection. default is disabled.
  • tolerance, t โ€” sets the phase tolerance for mono detection, in amplitude ratio. default is 0. allowed range is [0, 1].
  • angle, a โ€” sets the angle threshold for out-of-phase detection, in degrees. default is 170. allowed range is [90, 180].
  • duration, d โ€” sets how long the mono or out-of-phase condition must last until notification, expressed in seconds. default is 2.

Examples โœจ

  • complete example with ffmpeg to detect 1 second of mono with 0.001 phase tolerance:
ffmpeg -i stereo.wav -af aphasemeter=video=0:phasing=1:duration=1:tolerance=0.001 -f null -

avectorscope

converts the input audio into a video output that represents the audio vector scope. this one's iconic istg ๐ŸŒ€

the filter measures the difference between the channels of a stereo audio stream. a monaural signal โ€” identical left and right signal โ€” results in a straight vertical line. any stereo separation shows up as a deviation from that line, creating a Lissajous figure. if a straight (or deviating from straight) but horizontal line shows up, that indicates the left and right channels are out of phase. ๐Ÿ’€

the filter accepts the following options:

  • mode, m โ€” sets the vectorscope mode.

available values are:

  • lissajous โ€” Lissajous rotated by 45 degrees.
  • lissajous_xy โ€” same as above but not rotated.
  • polar โ€” shape resembling half a circle.

default value is lissajous.

  • size, s โ€” sets the video size for the output. for the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. default value is "400x400".
  • rate, r โ€” sets the output frame rate. default value is 25.
  • rc, gc, bc, ac โ€” specify the red, green, blue and alpha contrast. default values are 40, 160, 80 and 255. allowed range is [0, 255].
  • rf, gf, bf, af โ€” specify the red, green, blue and alpha fade. default values are 15, 10, 5 and 5. allowed range is [0, 255].
  • zoom โ€” sets the zoom factor. default value is 1. allowed range is [0, 10]. values lower than 1 will auto adjust the zoom factor to the maximal possible value.
  • draw โ€” sets the vectorscope drawing mode.

available values are:

  • dot โ€” draw a dot for each sample.
  • line โ€” draw a line between the previous and current sample.
  • aaline โ€” draw an anti-aliased line between the previous and current sample.

default value is dot.

  • scale โ€” specifies the amplitude scale of the audio samples.

available values are:

  • lin โ€” linear.
  • sqrt โ€” square root.
  • cbrt โ€” cubic root.
  • log โ€” logarithmic.
  • swap โ€” swaps the left channel axis with the right channel axis.
  • mirror โ€” mirrors the axis.
    • none โ€” no mirror.
  • x โ€” mirror just the x axis, nothing else ๐Ÿ’…
  • y โ€” mirror just the y axis, that's it
  • xy โ€” mirror both axes, go big or go home

โœจ Examples โœจ

  • The full-blown serve, using ffplay:
ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1];
             [a] avectorscope=zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7 [out0]'

๐ŸŽ€ Commands ๐ŸŽ€

This filter supports all of the above options as commands โ€” except size and rate, those two are not invited to the command party ๐Ÿ™…


๐Ÿ”ฅ bench, abench

Okay so this one is literally a stopwatch for part of your filtergraph โฑ๏ธ it benchmarks a chunk of a filtergraph. Iconic for figuring out which filter is being slow.

The filter accepts the following options:

  • action โ€” start or stop a timer. That's the whole job bestie.

Available values are:

  • start โ€” grab the current time, stash it as frame metadata (using the key lavfi.bench.start_time), and pass the frame on down to the next filter ๐Ÿซถ
  • stop โ€” grab the current time and pull the lavfi.bench.start_time metadata off the input frame to get the time difference. Then it prints the time difference, average, maximum and minimum time (respectively t, avg, max and min). Timestamps are in seconds โญ

โœจ Examples โœจ

  • Benchmark the selectivecolor filter, iykyk:
bench=start,selectivecolor=reds=-.2 .12 -.49,bench=stop

๐ŸŽฌ concat

Concatenate audio and video streams โ€” like, glue them together one after the other, a little stream chain ๐Ÿฆ‹

This filter works on segments of synchronized video and audio streams. All the segments have to have the same number of streams of each type, and that number is also how many streams you get at the output. No cap.

The filter accepts the following options:

  • n โ€” set the number of segments. Default is 2.
  • v โ€” set the number of output video streams, which is also the number of video streams in each segment. Default is 1.
  • a โ€” set the number of output audio streams, which is also the number of audio streams in each segment. Default is 0.
  • unsafe โ€” activate unsafe mode: don't fail if segments have a different format ๐Ÿ‘€ live a little

The filter has v+a outputs: first the v video outputs, then the a audio outputs.

There are nx(v+a) inputs: first the inputs for the first segment, in the same order as the outputs, then the inputs for the second segment, etc. Order matters, bestie ๐Ÿซก

Related streams don't always have exactly the same duration โ€” for various reasons including codec frame size or sloppy authoring. So for that reason, related synchronized streams (e.g. a video and its audio track) should be concatenated at once. The concat filter will use the duration of the longest stream in each segment (except the last one), and if necessary pad shorter audio streams with silence ๐Ÿคซ

For this filter to work correctly, all segments must start at timestamp 0.

All corresponding streams must have the same parameters in all segments; the filtering system will automatically select a common pixel format for video streams, and a common sample format, sample rate and channel layout for audio streams โ€” but other settings, such as resolution, must be converted explicitly by you, the user ๐Ÿ’…

Different frame rates are acceptable but will result in variable frame rate at the output; be sure to configure the output file to handle it. Consider this your gentle warning ๐Ÿซถ

โœจ Examples โœจ

  • Concatenate an opening, an episode and an ending, all in bilingual version (video in stream 0, audio in streams 1 and 2):
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
  '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
   concat=n=3:v=1:a=2 [v] [a1] [a2]' \
  -map '[v]' -map '[a1]' -map '[a2]' output.mkv
  • Concatenate two parts, handling audio and video separately, using the (a)movie sources, and adjusting the resolution:
movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]
Heads up ๐Ÿšจ a desync will happen at the stitch if the audio and video streams don't have exactly the same duration in the first file. Not a vibe, but forewarned is forearmed.

๐ŸŽ€ Commands ๐ŸŽ€

This filter supports the following commands:

  • next โ€” close the current segment and step to the next one โžก๏ธ literally moving on

๐Ÿ“Š ebur128

The EBU R128 scanner filter ๐Ÿ’– This one takes an audio stream and analyzes its loudness level. By default it logs a message at a frequency of 10Hz with the Momentary loudness (identified by M), Short-term loudness (S), Integrated loudness (I) and Loudness Range (LRA). It's giving audio scientist ๐Ÿ”ฌ

The filter can only analyze streams which have sample format as double-precision floating point. The input stream will be converted to this specification if needed. Users may need to insert aformat and/or aresample filters after this filter to obtain the original parameters ๐Ÿซถ

The filter also has a video output (see the video option) with a real time graph to observe the loudness evolution ๐ŸŒˆ The graphic contains the logged message mentioned above, so it isn't printed anymore when this option is set, unless verbose logging is set. The main graphing area contains the short-term loudness (3 seconds of analysis), and the gauge on the right is for the momentary loudness (400 milliseconds) โ€” but it can optionally be configured to instead display short-term loudness (see gauge).

The green area marks a +/- 1LU target range around the target loudness (-23LUFS by default, unless modified through target). Green means good, bestie ๐Ÿ’š

More info about the Loudness Recommendation EBU R128 on <http://tech.ebu.ch/loudness>.

The filter accepts the following options:

  • video โ€” activate the video output. The audio stream is passed unchanged whether this option is set or not. The video stream will be the first output stream if activated. Default is 0.
  • size โ€” set the video size. This option is for video only. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default and minimum resolution is 640x480.
  • meter โ€” set the EBU scale meter. Default is 9. Common values are 9 and 18, respectively for EBU scale meter +9 and EBU scale meter +18. Any other integer value between this range is allowed.
  • metadata โ€” set metadata injection. If set to 1, the audio input will be segmented into 100ms output frames, each of them containing various loudness information in metadata. All the metadata keys are prefixed with lavfi.r128.. Default is 0.
  • framelog โ€” force the frame logging level.

Available values are:

  • quiet โ€” logging disabled ๐Ÿคซ
  • info โ€” information logging level
  • verbose โ€” verbose logging level

By default, the logging level is set to info. If the video or the metadata options are set, it switches to verbose.

  • peak โ€” set peak mode(s). Available modes can be cumulated (the option is a flag type). Possible values are:
    • none โ€” disable any peak mode (default).
    • sample โ€” enable sample-peak mode. Simple peak mode looking for the higher sample value. It logs a message for sample-peak (identified by SPK).
    • true โ€” enable true-peak mode. If enabled, the peak lookup is done on an over-sampled version of the input stream for better peak accuracy. It logs a message for true-peak (identified by TPK) and true-peak per frame (identified by FTPK). This mode requires a build with libswresample โš ๏ธ no lib, no peak.
  • dualmono โ€” treat mono input files as "dual mono". If a mono file is intended for playback on a stereo system, its EBU R128 measurement will be perceptually incorrect. If set to true, this option will compensate for this effect. Multi-channel input files are not affected by this option.
  • panlaw โ€” set a specific pan law to be used for the measurement of dual mono files. This parameter is optional, and has a default value of -3.01dB.
  • target โ€” set a specific target level (in LUFS) used as relative zero in the visualization. This parameter is optional and has a default value of -23LUFS as specified by EBU R128. However, material published online may prefer a level of -16LUFS (e.g. for use with podcasts or video platforms) ๐ŸŽ™๏ธ
  • gauge โ€” set the value displayed by the gauge. Valid values are momentary and shortterm. By default the momentary value will be used, but in certain scenarios it may be more useful to observe the short term value instead (e.g. live mixing).
  • scale โ€” sets the display scale for the loudness. Valid parameters are absolute (in LUFS) or relative (LU) relative to the target. This only affects the video output, not the summary or continuous log output.
  • integrated โ€” read-only exported value for measured integrated loudness, in LUFS.
  • range โ€” read-only exported value for measured loudness range, in LU.
  • lra_low โ€” read-only exported value for measured LRA low, in LUFS.
  • lra_high โ€” read-only exported value for measured LRA high, in LUFS.
  • sample_peak โ€” read-only exported value for measured sample peak, in dBFS.
  • true_peak โ€” read-only exported value for measured true peak, in dBFS.

โœจ Examples โœจ

  • Real-time graph using ffplay, with a EBU scale meter +18:
ffplay -f lavfi -i "amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]"
  • Run an analysis with ffmpeg:
ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null -

๐Ÿงš interleave, ainterleave

Temporally interleave frames from several inputs ๐ŸŒ€ like a lil shuffle, but make it timestamps.

interleave works with video inputs, ainterleave with audio.

These filters read frames from several inputs and send the oldest queued frame to the output. Oldest first, always ๐Ÿ’…

Input streams must have well defined, monotonically increasing frame timestamp values.

In order to submit one frame to output, these filters need to enqueue at least one frame for each input โ€” so they cannot work in case one input is not yet terminated and will not receive incoming frames ๐Ÿ˜ญ

For example, consider the case when one input is a select filter which always drops input frames. The interleave filter will keep reading from that input, but it will never be able to send new frames to output until the input sends an end-of-stream signal. Stuck in the queue era fr.

Also, depending on input synchronization, the filters will drop frames in case one input receives more frames than the other ones, and the queue is already filled. ๐Ÿ—‘๏ธ

These filters accept the following options:

  • nb_inputs, n โ€” set the number of different inputs, it is 2 by default.
  • duration โ€” how to determine the end-of-stream.
    • longest โ€” the duration of the longest input. (default)
    • shortest โ€” the duration of the shortest input.
  • first โ€” the duration of the first input, bestie. that's it, that's the whole vibe ๐Ÿ’…

โœจ Examples โœจ

  • interleave frames that belong to different streams, using ffmpeg (yes the whole tool, we're going full send):
ffmpeg -i bambi.avi -i pr0n.mkv -filter_complex "[0:v][1:v] interleave" out.avi
  • add a flickering blur effect, so chaotic, so iconic ๐Ÿ”ฅ:
select='if(gt(random(0), 0.2), 1, 2)':n=2 [tmp], boxblur=2:2, [tmp] interleave

๐Ÿฆ‹ latency, alatency

okay so these ones literally measure filtering latency for you, no cap โฑ๏ธ

they report the previous filter's filtering latency โ€” that's the delay in number of audio samples for audio filters, or number of video frames for video filters.

and when the input stream ends? the filter reports the min and max measured latency for the previous running filter in the filtergraph. cute, right? ๐ŸŽ€


๐Ÿ“ metadata, ametadata

these two manipulate frame metadata, iykyk. they accept the following options:

  • mode โ€” sets the mode of operation of the filter. can be one of these:
    • select โ€” if both value and key are set, it selects frames that have such metadata. if only key is set, it selects every frame that has such key in its metadata.
    • add โ€” adds new metadata key and value. if the key is already available, do nothing (respect the existing, queen).
    • modify โ€” modifies the value of an already present key.
    • delete โ€” if value is set, deletes only keys that have such value. otherwise, deletes the key. and if key isn't set at all? deletes all metadata values in the frame. brutal but valid ๐Ÿ’€
    • print โ€” prints the key and its value if metadata was found. if key isn't set, it prints all metadata values available in the frame.
  • key โ€” sets the key used with all modes. must be set for all modes except print and delete.
  • value โ€” sets the metadata value that will be used. this option is mandatory for modify and add mode. no skipping it โœจ
  • function โ€” which function to use when comparing metadata value and value. can be one of the following:
    • same_str โ€” values are interpreted as strings, returns true if the metadata value is the same as value.
    • starts_with โ€” values are interpreted as strings, returns true if the metadata value starts with the value option string.
    • less โ€” values are interpreted as floats, returns true if the metadata value is less than value.
    • equal โ€” values are interpreted as floats, returns true if value is equal with the metadata value.
    • greater โ€” values are interpreted as floats, returns true if the metadata value is greater than value.
    • expr โ€” values are interpreted as floats, returns true if the expression from the expr option evaluates to true.
    • ends_with โ€” values are interpreted as strings, returns true if the metadata value ends with the value option string.
  • expr โ€” sets the expression used when function is set to expr. the expression is evaluated through the eval API and can contain the following constants:
    • VALUE1, FRAMEVAL โ€” float representation of value from the metadata key.
    • VALUE2, USERVAL โ€” float representation of value as supplied by the user in the value option.
  • file โ€” if specified in print mode, output is written to the named file. instead of a plain filename, any writable URL can be specified. the filename - is a shorthand for standard output. if the file option is not set, output is written to the log with AV_LOG_INFO loglevel.
  • direct โ€” reduces buffering in print mode when output is written to a URL set using file.

๐ŸŒธ Examples ๐ŸŒธ

  • print all metadata values for frames with key lavfi.signalstats.YDIF with values between 0 and 1:
signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'
  • print silencedetect output to the file metadata.txt:
silencedetect,ametadata=mode=print:file=metadata.txt
  • direct all metadata to a pipe with file descriptor 4 (the escape is doing the lords work here ๐Ÿ™ˆ):
metadata=mode=print:file='pipe\:4'

๐Ÿ’œ perms, aperms

these set read/write permissions for the output frames. they're mainly aimed at developers to test the direct path in the following filter in the filtergraph โ€” so if that's not you, hi bestie, keep scrolling ๐Ÿซถ

the filters accept the following options:

  • mode โ€” selects the permissions mode. it accepts the following values:
    • none โ€” do nothing. this is the default.
    • ro โ€” set all the output frames read-only.
    • rw โ€” set all the output frames directly writable.
    • toggle โ€” make the frame read-only if it's writable, and writable if it's read-only. chaos flips ๐Ÿ”
    • random โ€” set each output frame read-only or writable randomly.
  • seed โ€” sets the seed for the random mode, must be an integer included between 0 and UINT32_MAX. if not specified, or if explicitly set to -1, the filter will try to use a good random seed on a best effort basis.
โš ๏ธ note: in case of an auto-inserted filter between the permission filter and the following one, the permission might not be received as expected in that following filter. inserting a format or aformat filter before the perms/aperms filter can avoid this problem. you've been warned, bestie ๐Ÿ’€

๐ŸŒˆ realtime, arealtime

these slow down filtering to match real time approximately โณโœจ

they will pause the filtering for a variable amount of time to match the output rate with the input timestamps. they're similar to the re option to ffmpeg.

they accept the following options:

  • limit โ€” time limit for the pauses. any pause longer than that will be considered a timestamp discontinuity and reset the timer. default is 2 seconds.
  • speed โ€” speed factor for processing. the value must be a float larger than zero. values larger than 1.0 will result in faster than realtime processing, smaller will slow processing down. the limit is automatically adapted accordingly. default is 1.0.
    • and real talk: a processing speed faster than what is possible without these filters cannot be achieved. the math said no ๐Ÿ˜ญ

๐Ÿ‘‘ Commands ๐Ÿ‘‘

both filters support all the above options as commands. go off, control them live ๐Ÿ’…


๐Ÿงš segment, asegment

split a single input stream into multiple streams! this filter does the opposite of the concat filters ๐Ÿฆ‹

segment works on video frames, asegment works on audio samples.

this filter accepts the following options:

  • timestamps โ€” timestamps of output segments separated by '|'. the first segment will run from the beginning of the input stream. the last segment will run until the end of the input stream.
  • frames, samples โ€” exact frame/sample count to split the segments.

in all cases, prefixing each segment with '+' will make it relative to the previous segment. cute little offsets ๐Ÿ’–

โญ Examples โญ

  • split the input audio stream into three output audio streams: starting at the start of the input audio stream and storing that in the 1st output audio stream, then following at the 60th second and storing that in the 2nd output audio stream, and last after the 150th second of the input audio stream, stored in the 3rd output audio stream:
asegment=timestamps="60|150"

๐ŸŽ€ select, aselect

select frames to pass in the output. the main character filter of filtering, honestly ๐Ÿ‘‘

this filter accepts the following options:

  • expr, e โ€” set the expression, which is evaluated for each input frame.
    • if the expression is evaluated to zero, the frame is discarded. bye bestie ๐Ÿ‘‹
    • if the evaluation result is negative or NaN, the frame is sent to the first output; otherwise it's sent to the output with index ceil(val)-1, assuming 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. math slay ๐Ÿ’…
  • 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 โš ๏ธ like fr, don't.
  • 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's 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.
  • concatdec_select โ€” this lil variable is -1 when the frame's pts is at least start_time and either the duration metadata is missing or the frame pts is less than start_time + duration. It's 0 otherwise, and it's NaN if the start_time metadata is missing. ๐Ÿซถ

Basically what that means: an input frame gets selected if its pts lands inside the interval set by the concat demuxer.

  • iw (video only) โ€” the width of the input video frame, bestie. ๐Ÿ“
  • ih (video only) โ€” the height of the input video frame.
  • view (video only) โ€” the view ID, for multi-view video. ๐Ÿ‘€

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

โœจ Examples โœจ

  • Select every frame in the input:
select

That example above? Same thing as:

select=1
  • Skip all the frames (ghosting the whole video, iconic):
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, no cap. ๐ŸŒธ

  • 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

๐ŸŽ€ sendcmd, asendcmd ๐ŸŽ€

Bestie, these filters send commands to other filters in the filtergraph. They read the commands and pass them along. ๐Ÿ’Œ

sendcmd has to be inserted between two video filters, and asendcmd has to be inserted between two audio filters โ€” but apart from that one rule, they act exactly the same way.

You can hand the command spec over in the filter arguments with the commands option, or drop it in a file and point at it with the filename option.

These filters accept the following options:

  • commands, c โ€” set the commands to be read and then sent to the other filters. ๐Ÿ“
  • filename, f โ€” set the filename of the commands to be read and sent to the other filters.

๐Ÿ“œ Commands syntax ๐Ÿ“œ

A commands description is a whole sequence of interval specifications, and each one carries a list of commands to run when a particular event tied to that interval happens. That event is typically the current frame time entering or leaving a given time interval. โฐ

An interval is specified by this syntax:

<START>[-<END>] <COMMANDS>;

The time interval is set by the START and END times. END is optional and defaults to the maximum time. ๐Ÿ’–

The current frame time counts as being within the specified interval if it's included in the interval [START, END) โ€” meaning the time is greater than or equal to START and lesser than END.

COMMANDS is a sequence of one or more command specifications, separated by ",", all relating to that interval. The syntax of a command specification is:

[<FLAGS>] <TARGET> <COMMAND> <ARG>

FLAGS is optional, and it specifies the type of events relating to the time interval that enable sending the specified command. It must be a non-null sequence of identifier flags separated by "+" or "|" and enclosed between "[" and "]".

The following flags are recognized:

  • enter โ€” the command is sent when the current frame timestamp enters the specified interval. In other words, it's sent when the previous frame timestamp was not in the given interval and the current one is. ๐Ÿšช
  • leave โ€” the command is sent when the current frame timestamp leaves the specified interval. In other words, it's sent when the previous frame timestamp was in the given interval and the current one is not. ๐Ÿšช๐Ÿ’จ
  • expr โ€” the command ARG is interpreted as an expression, and the result of that expression is passed as ARG.

The expression is evaluated through the eval API and can contain the following constants:

  • POS โ€” original position in the file of the frame, or undefined if undefined for the current frame. Deprecated, do not use. โš ๏ธ
  • PTS โ€” the presentation timestamp in input.
  • N โ€” the count of the input frame for video or audio, starting from 0.
  • T โ€” the time in seconds of the current frame.
  • TS โ€” the start time in seconds of the current command interval.
  • TE โ€” the end time in seconds of the current command interval.
  • TI โ€” the interpolated time of the current command interval, TI = (T - TS) / (TE - TS).
  • W โ€” the video frame width.
  • H โ€” the video frame height.

If FLAGS isn't specified, a default value of "[enter]" is assumed. ๐Ÿซถ

TARGET specifies the target of the command โ€” usually the name of the filter class, or a specific filter instance name.

COMMAND specifies the name of the command for the target filter.

ARG is optional and specifies the optional list of arguments for the given COMMAND.

Between one interval specification and another, whitespaces โ€” or sequences of characters starting with "#" until the end of the line โ€” are ignored, and you can use them to annotate comments. ๐Ÿ’ฌ

A simplified BNF description of the commands specification syntax follows:

<COMMAND_FLAG>  ::= "enter" | "leave"
<COMMAND_FLAGS> ::= <COMMAND_FLAG> [(+|"|")<COMMAND_FLAG>]
<COMMAND>       ::= ["[" <COMMAND_FLAGS> "]"] <TARGET> <COMMAND> [<ARG>]
<COMMANDS>      ::= <COMMAND> [,<COMMANDS>]
<INTERVAL>      ::= <START>[-<END>] <COMMANDS>
<INTERVALS>     ::= <INTERVAL>[;<INTERVALS>]

โœจ Examples โœจ

  • Specify audio tempo change at second 4:
asendcmd=c='4.0 atempo tempo 1.5',atempo
  • Target a specific filter instance:
asendcmd=c='4.0 atempo@my tempo 1.5',atempo@my
  • Specify a list of drawtext and hue commands in a file. ๐Ÿ“„
# show text in the interval 5-10
5.0-10.0 [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=hello world',
        [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=';

# desaturate the image in the interval 15-20
15.0-20.0 [enter] hue s 0,
         [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=nocolor',
         [leave] hue s 1,
         [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=color';

# apply an exponential saturation fade-out effect, starting from time 25
25 [enter] hue s exp(25-t)

A filtergraph that lets you read and process the above command list stored in a file test.cmd can be specified with:

sendcmd=f=test.cmd,drawtext=fontfile=FreeSerif.ttf:text='',hue

๐Ÿฆ‹ setpts, asetpts ๐Ÿฆ‹

Change the PTS (presentation timestamp) of the input frames. Like, time itself? We're editing it. Main character energy. โณ

setpts works on video frames, asetpts works on audio frames.

This filter accepts the following options:

  • expr โ€” the expression that gets evaluated for each frame to construct its timestamp.
  • strip_fps (video only) โ€” Boolean option that determines if the original framerate and frame duration metadata gets unset. If you set it to true, be advised that a sane frame rate should be explicitly specified if the output is sent to a constant frame rate muxer. Default is "false". ๐ŸŽฌ

The expression is evaluated through the eval API and can contain the following constants:

  • FRAME_RATE, FR โ€” frame rate, only defined for constant frame-rate video.
  • PTS โ€” the presentation timestamp in input.
  • N โ€” the count of the input frame for video, or the number of consumed samples not including the current frame for audio, starting from 0.
  • NB_CONSUMED_SAMPLES โ€” the number of consumed samples, not including the current frame (only audio).
  • NB_SAMPLES, S โ€” the number of samples in the current frame (only audio).
  • SAMPLE_RATE, SR โ€” the audio sample rate.
  • STARTPTS โ€” the PTS of the first frame.
  • STARTT โ€” the time in seconds of the first frame.
  • INTERLACED โ€” state whether the current frame is interlaced.
  • T โ€” the time in seconds of the current frame.
  • POS โ€” original position in the file of the frame, or undefined if undefined for the current frame; deprecated, do not use. โš ๏ธ
  • PREV_INPTS โ€” the previous input PTS.
  • PREV_INT โ€” previous input time in seconds.
  • PREV_OUTPTS โ€” the previous output PTS.
  • PREV_OUTT โ€” previous output time in seconds.
  • RTCTIME โ€” the wallclock (RTC) time in microseconds. This is deprecated, use time(0) instead.
  • RTCSTART โ€” the wallclock (RTC) time at the start of the movie in microseconds.
  • TB โ€” the timebase of the input timestamps.
  • T_CHANGE โ€” time of the first frame after the command was applied, or time of the first frame if there were no commands. ๐Ÿ•ฐ๏ธ

โœจ Examples โœจ

  • Start counting PTS from zero:
setpts=PTS-STARTPTS
  • Apply fast motion effect:
setpts=0.5*PTS
  • Apply slow motion effect:
setpts=2.0*PTS
  • Set fixed rate of 25 frames per second:
setpts=N/(25*TB)
  • Apply a random jitter effect of +/-100 TB units:
setpts=PTS+randomi(0, -100\,100)
  • Set fixed rate 25 fps with some jitter:
setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
  • Apply an offset of 10 seconds to the input PTS:
setpts=PTS+10/TB
  • Generate timestamps from a "live source" and rebase onto the current timebase:
setpts='(RTCTIME - RTCSTART) / (TB * 1000000)'
  • Generate timestamps by counting samples:
asetpts=N/SR/TB

๐ŸŽ€ Commands ๐ŸŽ€

Both filters support all the above options as commands. ๐Ÿ’…


๐ŸŒˆ setrange ๐ŸŒˆ

Force the color range for the output video frame.

The setrange filter marks the color range property for the output frames. It does not change the input frame โ€” it only sets the corresponding property, which affects how the frame gets treated by the following filters. ๐Ÿ”ฅ

The filter accepts the following options:

  • range โ€” which colour range are we claiming for this thing? the options are:
    • auto โ€” keep the same color range property, like, don't touch it, let it vibe as-is ๐Ÿ’…
    • unspecified, unknown โ€” set the color range as unspecified (mystery era ๐ŸŽ€)
    • limited, tv, mpeg โ€” set the color range as limited
    • full, pc, jpeg โ€” set the color range as full

๐Ÿ•ฐ๏ธ settb, asettb

Sets the timebase to use for the output frames' timestamps. Honestly it's mostly a testing-era filter โ€” like, it's mainly useful for testing timebase configuration ๐Ÿ”ฅ so don't come for it.

It accepts the following parameters:

  • expr, tb โ€” the expression which gets evaluated into the output timebase โœจ

So the value for tb is an arithmetic expression representing a rational. That expression can contain the constants "AVTB" (the default timebase), "intb" (the input timebase) and "sr" (the sample rate, audio only bestie ๐ŸŽง). Default value is "intb".

๐Ÿ’ซ Examples

  • Set the timebase to 1/25:
settb=expr=1/25
  • Set the timebase to 1/10:
settb=expr=0.1
  • Set the timebase to 1001/1000:
settb=1+0.001
  • Set the timebase to 2*intb:
settb=2*intb
  • Set the default timebase value:
settb=AVTB

๐ŸŒˆ showcqt

okay this one is iconic. It converts input audio to a video output representing the frequency spectrum logarithmically, using the Brown-Puckette constant Q transform algorithm with direct frequency domain coefficient calculation โ€” and yes, before you @ me, the transform itself is not really constant Q, instead the Q factor is actually variable/clamped ๐Ÿ˜ญ โ€” with a musical tone scale, from E0 all the way up to D#10. periodt.

The filter accepts the following options:

  • size, s โ€” specify the video size for the output. It must be even (fr fr, even). For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "1920x1080".
  • fps, rate, r โ€” set the output frame rate. Default value is 25.
  • bar_h โ€” set the bargraph height. It must be even. Default value is -1, which computes the bargraph height automatically โœจ
  • axis_h โ€” set the axis height. It must be even. Default value is -1, which computes the axis height automatically ๐ŸŽ€
  • sono_h โ€” set the sonogram height. It must be even. Default value is -1, which computes the sonogram height automatically ๐Ÿฆ‹
  • fullhd โ€” set the fullhd resolution. โš ๏ธ This option is deprecated, use size, s instead. Default value is 1.
  • sono_v, volume โ€” specify the sonogram volume expression. It can contain variables:
    • bar_v โ€” the bar_v evaluated expression
    • frequency, freq, f โ€” the frequency where it is evaluated
    • timeclamp, tc โ€” the value of timeclamp option

...and functions:

  • a_weighting(f) โ€” A-weighting of equal loudness
  • b_weighting(f) โ€” B-weighting of equal loudness
  • c_weighting(f) โ€” C-weighting of equal loudness.

Default value is 16.

  • bar_v, volume2 โ€” specify the bargraph volume expression. It can contain variables:
    • sono_v โ€” the sono_v evaluated expression
    • frequency, freq, f โ€” the frequency where it is evaluated
    • timeclamp, tc โ€” the value of timeclamp option

...and functions:

  • a_weighting(f) โ€” A-weighting of equal loudness
  • b_weighting(f) โ€” B-weighting of equal loudness
  • c_weighting(f) โ€” C-weighting of equal loudness.

Default value is "sono_v".

  • sono_g, gamma โ€” specify the sonogram gamma. Lower gamma makes the spectrum more contrast, higher gamma makes the spectrum having more range. Default value is 3. Acceptable range is "[1, 7]".
  • bar_g, gamma2 โ€” specify the bargraph gamma. Default value is 1. Acceptable range is "[1, 7]".
  • bar_t โ€” specify the bargraph transparency level. Lower value makes the bargraph sharper. Default value is 1. Acceptable range is "[0, 1]".
  • timeclamp, tc โ€” specify the transform timeclamp. here's the tea โ˜•: at low frequency, there's a trade-off between accuracy in the time domain and the frequency domain. If timeclamp is lower, events in the time domain are represented more accurately (such as fast bass drum ๐Ÿฅ), otherwise events in the frequency domain are represented more accurately (such as bass guitar ๐ŸŽธ). Acceptable range is "[0.002, 1]". Default value is 0.17.
  • attack โ€” set attack time in seconds. The default is 0 (disabled). Otherwise, it limits future samples by applying asymmetric windowing in the time domain, useful when low latency is required. Accepted range is "[0, 1]".
  • basefreq โ€” specify the transform base frequency. Default value is 20.01523126408007475, which is frequency 50 cents below E0. Acceptable range is "[10, 100000]".
  • endfreq โ€” specify the transform end frequency. Default value is 20495.59681441799654, which is frequency 50 cents above D#10. Acceptable range is "[10, 100000]".
  • coeffclamp โ€” โš ๏ธ This option is deprecated and ignored. it's giving ghost of options past ๐Ÿ’€
  • tlength โ€” specify the transform length in the time domain. Use this option to control the accuracy trade-off between the time domain and the frequency domain at every frequency sample. It can contain variables:
    • frequency, freq, f โ€” the frequency where it is evaluated
    • timeclamp, tc โ€” the value of timeclamp option.

Default value is "384*tc/(384+tc*f)".

  • count โ€” specify the transform count for every video frame. Default value is 6. Acceptable range is "[1, 30]".
  • fcount โ€” specify the transform count for every single pixel. Default value is 0, which makes it computed automatically. Acceptable range is "[0, 10]".
  • fontfile โ€” specify font file for use with freetype to draw the axis. If not specified, use embedded font. ๐Ÿ“Œ Note that drawing with a font file or embedded font is not implemented with custom basefreq and endfreq โ€” use the axisfile option instead.
  • font โ€” specify fontconfig pattern. This has lower priority than fontfile. The ":" in the pattern may be replaced by "|" to avoid unnecessary escaping. iykyk ๐Ÿ˜Œ
  • fontcolor โ€” specify font color expression. This is an arithmetic expression that should return integer value 0xRRGGBB. It can contain variables:
    • frequency, freq, f โ€” the frequency where it is evaluated
    • timeclamp, tc โ€” the value of timeclamp option

...and functions:

  • midi(f) โ€” midi number of frequency f, some midi numbers: E0(16), C1(24), C2(36), A4(69)
  • r(x), g(x), b(x) โ€” red, green, and blue value of intensity x.

Default value is "st(0, (midi(f)-59.5)/12); st(1, if(between(ld(0),0,1), 0.5-0.5*cos(2*PI*ld(0)), 0)); r(1-ld(1)) + b(ld(1))".

  • axisfile โ€” specify image file to draw the axis. This option overrides the fontfile and fontcolor options. main character energy ๐Ÿ‘‘
  • axis, text โ€” enable/disable drawing text to the axis. If it is set to 0, drawing to the axis is disabled, ignoring the fontfile and axisfile options. Default value is 1.
  • csp โ€” set colorspace. The accepted values are:
    • unspecified โ€” unspecified (default)
    • bt709 โ€” BT.709
    • fcc โ€” FCC
    • bt470bg โ€” BT.470BG or BT.601-6 625
    • smpte170m โ€” SMPTE-170M or BT.601-6 525
    • smpte240m โ€” SMPTE-240M
    • bt2020ncl โ€” BT.2020 with non-constant luminance
  • cscheme โ€” set spectrogram color scheme. This is a list of floating point values with format "left_r|left_g|left_b|right_r|right_g|right_b". The default is "1|0.5|0|0|0.5|1". ๐ŸŒˆ

๐Ÿ’– Examples

  • Playing audio while showing the spectrum:
ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt [out0]'
  • Same as above, but with frame rate 30 fps:
ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt=fps=30:count=5 [out0]'
  • Playing at 1280x720:
ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt=s=1280x720:count=4 [out0]'
  • Disable sonogram display:
sono_h=0
  • A1 and its harmonics: A1, A2, (near)E3, A3:
ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t),
                 asplit[a][out1]; [a] showcqt [out0]'
  • Same as above, but with more accuracy in frequency domain:
ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t),
                 asplit[a][out1]; [a] showcqt=timeclamp=0.5 [out0]'
  • Custom volume:
bar_v=10:sono_v=bar_v*a_weighting(f)
  • Custom gamma, now spectrum is linear to the amplitude.
bar_g=2:sono_g=2
  • Custom tlength equation:
tc=0.33:tlength='st(0,0.17); 384*tc / (384 / ld(0) + tc*f /(1-ld(0))) + 384*tc / (tc*f / ld(0) + 384 /(1-ld(0)))'
  • Custom fontcolor and fontfile, C-note is colored green, others are colored blue:
fontcolor='if(mod(floor(midi(f)+0.5),12), 0x0000FF, g(1))':fontfile=myfont.ttf
  • Custom font using fontconfig:
font='Courier New,Monospace,mono|bold'
  • Custom frequency range with custom axis using image file:
axisfile=myaxis.png:basefreq=40:endfreq=10000

๐Ÿฆ‹ showcwt

Converts input audio to a video output representing the frequency spectrum using Continuous Wavelet Transform and the Morlet wavelet ๐ŸŒŠโœจ (yes the spelling really is "Morlet", we respect the wavelet).

The filter accepts the following options:

  • size, s โ€” specify the video size for the output. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "640x512".
  • rate, r โ€” set the output frame rate. Default value is 25.
  • scale โ€” set the frequency scale used. Allowed values are:
    • linear
    • log
    • bark
    • mel
    • erbs
    • sqrt
    • cbrt
    • qdrt
    • fm

Default value is "linear".

  • iscale โ€” set the intensity scale used. Allowed values are:
    • linear
    • log
    • sqrt
    • cbrt
    • qdrt

Default value is "log".

  • min โ€” set the minimum frequency that will be used in output. Default is 20 Hz.
  • max โ€” set the maximum frequency that will be used in output. Default is 20000 Hz. โš ๏ธ the real frequency upper limit depends on the input audio's sample rate, and such will be enforced on this value when it is set to a value greater than the Nyquist frequency.
  • imin โ€” set the minimum intensity that will be used in output.
  • imax โ€” set the maximum intensity that will be used in output.
  • logb โ€” sets the logarithmic basis for brightness strength when the filter maps calculated magnitude values โ†’ pixel values. Allowed range is 0 to 1. Default is 0.0001. ๐Ÿ’ซ
  • deviation โ€” sets the frequency deviation. Values lower than 1 are more frequency-oriented, higher than 1 are more time-oriented. Allowed range is 0 to 10. Default is 1.
  • pps โ€” sets the number of pixel output per each second in one row. Allowed range is 1 to 1024. Default is 64.
  • mode โ€” sets the output visual mode. Allowed values are:
    • magnitude โ€” show magnitude.
    • phase โ€” show only phase.
    • magphase โ€” show a combination of magnitude and phase. Magnitude is mapped to brightness and phase to color. ๐ŸŒˆ
    • channel โ€” show a unique color per channel magnitude.
    • stereo โ€” show a unique color per stereo difference.
    • Default value is "magnitude".
  • slide โ€” sets the output slide method. Allowed values are:
    • replace
    • scroll
    • frame
  • direction โ€” sets the direction method for the output slide method. Allowed values are:
    • lr โ€” direction from left to right.
    • rl โ€” direction from right to left.
    • ud โ€” direction from up to down.
    • du โ€” direction from down to up.
  • bar โ€” sets the ratio of bargraph display to display size. Default is 0.
  • rotation โ€” sets color rotation, must be in the [-1.0, 1.0] range. Default value is 0.

๐ŸŒŠ showfreqs

Converts input audio into a video output that represents the audio power spectrum, bestie. Audio amplitude goes on the Y-axis while frequency is on the X-axis. Slay. ๐Ÿ“Š

The filter accepts the following options:

  • size, s โ€” specify the size of the video. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default is "1024x512".
  • rate, r โ€” set the video rate. Default is 25.
  • mode โ€” set the display mode. This sets how each frequency bin gets represented. It accepts the following values:
    • line
    • bar
    • dot
    • Default is "bar".
  • ascale โ€” set the amplitude scale. It accepts the following values:
    • lin โ€” linear scale.
    • sqrt โ€” square root scale.
    • cbrt โ€” cubic root scale.
    • log โ€” logarithmic scale.
    • Default is "log".
  • fscale โ€” set the frequency scale. It accepts the following values:
    • lin โ€” linear scale.
    • log โ€” logarithmic scale.
    • rlog โ€” reverse logarithmic scale.
    • Default is "lin".
  • win_size โ€” set the window size. Allowed range is from 16 to 65536. Default is 2048.
  • win_func โ€” set the windowing function. It accepts the following values: rect, bartlett, hanning, hamming, blackman, welch, flattop, bharris, bnuttall, bhann, sine, nuttall, lanczos, gauss, tukey, dolph, cauchy, parzen, poisson, bohman, kaiser. Default is "hanning". ๐ŸชŸ
  • overlap โ€” set the window overlap. In range [0, 1]. Default is 1, which means the optimal overlap for the selected window function will be picked. (Yes, "optimal" overlap being the default is such a mood.)
  • averaging โ€” set the time averaging. Setting this to 0 will display current maximal peaks. Default is 1, which means time averaging is disabled. ๐Ÿ™ˆ
  • colors โ€” specify a list of colors separated by a space or by '|' which will be used to draw channel frequencies. Unrecognized or missing colors will be replaced by white color.
  • cmode โ€” set the channel display mode. It accepts the following values:
    • combined
    • separate
    • Default is "combined".
  • minamp โ€” set the minimum amplitude used in the log amplitude scaler.
  • data โ€” set the data display mode. It accepts the following values:
    • magnitude
    • phase
    • delay
    • Default is "magnitude".
  • channels โ€” set the channels to use when processing audio. By default all are processed. ๐Ÿ’œ

๐Ÿฆ‹ showspatial

Converts stereo input audio into a video output, representing the spatial relationship between the two channels. It's giving "vibe check but make it geometry."

The filter accepts the following options:

  • size, s โ€” specify the video size for the output. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "512x512".
  • win_size โ€” set the window size. Allowed range is from 1024 to 65536. Default size is 4096.
  • win_func โ€” set the window function. It accepts the following values: rect, bartlett, hann, hanning, hamming, blackman, welch, flattop, bharris, bnuttall, bhann, sine, nuttall, lanczos, gauss, tukey, dolph, cauchy, parzen, poisson, bohman, kaiser. Default value is "hann".
  • rate, r โ€” set the output framerate.

๐ŸŒˆ showspectrum

Converts input audio into a video output, representing the audio frequency spectrum. This one is the icon, honestly. โœจ

The filter accepts the following options:

  • size, s โ€” specify the video size for the output. For the syntax of this option, check the "Video size" section in the ffmpeg-utils manual. Default value is "640x512".
  • slide โ€” specify how the spectrum should slide along the window. It accepts the following values:
    • replace โ€” the samples start again on the left when they reach the right.
    • scroll โ€” the samples scroll from right to left.
    • fullframe โ€” frames are only produced when the samples reach the right.
    • rscroll โ€” the samples scroll from left to right.
    • lreplace โ€” the samples start again on the right when they reach the left.
    • Default value is "replace".
  • mode โ€” specify the display mode. It accepts the following values:
    • combined โ€” all channels are displayed in the same row.
    • separate โ€” all channels are displayed in separate rows.
    • Default value is combined.
  • color โ€” specify the display color mode. It accepts the following values:
    • channel โ€” each channel is displayed in a separate color.
    • intensity โ€” each channel is displayed using the same color scheme.
    • rainbow โ€” each channel is displayed using the rainbow color scheme.
    • moreland โ€” each channel is displayed using the moreland color scheme.
    • nebulae โ€” each channel is displayed using the nebulae color scheme.
    • fire โ€” each channel is displayed using the fire color scheme.
    • fiery โ€” each channel is displayed using the fiery color scheme.
    • fruit โ€” each channel is displayed using the fruit color scheme.
    • cool โ€” each channel is displayed using the cool color scheme.
    • magma โ€” each channel is displayed using the magma color scheme.
    • green โ€” each channel is displayed using the green color scheme.
    • viridis โ€” each channel is displayed using the viridis color scheme.
    • plasma โ€” each channel is displayed using the plasma color scheme.
    • cividis โ€” each channel is displayed using the cividis color scheme.
    • terrain โ€” each channel is displayed using the terrain color scheme.
    • Default value is channel.
  • scale โ€” specify the scale used for calculating intensity color values. It accepts the following values:
    • lin โ€” linear.
    • sqrt โ€” square root, default.
    • cbrt โ€” cubic root.
    • log โ€” logarithmic.
    • 4thrt โ€” 4th root.
    • 5thrt โ€” 5th root.
    • Default value is sqrt.
  • fscale โ€” specify the frequency scale. It accepts the following values:
    • lin โ€” linear.
    • log โ€” logarithmic.
    • Default value is lin.
  • saturation โ€” set the saturation modifier for displayed colors. Negative values provide an alternative color scheme. 0 is no saturation at all. Saturation must be in the [-10.0, 10.0] range. Default value is 1. ๐ŸŽ€
  • win_func โ€” set the window function. It accepts the following values: rect, bartlett, hann, hanning, hamming, blackman, welch, flattop, bharris, bnuttall, bhann, sine, nuttall, lanczos, gauss, tukey, dolph, cauchy, parzen, poisson, bohman, kaiser. Default value is "hann".
  • orientation โ€” set the orientation of the time vs frequency axis. Can be "vertical" or "horizontal". Default is "vertical".
  • overlap โ€” set the ratio of the overlap window. Default value is 0. When the value is 1, overlap is set to the recommended size for the specific window function currently used.
  • gain โ€” set the scale gain for calculating intensity color values. Default value is 1.
  • data โ€” set which data to display. Can be "magnitude", default, or "phase", or unwrapped phase: "uphase".
  • rotation โ€” set color rotation, must be in the [-1.0, 1.0] range. Default value is 0.
  • start โ€” set the start frequency from which to display the spectrogram. Default is 0.
  • stop โ€” set the stop frequency to which to display the spectrogram. Default is 0.
  • fps โ€” set the upper frame rate limit. Default is "auto", unlimited.
  • legend โ€” draw time and frequency axes and legends. Default is disabled.
  • drange โ€” set the dynamic range used to calculate intensity color values. Default is 120 dBFS. Allowed range is from 10 to 200.
  • limit โ€” set the upper limit of input audio samples volume in dBFS. Default is 0 dBFS. Allowed range is from -100 to 100.
  • opacity โ€” set the opacity strength when using pixel format output with an alpha component.
The usage is very similar to the showwaves filter; see the examples in that section. ๐Ÿ’–

๐ŸŒธ Examples

  • Large window with logarithmic color scaling:
showspectrum=s=1280x480:scale=log
  • Complete example for a colored and sliding spectrum per channel using ffplay:
ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1];
             [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]'

๐Ÿ‘‘ showspectrumpic

Converts input audio into a single video frame, representing the audio frequency spectrum. One frame. One masterpiece. No cap. ๐Ÿ–ผ๏ธ

The filter accepts the following options:

  • size, s โ€” set the output video size. For the syntax, check the "Video size" section in the ffmpeg-utils manual. Default value is 4096x2048. ๐ŸŽ€
  • mode โ€” pick the display mode. It accepts:
    • combined โ€” all channels are displayed in the same row.
    • separate โ€” all channels are displayed in separate rows. Default value is combined.
  • color โ€” pick the display color mode. It accepts:
    • channel โ€” each channel is displayed in a separate color.
    • intensity โ€” each channel is displayed using the same color scheme.
    • rainbow โ€” each channel is displayed using the rainbow color scheme.
    • moreland โ€” each channel is displayed using the moreland color scheme.
    • nebulae โ€” each channel is displayed using the nebulae color scheme.
    • fire โ€” each channel is displayed using the fire color scheme.
    • fiery โ€” each channel is displayed using the fiery color scheme.
    • fruit โ€” each channel is displayed using the fruit color scheme.
    • cool โ€” each channel is displayed using the cool color scheme.
    • magma โ€” each channel is displayed using the magma color scheme.
    • green โ€” each channel is displayed using the green color scheme.
    • viridis โ€” each channel is displayed using the viridis color scheme.
    • plasma โ€” each channel is displayed using the plasma color scheme.
    • cividis โ€” each channel is displayed using the cividis color scheme.
    • terrain โ€” each channel is displayed using the terrain color scheme. Default value is intensity.
  • scale โ€” set the scale used for calculating intensity color values. It accepts:
    • lin โ€” linear.
    • sqrt โ€” square root, default.
    • cbrt โ€” cubic root.
    • log โ€” logarithmic.
    • 4thrt โ€” 4th root.
    • 5thrt โ€” 5th root. Default value is log.
  • fscale โ€” set the frequency scale. It accepts lin (linear) and log (logarithmic). Default value is lin.
  • saturation โ€” set the saturation modifier for displayed colors. Negative values provide an alternative color scheme. 0 is no saturation at all. Saturation must be in [-10.0, 10.0] range. Default value is 1.
  • win_func โ€” set the window function. It accepts rect, bartlett, hann, hanning, hamming, blackman, welch, flattop, bharris, bnuttall, bhann, sine, nuttall, lanczos, gauss, tukey, dolph, cauchy, parzen, poisson, bohman, kaiser. Default value is "hann".
  • orientation โ€” set the orientation of the time vs frequency axis. Can be "vertical" or "horizontal". Default is "vertical".
  • gain โ€” set the scale gain for calculating intensity color values. Default value is 1.
  • legend โ€” draw time and frequency axes and legends. Default is enabled.
  • rotation โ€” set color rotation, must be in [-1.0, 1.0] range. Default value is 0.
  • start โ€” set the start frequency from which to display the spectrogram. Default is 0.
  • stop โ€” set the stop frequency to which to display the spectrogram. Default is 0.
  • drange โ€” set the dynamic range used to calculate intensity color values. Default is 120 dBFS. Allowed range is from 10 to 200.
  • limit โ€” set the upper limit of input audio samples volume in dBFS. Default is 0 dBFS. Allowed range is from -100 to 100.
  • opacity โ€” set opacity strength when using pixel format output with alpha component. ๐Ÿ’…

Examples

  • Extract an audio spectrogram of a whole audio track in a 1024x1024 picture using ffmpeg:
ffmpeg -i audio.flac -lavfi showspectrumpic=s=1024x1024 spectrogram.png

๐Ÿ”Š showvolume

Convert input audio volume to a video output. It has these options, bestie:

  • rate, r โ€” set video rate.
  • b โ€” set border width, allowed range is [0, 5]. Default is 1.
  • w โ€” set channel width, allowed range is [80, 8192]. Default is 400.
  • h โ€” set channel height, allowed range is [1, 900]. Default is 20.
  • f โ€” set fade, allowed range is [0, 1]. Default is 0.95.
  • c โ€” set volume color expression. The expression can use these variables:
    • VOLUME โ€” current max volume of channel in dB.
    • PEAK โ€” current peak.
    • CHANNEL โ€” current channel number, starting from 0.
  • t โ€” if set, displays channel names. Default is enabled.
  • v โ€” if set, displays volume values. Default is enabled.
  • o โ€” set orientation, can be horizontal: "h" or vertical: "v", default is "h".
  • s โ€” set step size, allowed range is [0, 5]. Default is 0, which means step is disabled.
  • p โ€” set background opacity, allowed range is [0, 1]. Default is 0.
  • m โ€” set metering mode, can be peak: "p" or rms: "r", default is "p".
  • ds โ€” set display scale, can be linear: "lin" or log: "log", default is "lin".
  • dm โ€” in seconds. If set to > 0., display a line for the max level in the previous seconds. Default is disabled: 0.
  • dmc โ€” the color of the max line. Use when dm option is set to > 0. Default is: "orange". ๐ŸŠ

๐ŸŒŠ showwaves

Convert input audio to a video output, representing the samples waves. It accepts these options:

  • size, s โ€” set the output video size. For the syntax, check the "Video size" section in the ffmpeg-utils manual. Default value is 600x240.
  • mode โ€” set display mode. Available values are:
    • point โ€” draw a point for each sample.
    • line โ€” draw a vertical line for each sample.
    • p2p โ€” draw a point for each sample and a line between them.
    • cline โ€” draw a centered vertical line for each sample. Default value is "point".
  • n โ€” set the number of samples which are printed on the same column. A larger value will decrease the frame rate. Must be a positive integer. This option can be set only if the value for rate is not explicitly specified.
  • rate, r โ€” set the (approximate) output frame rate. This is done by setting the option n. Default value is "25".
  • split_channels โ€” set if channels should be drawn separately or overlap. Default value is 0.
  • colors โ€” set colors separated by '|' which are going to be used for drawing of each channel.
  • scale โ€” set amplitude scale. Available values are:
    • lin โ€” linear.
    • log โ€” logarithmic.
    • sqrt โ€” square root.
    • cbrt โ€” cubic root. Default is linear.
  • draw โ€” set the draw mode. This is mostly useful to set for high n. Available values are:
    • scale โ€” scale pixel values for each drawn sample.
    • full โ€” draw every sample directly. Default value is "scale".

Examples

  • Output the input file audio and the corresponding video representation at the same time:
amovie=a.mp3,asplit[out0],showwaves[out1]
  • Create a synthetic signal and show it with showwaves, forcing a frame rate of 30 frames per second:
aevalsrc=sin(1*2*PI*t)*sin(880*2*PI*t):cos(2*PI*200*t),asplit[out0],showwaves=r=30[out1]

๐Ÿ–ผ๏ธ showwavespic

Convert input audio to a single video frame, representing the samples waves. This filter accepts these options:

  • size, s โ€” set the output video size. For the syntax, check the "Video size" section in the ffmpeg-utils manual. Default value is 600x240.
  • split_channels โ€” set if channels should be drawn separately or overlap. Default value is 0.
  • colors โ€” set colors separated by '|' which are going to be used for drawing of each channel.
  • scale โ€” set amplitude scale. Available values are:
    • lin โ€” linear.
    • log โ€” logarithmic.
    • sqrt โ€” square root.
    • cbrt โ€” cubic root. Default is linear.
  • draw โ€” set the draw mode. Available values are:
    • scale โ€” scale pixel values for each drawn sample.
    • full โ€” draw every sample directly. Default value is "scale".
  • filter โ€” set the filter mode. Available values are:
    • average โ€” use average samples values for each drawn sample.
    • peak โ€” use peak samples values for each drawn sample. Default value is "average".

Examples

  • Extract a channel split representation of the wave form of a whole audio track in a 1024x800 picture using ffmpeg:
ffmpeg -i audio.flac -lavfi showwavespic=split_channels=1:s=1024x800 waveform.png

๐Ÿงผ sidedata, asidedata

Delete frame side data, or select frames based on it. This filter accepts these options:

  • mode โ€” set mode of operation of the filter. Can be one of the following:
    • select โ€” select every frame with side data of "type".
    • delete โ€” delete side data of "type". If "type" is not set, delete all side data in the frame.
  • type โ€” set side data type used with all modes. Must be set for "select" mode. Possible values are PANSCAN, A53_CC, STEREO3D, MATRIXENCODING, DOWNMIX_INFO, REPLAYGAIN, DISPLAYMATRIX, AFD, MOTION_VECTORS, SKIP_SAMPLES, AUDIO_SERVICE_TYPE, MASTERING_DISPLAY_METADATA, GOP_TIMECODE, SPHERICAL, CONTENT_LIGHT_LEVEL, ICC_PROFILE, S12M_TIMECODE, DYNAMIC_HDR_PLUS, REGIONS_OF_INTEREST, VIDEO_ENC_PARAMS, SEI_UNREGISTERED, FILM_GRAIN_PARAMS, DETECTION_BOUNDING_BOXES, DETECTION_BBOXES, DOVI_RPU_BUFFER, DOVI_METADATA, DYNAMIC_HDR_VIVID, AMBIENT_VIEWING_ENVIRONMENT, VIDEO_HINT. โœจ

๐ŸŒˆ spectrumsynth

Synthesize audio from 2 input video spectrums, first input stream represents magnitude across time and second represents phase across time. The filter will transform from frequency domain as displayed in videos back to time domain as presented in audio output. ๐Ÿ’–

Like, this filter is lowkey built for reversing processed showspectrum outputs, but it can also synthesize sound from other spectrograms too ๐ŸŽง โ€” just know that in that case the results are gonna be poor if the phase data isn't available, because then the phase data has to be recreated, and usually it's just recreated from random noise ๐Ÿ˜ญ. For the best results, bestie, use gray-only output (the channel color mode in the showspectrum filter) plus the log scale for the magnitude video and the lin scale for the phase video. To produce phase, for the 2nd video, use the data option. And the input videos should generally use the fullframe slide mode since that saves the resources you need for decoding video. Slay. โœจ

The filter accepts the following options:

  • sample_rate โ€” set the sample rate of the output audio, because the sample rate of the audio the spectrum was generated from may differ ๐Ÿ‘€
  • channels โ€” set the number of channels represented in the input video spectrums
  • scale โ€” set the scale that was used when generating the magnitude input spectrum. Can be lin or log. Default is log ๐Ÿ“
  • slide โ€” set the slide that was used when generating the inputs spectrums. Can be replace, scroll, fullframe or rscroll. Default is fullframe
  • win_func โ€” set the window function used for resynthesis
  • overlap โ€” set the window overlap. In range [0, 1]. Default is 1, which means the optimal overlap for the selected window function will be picked ๐Ÿ’…
  • orientation โ€” set the orientation of the input videos. Can be vertical or horizontal. Default is vertical

๐ŸŒธ Examples ๐ŸŒธ

  • First create magnitude and phase videos from audio (assuming the audio is stereo with a 44100 sample rate), then resynthesize the videos back to audio with spectrumsynth:
ffmpeg -i input.flac -lavfi showspectrum=mode=separate:scale=log:overlap=0.875:color=channel:slide=fullframe:data=magnitude -an -c:v rawvideo magnitude.nut
ffmpeg -i input.flac -lavfi showspectrum=mode=separate:scale=lin:overlap=0.875:color=channel:slide=fullframe:data=phase -an -c:v rawvideo phase.nut
ffmpeg -i magnitude.nut -i phase.nut -lavfi spectrumsynth=channels=2:sample_rate=44100:win_func=hann:overlap=0.875:slide=fullframe output.flac

โœ‚๏ธ split, asplit โœ‚๏ธ

Split the input into several identical outputs. Iconic behavior, honestly ๐Ÿซถ

asplit works with audio input, split with video.

The filter accepts a single parameter which specifies the number of outputs. If you don't specify it, it defaults to 2.

๐ŸŽ€ Examples ๐ŸŽ€

  • Create two separate outputs from the same input:
[in] split [out0][out1]
  • To create 3 or more outputs, you need to specify the number of outputs, like in:
[in] asplit=3 [out0][out1][out2]
  • Create two separate outputs from the same input, one cropped and one padded:
[in] split [splitout1][splitout2];
[splitout1] crop=100:100:0:0    [cropout];
[splitout2] pad=200:200:100:100 [padout];
  • Create 5 copies of the input audio with ffmpeg:
ffmpeg -i INPUT -filter_complex asplit=5 OUTPUT

๐Ÿ“ก zmq, azmq ๐Ÿ“ก

Receive commands sent through a libzmq client, and forward them to filters in the filtergraph. It's giving remote control for your filtergraph, no cap ๐Ÿ”ฅ

zmq and azmq work as pass-through filters. zmq must be inserted between two video filters, azmq between two audio filters. Both are capable of sending messages to any filter type.

To enable these filters you need to install the libzmq library and headers and configure FFmpeg with --enable-libzmq.

For more information about libzmq see: http://www.zeromq.org/

The zmq and azmq filters work as a libzmq server, which receives messages sent through a network interface defined by the bind_address (or the abbreviation b) option. The default value of this option is tcp://localhost:5555. You may want to alter this value to your needs, but do not forget to escape any : signs (see filtergraph escaping) ๐Ÿ˜ค

The received message must be in the form:

<TARGET> <COMMAND> [<ARG>]

TARGET specifies the target of the command, usually the name of the filter class or a specific filter instance name. The default filter instance name uses the pattern Parsed_<filter_name>_<index>, but you can override this by using the filter_name@id syntax (see Filtergraph syntax).

COMMAND specifies the name of the command for the target filter.

ARG is optional and specifies the optional argument list for the given COMMAND.

Upon reception, the message is processed and the corresponding command is injected into the filtergraph. Depending on the result, the filter will send a reply to the client, adopting the format:

<ERROR_CODE> <ERROR_REASON>
<MESSAGE>

MESSAGE is optional.

๐Ÿ’œ Examples ๐Ÿ’œ

Look at tools/zmqsend for an example of a zmq client which can be used to send commands processed by these filters.

Consider the following filtergraph generated by ffplay. In this example the last overlay filter has an instance name. All the other filters will have default instance names.

ffplay -dumpgraph 1 -f lavfi "
color=s=100x100:c=red  [l];
color=s=100x100:c=blue [r];
nullsrc=s=200x100, zmq [bg];
[bg][l]   overlay     [bg+l];
[bg+l][r] overlay@my=x=100 "

To change the color of the left side of the video, the following command can be used:

echo Parsed_color_0 c yellow | tools/zmqsend

To change the right side:

echo Parsed_color_1 c pink | tools/zmqsend

To change the position of the right side:

echo overlay@my x 150 | tools/zmqsend

โœจ MULTIMEDIA SOURCES โœจ

okay bestie, below is the description of the currently available multimedia sources ๐Ÿ’–

๐ŸŽ€ amovie

This is literally the same as the movie source, except it selects an audio stream by default. That's it. That's the vibe. ๐Ÿซถ

๐ŸŒธ avsynctest

Generate an Audio/Video Sync Test. The generated stream periodically shows a flash video frame and emits a beep in audio. It's useful for inspecting A/V sync issues. Very "diagnostic main character" energy โœจ

It accepts the following options:

  • size, s โ€” Set output video size. Default value is "hd720".
  • framerate, fr โ€” Set output video frame rate. Default value is 30.
  • samplerate, sr โ€” Set output audio sample rate. Default value is 44100.
  • amplitude, a โ€” Set output audio beep amplitude. Default value is 0.7.
  • period, p โ€” Set output audio beep period in seconds. Default value is 3.
  • delay, dl โ€” Set output video flash delay in number of frames. Default value is 0.
  • cycle, c โ€” Enable cycling of video delays; by default it's disabled.
  • duration, d โ€” Set stream output duration. By default duration is unlimited.
  • fg, bg, ag โ€” Set foreground/background/additional color.

Commands

This source supports some of the above options as commands. slay ๐Ÿ’…

๐Ÿฆ‹ movie

Read audio and/or video stream(s) from a movie container. It accepts the following parameters:

  • filename โ€” The name of the resource to read. It's not necessarily a file, bestie; it can also be a device or a stream accessed through some protocol.
  • format_name, f โ€” Specifies the format assumed for the movie to read, and it can be either the name of a container or an input device. If it's not specified, the format is guessed from movie_name or by probing.
  • seek_point, sp โ€” Specifies the seek point in seconds. The frames will be output starting from this seek point. The parameter is evaluated with av_strtod, so the numerical value may be suffixed by an IS postfix. The default value is "0".
  • streams, s โ€” Specifies the streams to read. Several streams can be specified, separated by +. The source will then have as many outputs, in the same order. The syntax is explained in the "Stream specifiers" section in the ffmpeg manual. Two special names, dv and da, specify respectively the default (best suited) video and audio stream. Default is dv, or da if the filter is called as amovie.
  • stream_index, si โ€” Specifies the index of the video stream to read. If the value is -1, the most suitable video stream will be automatically selected. The default value is -1. Deprecated. If the filter is called amovie, it will select audio instead of video.
  • loop โ€” Specifies how many times to read the stream in sequence. If the value is 0, the stream will be looped infinitely. Default value is "1".
Note that when the movie is looped the source timestamps are not changed, so it will generate non monotonically increasing timestamps. @ me if that's your villain origin story ๐Ÿ˜ญ
  • discontinuity โ€” Specifies the time difference between frames above which the point is considered a timestamp discontinuity which is removed by adjusting the later timestamps.
  • dec_threads โ€” Specifies the number of threads for decoding.
  • format_opts โ€” Specify format options for the opened file. Format options can be specified as a list of key=value pairs separated by :. The following example shows how to add protocol_whitelist and protocol_blacklist options:
ffplay -f lavfi
"movie=filename='1.sdp':format_opts='protocol_whitelist=file,rtp,udp\:protocol_blacklist=http'"

It allows overlaying a second video on top of the main input of a filtergraph, as shown in this graph:

input -----------> deltapts0 --> overlay --> output
                                    ^
                                    |
movie --> scale--> deltapts1 -------+

Examples

  • Skip 3.2 seconds from the start of the AVI file in.avi, and overlay it on top of the input labelled "in":
movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [over];
[in] setpts=PTS-STARTPTS [main];
[main][over] overlay=16:16 [out]
  • Read from a video4linux2 device, and overlay it on top of the input labelled "in":
movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [over];
[in] setpts=PTS-STARTPTS [main];
[main][over] overlay=16:16 [out]
  • Read the first video stream and the audio stream with id 0x81 from dvd.vob; the video is connected to the pad named "video" and the audio is connected to the pad named "audio":
movie=dvd.vob:s=v:0+#0x81 [video] [audio]

Commands

Both movie and amovie support the following commands:

  • seek โ€” Perform seek using av_seek_frame. The syntax is: seek stream_index|timestamp|flags
    • stream_index: If stream_index is -1, a default stream is selected, and timestamp is automatically converted from AV_TIME_BASE units to the stream specific time_base.
    • timestamp: Timestamp in AVStream.time_base units or, if no stream is specified, in AV_TIME_BASE units.
    • flags: Flags which select direction and seeking mode.
  • get_duration โ€” Get movie duration in AV_TIME_BASE units.

๐Ÿ’œ SEE ALSO

ffmpeg(1), ffplay(1), ffprobe(1), libavfilter(3)

๐Ÿ‘‘ AUTHORS

The FFmpeg developers.

For details about the authorship, see the Git history of the project (https://git.ffmpeg.org/ffmpeg), e.g. by typing the command git log in the FFmpeg source directory, or browsing the online repository at https://git.ffmpeg.org/ffmpeg.

Maintainers for the specific components are listed in the file MAINTAINERS in the source code tree.

okay that's the whole page, bestie ๐ŸŒˆ footer sign-off: source/version is FFMPEG-FILTERS(1), and the date is the footer's date field โ€” we're not inventing one, periodt ๐Ÿ’…โœจ

๐Ÿ“ฆ where this page comes from