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 ofkey=valuepairs. - A
:-separated list ofvalue. In this case, the keys are assumed to be the option names in the order theyโre declared. Example: thefadefilter declares three options in this order โtype,start_frameandnb_frames. So the parameter listin:0:30means the valueinis assigned to optiontype,0tostart_frame, and30tonb_frames. - A
:-separated list mixing direct values and longkey=valuepairs. Direct values must precede thekey=valuepairs, and they follow the same constraints/order as the previous point. Thekey=valuepairs 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,NANif the input timestamp is unknownnโ sequential number of the input frame, starting from0posโ the position in the file of the input frame,NANif unknown; deprecated, do not usew,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 to1, force the output to terminate when the shortest input terminates. Default is0.repeatlastโ if set to1, force the filter to extend the last frame of secondary streams until the end of the primary stream. A value of0disables this behavior. Default is1.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 is1. Range is between0.015625and64.modeโ set mode of compressor operation. Can beupwardordownward. Default isdownward.thresholdโ if a signal of stream rises above this level it will affect the gain reduction. By default it is0.125. Range is between0.00097563and1.ratioโ set a ratio by which the signal is reduced.1:2means that if the level rose 4dB above the threshold, it will be only 2dB above after the reduction. Default is2. Range is between1and20.attackโ amount of milliseconds the signal has to rise above the threshold before gain reduction starts. Default is20. Range is between0.01and2000.releaseโ amount of milliseconds the signal has to fall below the threshold before reduction is decreased again. Default is250. Range is between0.01and9000.makeupโ set the amount by how much signal will be amplified after processing. Default is1. Range is from1to64.kneeโ curve the sharp knee around the threshold to enter gain reduction more softly. Default is2.82843. Range is between1and8.linkโ choose if the โaverageโ level between all channels of input stream or the louder (โmaximumโ) channel of input stream affects the reduction. Default isaverage.detectionโ should the exact signal be taken in case ofpeakor an RMS one in case ofrms. Default isrms, which is mostly smoother.mixโ how much to use compressed signal in output. Default is1. Range is between0and1.
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 is33. Allowed range is between0and100.
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 is2.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 is44100.duration,dโ specify the duration of the cross fade effect. See the Time duration section in theffmpeg-utils(1)manual for the accepted syntax. By default the duration is determined bynb_samples. If set, this option is used instead ofnb_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 from0to1. Default value is1.gainsโ set output gain for each band. Default value is1for 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 is10to100. Default value is55milliseconds. 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 is50to95. Default value is75percent. 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 is0to25. Default value is2percent. This option also controls the quality of interpolated samples using neighbour good samples.threshold,tโ sets the threshold value. Allowed range is1to100. Default value is2. 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 is0to10. Default value is2. 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 is10to100. Default value is55milliseconds. 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 is50to95. Default value is75percent.arorder,aโ sets the autoregression order, as a percentage of window size. Allowed range is0to25. Default value is8percent. This option also controls the quality of interpolated samples using neighbour good samples.threshold,tโ sets the threshold value. Allowed range is1to100. Default value is10. Higher values make clip detection less aggressive.hsize,nโ sets the size of the histogram used to detect clips. Allowed range is100to9999. Default value is1000. 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 is1to16. Default value is6.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-451to-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 numbersnโ current sample numbernb_channelsโ number of channelstโ timestamp expressed in secondssrโ sample ratepโ current frequency power value, in dBfโ current frequency in Hz
Default value is "p".
attackโ sets the attack in milliseconds. Default is50milliseconds. Allowed range is from1to1000milliseconds.releaseโ sets the release in milliseconds. Default is100milliseconds. Allowed range is from5to2000milliseconds.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 is0. Allowed range is from0to100.dfrequencyโ sets the detection frequency in Hz used for the detection filter used to trigger equalization. Default value is1000Hz. Allowed range is between2and1000000Hz.dqfactorโ sets the detection resonance factor for the detection filter used to trigger equalization. Default value is1. Allowed range is from0.001to1000.tfrequencyโ sets the target frequency of the equalization filter. Default value is1000Hz. Allowed range is between2and1000000Hz.tqfactorโ sets the target resonance factor for the target equalization filter. Default value is1. Allowed range is from0.001to1000.attackโ sets the amount of milliseconds the signal from detection has to rise above the detection threshold before equalization starts. Default is20. Allowed range is between1and2000.releaseโ sets the amount of milliseconds the signal from detection has to fall below the detection threshold before equalization ends. Default is200. Allowed range is between1and2000.ratioโ sets the ratio by which the equalization gain is raised. Default is1. Allowed range is between0and30.makeupโ sets the makeup offset by which the equalization gain is raised. Default is0. Allowed range is between0and100.rangeโ sets the max allowed cut/boost amount. Default is50. Allowed range is from1to200.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:bandpasslowpasshighpasspeak
Default type is bandpass.
tftypeโ set the type of target filter. It can be one of:belllowshelfhighshelf
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 is2. Allowed range is from0to1e+06.basefreqโ set a base frequency for smoothing. Default value is22050. Allowed range is from2to1e+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 is0.6.out_gainโ set output gain of the reflected signal. Default is0.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 is1000.decaysโ set list of loudness of reflected signals, separated by|. Allowed range for each "decay" is(0 - 1.0]. Default is0.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 usereproductionmode, otherwise useproductionmode. Default isreproductionmode.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โ select50ยตs(FM).75fmโ select75ยตs(FM).50kfโ select50ยตs(FM-KF).75kfโ select75ยต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 tosame, 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 from0.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 numberCH.
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 from0to64. Default value is1.level_outโ set output level after processing of the signal. Allowed range is from0to64. Default value is1.amountโ set the amount of harmonics added to the original signal. Allowed range is from0to64. Default value is1.driveโ set the amount of newly created harmonics. Allowed range is from0.1to10. Default value is8.5.blendโ set the octave of newly created harmonics. Allowed range is from-10to10. Default value is0.freqโ set the lower frequency limit of producing harmonics in Hz. Allowed range is from2000to12000Hz. Default is7500Hz.ceilโ set the upper frequency limit of producing harmonics. Allowed range is from9999to20000Hz. If value is lower than10000Hz 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 eitherinfor fade-in, oroutfor a fade-out effect. Default isin.start_sample,ssโ specify the number of the start sample for starting to apply the fade effect. Default is0.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 is44100.start_time,stโ specify the start time of the fade effect. Default is0. The value must be specified as a time duration; see the Time duration section in theffmpeg-utils(1)manual for the accepted syntax. If set, this option is used instead ofstart_sample.duration,dโ specify the duration of the fade effect. See the Time duration section in theffmpeg-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 bynb_samples. If set, this option is used instead ofnb_samples.curveโ set curve for fade transition. It accepts the following values:triโ select triangular, linear slope (default)qsinโ select quarter of sine wavehsinโ select half of sine waveesinโ select exponential sine wavelogโ select logarithmiciparโ select inverted parabolaquaโ select quadraticcubโ select cubicsquโ select square rootcbrโ select cubic rootparโ select parabolaexpโ select exponentialiqsinโ select inverted quarter of sine waveihsinโ select inverted half of sine wavedeseโ select double-exponential seatdesiโ select double-exponential sigmoidlosiโ select logistic sigmoidsincโ select sine cardinal functionisincโ select inverted sine cardinal functionquatโ select quarticquatrโ select quartic rootqsin2โ select squared quarter of sine wavehsin2โ select squared half of sine wavenofadeโ no fade applied
silenceโ set the initial gain for fade-in or final gain for fade-out. Default value is0.0.unityโ set the initial gain for fade-out or final gain for fade-in. Default value is1.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 is0.01to97. Default value is12 dB.noise_floor,nfโ Set the noise floor in dB. Allowed range is-80to-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 thebnoption.
band_noise,bnโ Set a custom band noise profile for every one of15bands. Bands are separated by' 'or'|'.residual_floor,rfโ Set the residual floor in dB. Allowed range is-80to-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 isoutput. 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. Value0enables instant adaptation, while higher values react much slower. Allowed range is from0to1. Default value is0.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.0to2.0. Default value is1.0.noise_link,nlโ Set the noise link used for multichannel audio. Default value ismin. 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 from0.2to5. Default value is1.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 from0to50. Default value is0.
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 first0.4seconds 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 ratebโ current frequency bin numbernbโ number of available binschโ channel number of the current expressionchsโ number of channelsptsโ current frame ptsreโ current real part of frequency bin of current channelimโ current imaginary part of frequency bin of current channelreal(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 from16to131072. Default is4096.win_funcโ Set window function. Default is"hann". It accepts these values:rectbartletthann,hanninghammingblackmanwelchflattopbharrisbnuttallbhannsinenuttalllanczosgausstukeydolphcauchyparzenpoissonbohmankaiser
overlapโ Set window overlap. If set to1, the recommended overlap for the selected window function will be picked. Default is0.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 is1, 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-1to2. 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 is1.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 theirnormoption. When disabled, all IR coefficients in each IR channel will be normalized independently. Default istrue.irgainโ Set gain to be applied to IR coefficients before filtering. Allowed range is0to1. This gain is applied after any gain applied with theirnormoption.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 is30seconds. Allowed range is0.1to60seconds.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 is8192. Allowed range is from1to65536. Lower values decrease latency at the cost of higher CPU usage.maxpโ Set maximal partition size used for convolution. Default is8192. Allowed range is from8to65536. Lower values may increase CPU usage.nbirsโ Set number of input impulse responses streams which will be switchable at runtime. Allowed range is from1to32. Default is1.irโ Set IR stream which will be used for convolution, starting from0. It should always be lower than the value supplied by thenbirsoption. Default is0. This option can be changed at runtime via commands.precisionโ Set which precision to use when processing samples. Default value isauto. 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.wavandr_ir.wav, and setting theirnormoption 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
irgainexplicitly set to an estimated value and withirnormdisabled:
"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_MAXtoINT_MAX. Default value is0.0. tiny nudge or full send โญlevelโ Set output gain applied to final output. Allowed range is from0.0to1.0. Default value is1.0. volume vibes ๐๏ธorderโ Set filter order used for filtering. Allowed range is from1to16. Default value is8. 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 from0to1. Default value is0. 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 from1to12. Default value is10. 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:sym2sym4rbior68deb10sym10coif5bl3
percentโ Set percent of full denoising. Allowed range is from0to100percent. Default value is85percent 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 from512to65536. Default frame size is8192samples. frame size matters ๐softnessโ Set softness applied inside thresholding function. Allowed range is from0to10. Default softness is1. 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 is1. Allowed range is from0.015625to64. 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 is0.06125. Allowed range is from0to1. Setting this to0disables 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 is0.125. Allowed range is from0to1. the line in the sand โญratioโ Set a ratio by which the signal is reduced. Default is2. Allowed range is from1to9000. ratio said what it said ๐attackโ Amount of milliseconds the signal has to rise above the threshold before gain reduction stops. Default is20milliseconds. Allowed range is from0.01to9000. fast attack energy โกreleaseโ Amount of milliseconds the signal has to fall below the threshold before the reduction is increased again. Default is250milliseconds. Allowed range is from0.01to9000. let it breathe ๐makeupโ Set amount of amplification of signal after processing. Default is1. Allowed range is from1to64. post-processing glow ๐kneeโ Curve the sharp knee around the threshold to enter gain reduction more softly. Default is2.828427125. Allowed range is from1to8. 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 functionsfโ analog transfer functiontfโ digital transfer functionzpโ Z-plane zeros/poles, cartesian (default)prโ Z-plane zeros/poles, polar radianspdโ Z-plane zeros/poles, polar degreesspโ S-plane zeros/poles
process,rโ Set type of processing.dโ direct processingsโ serial processingpโ parallel processing
precision,eโ Set filtering precision.dblโ double-precision floating-point (default)fltโ single-precision floating-pointi32โ 32-bit integersi16โ 16-bit integers
normalize,nโ Normalize filter coefficients, by default is enabled. Enabling it will normalize magnitude response at DC to0dB. normalized and thriving ๐mixโ How much to use filtered signal in output. Default is1. Range is between0and1. 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 whenresponseis enabled. channel pick ๐บsizeโ Set video stream size. This option is used only whenresponseis 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
5000Hzfor48000Hz 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
zpformat:
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 is1. incoming level ๐๏ธlevel_outโ Set output gain. Default is1. outgoing level โจlimitโ Don't let signals above this level pass the limiter. Default is1. hard no above this ๐attackโ The limiter will reach its attenuation level in this amount of time in milliseconds. Default is5milliseconds. quick reflexes โกreleaseโ Come back from limiting to attenuation1.0in this amount of milliseconds. Default is50milliseconds. 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 of0in the release time. average reduction, not zero ๐ซถasc_levelโ Select how much the release time is affected by ASC,0means nearly no changes in release time while1produces higher release times. ASC level up ๐ธlevelโ Auto level output signal. Default is enabled. This normalizes audio back to0dBif enabled. auto glow-up ๐latencyโ Compensate the delay introduced by using the lookahead buffer set withattackparameter. Also flush the valid audio data in the lookahead buffer when the stream hitsEOF. latency compensation, bestie ๐ฆ
Depending on picked setting it is recommended to upsample input2xor4xtimes witharesamplebefore 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โ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ Specify the band-width of a filter inwidth_typeunits. width in those units ๐mix,mโ How much to use filtered signal in output. Default is1. Range is between0and1. 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 to0dB๐order,oโ sets the filter order. Can be1or2. Default is2๐ธtransform,aโ sets the transform type of the IIR filter. The values aredi,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-1gives you infinite loops. Default is0๐sizeโ set maximal number of samples. Default is0โจstartโ set first sample of loop. Default is0๐timeโ set the time of loop start in seconds. Only used if the option namedstartis 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 is2๐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 in2.1(FL+FR+LF) and the second input isFC+BL+BR, then the output will be in5.1, with the channels in this order:a1, a2, b1, a3, b2, b3โ wherea1is the first channel of the first input andb1is 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 ordera1, a2, b1, b2, and the channel layout will be arbitrarily set to4.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 to2๐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 is2seconds โญ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 is1๐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 ofanequalizeris displayed in video stream ๐sizeโ set video stream size. Only useful ifcurvesoption is activated.mgainโ set max gain that will be displayed. Only useful ifcurvesoption 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 belinearorlogarithmic. Default islogarithmic๐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".fNis existing filter number, starting from0; if no such filter is available, an error is returned.freqsets new frequency parameter.widthsets new width parameter in Hertz.gainsets new gain parameter in dB. Full filter invocation withasendcmdmay 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 from0.00001to10000. Default value is0.00001๐patch,pโ set patch radius duration. Allowed range is from1to100milliseconds. Default value is2milliseconds ๐ธresearch,rโ set research radius duration. Allowed range is from2to300milliseconds. Default value is6milliseconds ๐ฆ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 iso๐
smooth,mโ set smooth factor. Default value is11. Allowed range is from1to1000โจ
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 filtereps. โจleakageโ sets the filterleakage. โจ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 is4096.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 withwhole_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 withpad_len.pad_durโ specifies the duration of samples of silence to add. see the Time duration section in theffmpeg-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 theffmpeg-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 withpad_dur.
okay important one ๐ โ if neither thepad_lennor thewhole_lennorpad_durnorwhole_duroption is set, the filter will add silence to the end of the input stream indefinitely. like, forever forever. ๐ญ
ngl also note that forffmpeg4.4 and earlier, a zeropad_durorwhole_duralso 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
ffmpegto 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 theshortestoption:
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 is0.4.out_gainโ sets output gain. default is0.74delayโ sets delay in milliseconds. default is3.0.decayโ sets decay. default is0.4.speedโ sets modulation speed in Hz. default is0.5.typeโ sets modulation type. default istriangular. it accepts the following values:triangular,tsinusoidal,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.0to1.0. default value is0.0.levelโ sets the output gain applied to the final output. allowed range is from0.0to1.0. default value is1.0.orderโ sets the filter order used for filtering. allowed range is from1to16. default value is8.
๐ซถ 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 is1. range is[0.015625 - 64].level_outโ sets output gain. by default it is1. range is[0.015625 - 64].clipโ sets the clipping start value. default value is0dBFSor1.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 is0.5. allowed range is from0to1.iterationsโ sets the number of iterations of the psychoacoustic clipper. allowed range is from1to20. default value is10.levelโ auto level the output signal. default is disabled. this normalizes audio back to0dBFSif 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
0means 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
1both 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 is1. range is[0.015625 - 64].level_outโ sets output gain. by default it is1. range is[0.015625 - 64].modeโ sets the waveform shape the LFO will use. can be one of:sine,triangle,square,sawuporsawdown. default issine.amountโ sets modulation. defines how much of the original signal is affected by the LFO.offset_lโ sets the left channel offset. default is0. allowed range is[0 - 1].offset_rโ sets the right channel offset. default is0.5. allowed range is[0 - 1].widthโ sets pulse width. default is1. allowed range is[0 - 2].timingโ sets possible timing mode. can be one of:bpm,msorhz. default ishz.bpmโ sets bpm. default is120. allowed range is[30 - 300]. only used iftimingis set tobpm.msโ sets ms. default is500. allowed range is[10 - 2000]. only used iftimingis set toms.hzโ sets frequency in Hz. default is2. allowed range is[0.01 - 100]. only used iftimingis set tohz.
๐ธ 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-1to1. Default value is1. Negative values are special: they set how much filtered noise stays in the final filter output. Set this option to-1to 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 is1024.pad,pโ if set to1, 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 is1.
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 is44100 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 from0.ptsโ the presentation timestamp of the input frame, in time base units; the time base depends on the filter input pad, and is usually1/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 is0dBor1.outputโ sets the gain applied to output. Default value is0dBor1.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 is2048. Allowed range is from32to65536.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 ishann.overlapโ sets window overlap. Allowed range is from0to1. Default value is0.5.measureโ selects the parameters which are measured. The metadata keys can be used as flags, default isallwhich measures everything.nonedisables all measurement.
A list of each metadata key follows:
meanvariancecentroidspreadskewnesskurtosisentropyflatnesscrestfluxslopedecreaserolloff
๐ค 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 is16000. 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 is0.05(50 milliseconds). Allowed range is[0 - 10].metadataโ sets metadata injection. All the metadata keys are prefixed withlavfi.astats.X, whereXis channel number starting from1or stringOverall. 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 isallwhich measures everything.nonedisables all per channel measurement.measure_overallโ selects the parameters which are measured overall. The metadata keys can be used as flags, default isallwhich measures everything.nonedisables 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 near1.0is 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. eitherMin_levelorMax_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 eitherMin_levelorMax_level.Abs_Peak_countโ number of occasions that the absolute samples taken from the signal attained max absolute value ofMin_levelandMax_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 from0to1. Default value is1.0.wetโ sets wet gain, how much of filtered signal is kept. Allowed range is from0to1. Default value is1.0.boostโ sets max boost factor. Allowed range is from1to12. Default value is2.decayโ sets delay line decay gain value. Allowed range is from0to1. Default value is0.0.feedbackโ sets delay line feedback gain value. Allowed range is from0to1. Default value is0.9.cutoffโ sets cutoff frequency in Hertz. Allowed range is from50to900. Default value is100.slopeโ sets the slope amount for the cutoff frequency, bestie. Allowed range is0.0001to1, and it defaults to0.5. ๐ซdelayโ sets the delay. Allowed range is1to100, default20. โณ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 is2to200. Default value is20. ๐ฅorderโ set the filter order. Available values are from3to20. Default value is10.levelโ set the input gain level. Allowed range is from0to1. Default value is1.
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 is20000to192000. Default value is20000. โญorderโ set the filter order. Available values are from3to20. Default value is10.levelโ set the input gain level. Allowed range is from0to1. Default value is1.
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 is2to999999. Default value is1000. ๐ฏorderโ set the filter order. Available values are from4to20. Default value is4.qfactorโ set the Q-factor. Allowed range is from0.01to100. Default value is1.levelโ set the input gain level. Allowed range is from0to2. Default value is1.
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 is2to999999. Default value is1000. ๐ฏorderโ set the filter order. Available values are from4to20. Default value is4.qfactorโ set the Q-factor. Allowed range is from0.01to100. Default value is1.levelโ set the input gain level. Allowed range is from0to2. Default value is1.
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 than2will 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 ofatempoto 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
atempoinstances:
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 is10000Hz. ๐ปslopeโ set slope direction of tilt. Default is0. Allowed range is from-1to1. โ๏ธwidthโ set width of tilt. Default is1000. Allowed range is from100to10000.orderโ set order of tilt filter.levelโ set input volume level. Allowed range is from0to4. Default is1. ๐
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 thestart/endoptions and thedurationoption look at the frame timestamp, while the_sampleoptions simply count the samples that pass through the filter. sostart/end_ptsandstart/end_samplewill 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 theasetptsfilter after theatrimfilter. ๐ญ
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 is256. Allowed range is from2to131072. ๐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 is3000. ๐ฏcsgโ constant skirt gain if set to1. Defaults to0.width_type,tโ set method to specify band-width of filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ 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 is1. range is between0and1. ๐๏ธ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 to0dB. โ๏ธtransform,aโ set transform type of IIR filter:didiitditdiilattsvfzdf
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 is3000. ๐ฏwidth_type,tโ set method to specify band-width of filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ 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 is1. range is between0and1. ๐๏ธ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 to0dB. โ๏ธtransform,aโ set transform type of IIR filter:didiitditdiilattsvfzdf
precision,rโ set precision of filtering.autoโ picks the automatic sample format, depending on the surround filters ๐ซs16โ always use signed 16-bits32โ always use signed 32-bitf32โ always use float 32-bitf64โ always use float 64-bitblock_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 is100Hz.width_type,tโ sets the method used to specify the band-width of the filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ determines how steep the filter's shelf transition is.poles,pโ sets the number of poles. Default is2.mix,mโ how much of the filtered signal to use in the output. Default is1. Range is between0and1.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 to0dB.transform,aโ sets the transform type of the IIR filter:didiitditdiilattsvfzdf
precision,rโ sets the precision of filtering:autoโ picks the automatic sample format, depending on the surround filterss16โ always use signed 16-bits32โ always use signed 32-bitf32โ always use float 32-bitf64โ 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:
a0a1a2b0b1b2
โ change a biquad parameter. Syntax for the command is: "value"
mix,mโ how much of the filtered signal to use in the output. Default is1. Range is between0and1.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 to0dB.transform,aโ sets the transform type of the IIR filter:didiitditdiilattsvfzdf
precision,rโ sets the precision of filtering:autoโ picks the automatic sample format, depending on the surround filterss16โ always use signed 16-bits32โ always use signed 32-bitf32โ always use float 32-bitf64โ 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 thein_channel-out_channelorin_channelform.in_channelcan be either the name of the input channel (e.g.FLfor front left) or its index in the input channel layout.out_channelis the name of the output channel or its index in the output channel layout. Ifout_channelis 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 theout_channelnames 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+downmixinput 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.1WAV 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 isstereo.channelsโ a channel layout describing the channels to be extracted as separate output streams, orallto extract each input channel as a separate stream. The default isall.
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.1WAV 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.1WAV 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 is0.4.out_gainโ sets output gain. Default is0.4.delaysโ sets delays. A typical delay is around40msto60ms.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:
attacksdecays
โ 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 to0.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 to0.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-90dB. Defaults to0.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 to0.
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 is0.cmโ set cm distance. This is the compensation distance for tightening up the distance setup. Default is0.mโ set meters distance. This is the compensation distance for hard distance setup. Default is0.dryโ set dry amount. That's how much unprocessed (dry) signal you get. Default is0.wetโ set wet amount. That's how much processed (wet) signal you get. Default is1.tempโ set temperature in degrees Celsius ๐ก๏ธ. This is the temperature of the environment. Default is20.
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 is0.2. Allowed range is from0to1. This sets the gain of the low shelf filter for the side part of the stereo image. Default is-6dB. Max allowed is-30dB when strength is set to1.rangeโ set soundstage wideness. Default is0.5. Allowed range is from0to1. This sets the cutoff frequency of the low shelf filter. Default cutoff is near1550Hz. With range set to1the cutoff frequency is set to2100Hz.slopeโ set curve slope of the low shelf filter. Default is0.5. Allowed range is from0.01to1.level_inโ set input gain. Default is0.9.level_outโ set output gain. Default is1.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.0to0(unchanged sound) to10.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 than1(e.g.0.05or0.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 from0to1. Default is0.mโ set amount of ducking on the treble part of the sound. Allowed range is from0to1. Default is0.5.fโ how much of the original frequency content to keep when de-essing. Allowed range is from0to1. Default is0.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 from0to1. Default value is1.enhanceโ set the dialogue enhance factor to put in the front center channel output. Allowed range is from0to3. Default value is1.voiceโ set the voice detection factor. Allowed range is from2to32. Default value is2.
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 is3seconds.
๐ง 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 from10to8000milliseconds. Default is500milliseconds. ๐
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 from3to301, must be odd number. Default is31. ๐ฆ
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 from1.0to100.0. Default is10.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 from0.0to1.0. Default is0.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 from0.0to30.0. Default is0.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 to0, 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 to0(default) no frame overlapping is done. Using>0and<1values will make less conservative gain adjustments, like whenframelenoption is set to smaller value, ifframelenoption 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 numbersnโ current sample numbernb_channelsโ number of channelstโ timestamp expressed in secondssrโ 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โ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ specify the band-width of a filter inwidth_typeunits.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 is1. Range is between0and1.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:didiitditdiilattsvfzdf
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 dBat1000 Hz, with a bandwidth of200 Hz:
equalizer=f=1000:t=h:width=200:g=-10
- Apply
2 dBgain at1000 Hzwith Q1and attenuate5 dBat100 Hzwith Q2:
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 equalizerwidth_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.0means mono sound (average of both channels), with1.0sound will be unchanged, with-1.0left 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 frequencysrโ sample ratechโ channel number, set to0when multichannels evaluation is disabledchidโ channel id, seelibavutil/channel_layout.h, set to the first channel id when multichannels evaluation is disabledchsโ number of channelschlayoutโchannel_layout, seelibavutil/channel_layout.h
and functions:
gain_interpolate(f)โ interpolate gain on frequencyfbased ongain_entrycubic_interpolate(f)โ same asgain_interpolate, but smoother
This option is also available as a command. Default is gain_interpolate(f).
gain_entryโ set gain entry for thegain_interpolatefunction. The expression can contain functions:entry(f, g)โ store gain entry at frequencyfwith valueg
This option is also available as a command.
delayโ set filter delay in seconds. Higher value means more accurate. Default is0.01.accuracyโ set filter accuracy in Hz. Lower value means more accurate. Default is5.wfuncโ set window function. Acceptable values are:rectangularโ rectangular window, useful when gain curve is already smoothhannโ hann window (default)hammingโ hamming windowblackmanโ blackman windownuttall3โ 3-terms continuous 1st derivative nuttall windowmnuttall3โ minimum 3-terms discontinuous nuttall windownuttallโ 4-terms continuous 1st derivative nuttall windowbnuttallโ minimum 4-terms discontinuous nuttall (blackman-nuttall) windowbharrisโ blackman-harris windowtukeyโ 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 gainlinlogโ linear frequency, logarithmic (in dB) gain (default)loglinโ logarithmic (in octave scale where20 Hzis0) frequency, linear gainloglogโ logarithmic frequency, logarithmic gain
dumpfileโ set file for dumping, suitable forgnuplot.dumpscaleโ set scale fordumpfile. Acceptable values are the same as thescaleoption. Default islinlog.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 Hzwithgain_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 from0to30. Default value is0.depthโ set added sweep delay in milliseconds. Range from0to10. Default value is2.regenโ set percentage regeneration (delayed signal feedback). Range from-95to95. Default value is0.widthโ set percentage of delayed signal mixed with original. Range from0to100. Default value is71.speedโ set sweeps per second (Hz). Range from0.1to10. Default value is0.5.shapeโ set swept wave shape, can betriangularorsinusoidal. Default value issinusoidal.phaseโ set swept wave percentage-shift for multi channel. Range from0to100. Default value is25.interpโ set delay-line interpolation,linearorquadratic. Default islinear.
๐ฆ 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 is1, or0dB.level_outโ set output level. By default is1, or0dB.side_gainโ set gain applied to side part of signal. By default is1.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 is2.05milliseconds.left_balanceโ set left channel balance. By default is-1.left_gainโ set left channel gain. By default is1.left_phaseโ change left phase. By default is disabled.right_delayโ set right channel delay. By default is2.12milliseconds.right_balanceโ set right channel balance. By default is1.right_gainโ set right channel gain. By default is1.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 is0.typeโ Set processing type. Can betimeorfreq.timeprocesses audio in the time domain, which is slow ๐ฉ.freqprocesses audio in the frequency domain, which is fast ๐ฅ. Default isfreq.lfeโ Set custom gain for LFE channels. Value is in dB. Default is0.sizeโ Set size of frame in number of samples which will be processed at once. Default value is1024. Allowed range is from1024to96000.hrirโ Set format of hrir stream. Default value isstereo. Alternative value ismultich. If set tostereo, 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 tomultich, 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
amoviefilters for 7.1 downmix โ eachamoviefilter 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
amoviefilters for 7.1 downmix, but now inmultichhrir 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 is3000.poles,pโ Set number of poles. Default is2.width_type,tโ Set method to specify band-width of filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ Specify the band-width of a filter inwidth_typeunits. Applies only to double-pole filter. The default is0.707qand gives a Butterworth response. Fancy name, iconic result โจmix,mโ How much to use filtered signal in output. Default is1. Range is between0and1.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 to0dB.transform,aโ Set transform type of IIR filter:didiitditdiilattsvfzdf
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:frequencywidth_type,tโ Change highpasswidth_type. Syntax for the command is:width_typewidth,wโ Change highpass width. Syntax for the command is:widthmix,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 to2.channel_layoutโ The desired output channel layout. Defaults tostereo.mapโ Map channels from inputs to output. The argument is a'|'-separated list of mappings, each in theinput_idx.in_channel-out_channelform.input_idxis the 0-based index of the input stream.in_channelcan be either the name of the input channel (e.g.FLfor front left) or its index in the specified input stream.out_channelis 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 variableLADSPA_PATHis defined, the LADSPA plugin is searched in each one of the directories specified by the colon-separated list inLADSPA_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 exampledelay,thresholdorgain). Controls need to be defined using the following syntax:c0=value0|c1=value1|c2=value2|..., wherevalueiis the value set on the i-th control. Alternatively they can also be defined using the following syntax:value0|value1|value2|..., wherevalueiis the value set on the i-th control. Ifcontrolsis set to"help", all available controls and their valid ranges are printed. Bless. ๐ซถsample_rate,sโ Specify the sample rate, default to44100. Only used if the plugin has zero inputs.nb_samples,nโ Set the number of samples per channel per each output frame, default is1024. Only used if the plugin has zero inputs.duration,dโ Set the minimum duration of the sourced audio. See the Time duration section in theffmpeg-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_notchplugin from theVCFlibrary:
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.2amplitude:
ladspa=file=cmt:noise_source_white:c=c0=.2
- Generate 20 bpm clicks using the plugin
C* Click - Metronomefrom theC* Audio Plugin Suite(CAPS) library:
ladspa=file=caps:Click:c=c1=20'
- Apply the
C* Eq10X2 - Stereo 10-band equalisereffect:
ladspa=caps:Eq10X2:c=c0=-48|c9=-24|c3=12|c4=2
- Increase volume by
20dBusing the fast lookahead limiter from Steve Harris'SWH Pluginscollection:
ladspa=fast_lookahead_limiter_1913:fastLookaheadLimiter:20|0|2
- Attenuate low frequencies using the Multiband EQ from Steve Harris'
SWH Pluginscollection:
ladspa=mbeq_1197:mbeq:-24|-24|-24|0|0|0|0|0|0|0|0|0|0|0|0
- Reduce stereo image using
Narrowerfrom theC* Audio Plugin Suite(CAPS) library: - the
Narrowerone 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 is1.0-50.0. Default value is7.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 is0.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, andmeasured_threshmust 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 aretrueorfalse. Default istrue.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 totrue, this option compensates for that effect. Multi-channel input files are not affected by this option. Options aretrueorfalse. Default isfalse.print_formatโ set print format for stats. Options aresummary,json, ornone. Default value isnone.stats_fileโ write stats to the specified file. Format is controlled byprint_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 is500.poles,pโ set number of poles. Default is2.width_type,tโ set method to specify band-width of filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ specify the band-width of a filter inwidth_typeunits. Applies only to double-pole filter. The default is0.707qand gives a Butterworth response. ๐mix,mโ how much to use filtered signal in output. Default is1. Range is between0and1.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 to0dB.transform,aโ set transform type of IIR filter:didiitditdiilattsvfzdf
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 isfrequency.width_type,tโ change lowpasswidth_type. Syntax for the command iswidth_type.width,wโ change lowpass width. Syntax for the command iswidth.mix,mโ change lowpass mix. Syntax for the command ismix.
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). Ifcontrolsis set tohelp, all available controls and their valid ranges are printed. Basically a built-in cheat sheet, iconic.sample_rate,sโ specify the sample rate, default to44100. Only used if plugin have zero inputs.nb_samples,nโ set the number of samples per channel per each output frame, default is1024. 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,1leaving the volume unchanged.in_nameโ input channel to use, seeout_namefor 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 is1, 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:crispmixedsmooth
detectorโ picks the detector. possible values:compoundpercussivesoft
phaseโ sets the phase. possible values:laminarindependent
windowโ sets the processing window size. possible values:standardshortlong
smoothingโ sets smoothing. possible values:offon
formantโ turns on formant preservation when shift pitching โจ possible values:shiftedpreserved
pitchqโ sets pitch quality. possible values:qualityspeedconsistency
channelsโ sets channels. possible values:aparttogether
๐ 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 is1. range is between0.015625and64.modeโ sets the mode of compressor operation. can beupwardordownward. default isdownward.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's0.125. range is between0.00097563and1.ratioโ sets a ratio about which the signal is reduced.1:2means that if the level raised4dBabove the threshold, it will be only2dBabove after the reduction. default is2. range is between1and20.attackโ amount of milliseconds the signal has to rise above the threshold before gain reduction starts. default is20. range is between0.01and2000.releaseโ amount of milliseconds the signal has to fall below the threshold before reduction is decreased again. default is250. range is between0.01and9000.makeupโ sets the amount by how much signal will be amplified after processing. default is1. range is from1to64.kneeโ curves the sharp knee around the threshold so you enter gain reduction more softly ๐ง default is2.82843. range is between1and8.linkโ choose if theaveragelevel between all channels of the side-chain stream, or the louder (maximum) channel of the side-chain stream, affects the reduction. default isaverage.detectionโ should the exact signal be taken in case ofpeak, or an RMS one in case ofrms. default isrms, which is mainly smoother.level_scโ sets sidechain gain. default is1. range is between0.015625and64.mixโ how much to use the compressed signal in the output. default is1. range is between0and1.
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 is1. allowed range is from0.015625to64.modeโ sets the mode of operation. can beupwardordownward. default isdownward. if set toupwardmode, higher parts of the signal will be amplified, expanding the dynamic range in the upward direction. otherwise, in the case ofdownward, the lower parts of the signal will be reduced.rangeโ sets the level of gain reduction when the signal is below the threshold. default is0.06125. allowed range is from0to1. setting this to0disables reduction and then the filter behaves like an expander.thresholdโ if a signal rises above this level the gain reduction is released. default is0.125. allowed range is from0to1.ratioโ sets a ratio about which the signal is reduced. default is2. allowed range is from1to9000.attackโ amount of milliseconds the signal has to rise above the threshold before gain reduction stops. default is20milliseconds. allowed range is from0.01to9000.releaseโ amount of milliseconds the signal has to fall below the threshold before the reduction is increased again. default is250milliseconds. allowed range is from0.01to9000.makeupโ sets the amount of amplification of the signal after processing. default is1. allowed range is from1to64.kneeโ curves the sharp knee around the threshold so you enter gain reduction more softly ๐ธ default is2.828427125. allowed range is from1to8.detectionโ choose if the exact signal should be taken for detection, or an RMS-like one. default isrms. can bepeakorrms.linkโ choose if the average level between all channels, or the louder channel, affects the reduction. default isaverage. can beaverageormaximum.level_scโ sets sidechain gain. default is1. range is from0.015625to64.
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 casedBis appended to the specified value) or as an amplitude ratio. default is-60dB, or0.001.duration,dโ sets silence duration until notification (default is2seconds). see the Time duration section in theffmpeg-utils(1)manual for the accepted syntax.mono,mโ process each channel separately, instead of combined. by default it's disabled.
Examples
- detect
5seconds of silence with-50dBnoise tolerance:
silencedetect=n=-50dB:d=5
- complete example with ffmpeg to detect silence with
0.0001noise tolerance insilence.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 thestart_periodswill be1, but it can be increased to higher values to trim all audio up to a specific count of non-silence periods. default value is0.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 is0.start_thresholdโ this indicates what sample value should be treated as silence. for digital audio, a value of0may 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 casedBis appended to the specified value) or as an amplitude ratio. default value is0.start_silenceโ specify max duration of silence at the beginning that will be kept after trimming. default is0, 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 beanyorall. default isany. withany, 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. withall, 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 astop_periodsthat is negative. this value is then treated as a positive value and is used to indicate the effect should restart processing as specified bystop_periods, making it suitable for removing periods of silence in the middle of the audio. default value is0.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 is0.
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 asstart_thresholdbut 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 is0.stop_silenceโ specify max duration of silence at the end that will be kept after trimming. Default is0, 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 beanyorall. Default isall. Withany, any sample from any channel that is detected as silence will trigger start of silence trimming after start of audio stream, limited usage. Withall, only if every sample from every channel is detected as silence will trigger start of silence trimming after start of audio stream. fr fr,allis 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. Using0will effectively disable any windowing and use only single sample per channel for silence detection. In that case it may be needed to also setstart_silenceand/orstop_silenceto nonzero values with alsostart_durationand/orstop_durationto nonzero values. Default value is0.02. Allowed range is from0to10.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 is0.rotationโ set rotation of virtual loudspeakers in deg. Default is0.elevationโ set elevation of virtual speakers in deg. Default is0.radiusโ set distance in meters between loudspeakers and the listener with near-field HRTFs. Default is1.typeโ set processing type. Can betimeorfreq.timeis processing audio in time domain which is slow.freqis processing audio in frequency domain which is fast. Default isfreq.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 is0.framesizeโ set custom frame size in number of samples. Default is1024. Allowed range is from1024to96000. Only used if optiontypeis set tofreq.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 optioninterpolateis enabled.radstepโ set neighbor search radius step. Only used if optioninterpolateis 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 is0.95. Allowed range is from0.0to1.0.expansion,eโ set the maximum expansion factor. Allowed range is from1.0to50.0. Default value is2.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 from1.0to50.0. Default value is2.0. This option controls maximum local half-cycle of samples compression. This option is used only ifthresholdoption is set to value greater than0.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 is0.0. Allowed range is from0.0to1.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 is0.001. Allowed range is from0.0to1.0. This controls how fast expansion factor is raised per each new half-cycle until it reachesexpansionvalue. 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 is0.001. Allowed range is from0.0to1.0. This controls how fast compression factor is raised per each new half-cycle until it reachescompressionvalue.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 ofthresholdoption. When enabled any half-cycle of samples with their local peak value below or same asthresholdoption 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 is0.0, thus disabled. Allowed range is from0.0to1.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 is1. Allowed range is0.015625to64.level_outโ sets the output level after filtering, for both channels. Default is1. Allowed range is0.015625to64.balance_inโ sets the input balance between both channels. Default is0. Allowed range is-1to1.balance_outโ sets the output balance between both channels. Default is0. Allowed range is-1to1.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 is1. Allowed range is0.015625to64.sbalโ sets the balance of the side signal. Default is0. Allowed range is-1to1.mlevโ sets the level of the middle signal. Default is1. Allowed range is0.015625to64.mpanโ sets the middle signal pan. Default is0. Allowed range is-1to1.baseโ sets the stereo base between mono and inversed channels. Default is0. Allowed range is-1to1.delayโ sets the delay in milliseconds, like, how much to delay the left from the right channel and vice versa. Default is0. Allowed range is-20to20.sclevelโ sets the S/C level. Default is1. Allowed range is1to100.phaseโ sets the stereo phase in degrees. Default is0. Allowed range is0to360.bmode_in,bmode_outโ set the balance mode for thebalance_in/balance_outoptions. Can be one of the following:balanceโ classic balance mode, attenuating one channel at a time. Gain is raised up to1.amplitudeโ similar to the classic mode above, but the gain is raised up to2.powerโ equal power distribution, from-6dBto+6dBrange.
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 is20milliseconds.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 is0.3.crossfeedโ cross feed of the left into the right with inverted phase. This helps suppress the mono ๐ซถ If the value is1it will cancel all the signal common to both channels. Default is0.3.drymixโ sets the level of the input signal of the original channel. Default is0.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 is5.1. See the Channel Layout section in theffmpeg-utils(1)manual for the required syntax.chl_inโ sets the input channel layout. By default, this isstereo. See the Channel Layout section in theffmpeg-utils(1)manual for the required syntax.level_inโ sets the input volume level. By default, this is1.level_outโ sets the output volume level. By default, this is1.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 is128Hz.lfe_highโ sets the LFE high cut off frequency. By default, this is256Hz.lfe_modeโ sets the LFE mode, can beaddorsub. Default isadd. Inaddmode, the LFE channel is created from the input audio and added to the output. Insubmode, 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 from0.0to1.0. Useful to improve output quality withfocusoption values greater than0.0. Default is0.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 from0to360. Default is90.focusโ sets the focus of the stereo surround transform. Allowed range is from-1to1. Default is0.fc_inโ sets the front center input volume. By default, this is1.fc_outโ sets the front center output volume. By default, this is1.fl_inโ sets the front left input volume. By default, this is1.fl_outโ sets the front left output volume. By default, this is1.fr_inโ sets the front right input volume. By default, this is1.fr_outโ sets the front right output volume. By default, this is1.sl_inโ sets the side left input volume. By default, this is1.sl_outโ sets the side left output volume. By default, this is1.sr_inโ sets the side right input volume. By default, this is1.sr_outโ sets the side right output volume. By default, this is1.bl_inโ sets the back left input volume. By default, this is1.bl_outโ sets the back left output volume. By default, this is1.br_inโ sets the back right input volume. By default, this is1.br_outโ sets the back right output volume. By default, this is1.bc_inโ sets the back center input volume. By default, this is1.bc_outโ sets the back center output volume. By default, this is1.lfe_inโ sets the LFE input volume. By default, this is1.lfe_outโ sets the LFE output volume. By default, this is1.allxโ sets the spread usage of the stereo image across the X axis for all channels. Allowed range is from-1to15. 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-1to15. 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 from0.06to15. By default this value is0.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 from0.06to15. By default this value is0.5.win_sizeโ sets the window size. Allowed range is from1024to65536. Default size is4096.win_funcโ sets the window function. It accepts the following values:rectbartletthann,hanninghammingblackmanwelchflattopbharrisbnuttallbhannsinenuttalllanczosgausstukeydolphcauchyparzenpoissonbohmankaiser
Default is "hann" ๐
overlapโ sets the window overlap. If set to1, the recommended overlap for the selected window function will be picked. Default is0.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 is3000Hz.width_type,tโ sets the method used to specify the band-width of the filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ determines how steep the filter's shelf transition is.poles,pโ sets the number of poles. Default is2.mix,mโ how much to use the filtered signal in the output. Default is1. Range is between0and1.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:didiitditdiilattsvfzdf
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-bits32โ always signed 32-bitf32โ always float 32-bitf64โ 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 is3000Hz ๐ฆwidth_type,tโ the method used to specify the band-width of the filter:hโ Hzqโ Q-Factoroโ octavesโ slopekโ kHz
width,wโ determines how steep the filter's shelf transition is ๐poles,pโ sets the number of poles. default is2๐๏ธmix,mโ how much of the filtered signal goes into the output. default is1. range is between0and1๐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 to0dB, slaytransform,aโ sets the transform type of the IIR filter:didiitditdiilattsvfzdf
precision,rโ sets precision of filtering โจautoโ picks automatic sample format depending on surround filterss16โ always use signed 16-bits32โ always use signed 32-bitf32โ always use float 32-bitf64โ 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 is0.1-20000.0. default value is5.0Hz.dโ depth of modulation as a percentage. range is0.0-1.0. default value is0.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 is0.1-20000.0. default value is5.0Hz ๐ถdโ depth of modulation as a percentage. range is0.0-1.0. default value is0.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 is250Hz. allowed range is from100to500Hz ๐strengthโ sets the virtual bass strength. allowed range is from0.5to3. default value is3๐ช
๐ 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 toU8,S16, andS32.floatโ 32-bit floating-point; this limits input sample format toFLT. (default)doubleโ 64-bit floating-point; this limits input sample format toDBL.
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 forreplaygain_preampis0.0.replaygain_noclipโ prevents clipping by limiting the gain applied โ๏ธ default value forreplaygain_noclipis1.evalโ sets when the volume expression is evaluated โฐ it accepts the following values:onceโ only evaluate the expression once during filter initialization, or when thevolumecommand is sentframeโ 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 channelsnb_consumed_samplesโ number of samples consumed by the filternb_samplesโ number of samples in the current frameposโ original frame position in the file; deprecated, do not use ๐ptsโ frame PTSsample_rateโ sample ratestartptsโ PTS at start of streamstarttโ time at start of streamtโ frame timetbโ timestamp timebasevolumeโ last set volume value
note that whenevalis set toonce, only thesample_rateandtbvariables are available โ all other variables will evaluate toNAN๐
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 (like10-20s) = way more accurate results using less CPU (same energy as using thewhisper-clitool), but the transcription latency goes up too, so it's not useful for real-time streams fr fr. Consider using thevad_modeloption together with a largequeuevalue. 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 than0, 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 thequeueparameter 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 innumerator/denominatorform.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 theenum AVSampleFormatinlibavutil/samplefmt.hchannel_layoutโ the channel layout of the incoming audio buffers. Either a channel layout name fromchannel_layout_mapinlibavutil/channel_layout.cor its corresponding integer representation from theAV_CH_LAYOUT_*macros inlibavutil/channel_layout.hchannelsโ the number of channels of the incoming audio buffers. If bothchannelsandchannel_layoutare 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 thechannel_layoutoption 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 theffmpeg-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 to1024.sample_rate,sโ specify the sample rate, default to44100.
Each expression in exprs can contain the following constants:
nโ number of the evaluated sample, starting from0tโ time of the evaluated sample expressed in seconds, starting from0sโ 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 is0.sample_rate,rโ set the sample rate, default is44100.nb_samples,nโ set the number of samples per each frame. Default is1024.taps,tโ set the number of filter coefficients in output audio stream. Default value is0.channel_layout,cโ specifies the channel layout, and can be a string representing a channel layout. The default value ofchannel_layoutis"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 thepresetoption 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 thepresetoption 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 is4096.sample_rate,rโ set sample rate of output audio stream, default is44100.nb_samples,nโ set number of samples per each frame in output audio stream. Default is1024.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 is1025.frequency,fโ set frequency points from where magnitude and phase are set. This must be in non decreasing order, and first element must be0, while last element must be1. Elements are separated by white spaces.magnitude,mโ set magnitude value for every frequency point set byfrequency. 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 byfrequency. Number of values must be same as number of frequency points. Values are separated by white spaces.sample_rate,rโ set sample rate, default is44100.nb_samples,nโ set number of samples per each frame. Default is1024.win_func,wโ set window function. Default isblackman.
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 thechannel_layout_mapdefinition inlibavutil/channel_layout.cfor the mapping between strings and channel layout values, iykyk.sample_rate,rโ the sample rate. Defaults to44100.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 theffmpeg-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
48000Hz and the channel layout toAV_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 to1, list the names of the available voices and exit immediately. Default value is0.nb_samples,nโ set the maximum number of samples per frame. Default value is512.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 thelist_voicesoption ๐
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 is48000Hz.amplitude,aโ specify the amplitude (0.0-1.0) of the generated audio stream. Default value is1.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 arewhite,pink,brown,blue,violetandvelvet. Default color iswhite.seed,sโ specify a value used to seed the PRNG.nb_samples,nโ set the number of samples per each output frame, default is1024.densityโ set the density (0.0-1.0) for the velvet noise generator, default is0.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 is44100.taps,tโ set length of FIR filter, default is22051.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 is44100.nb_samples,nโ set number of samples per each frame. Default is1024.hpโ set high-pass frequency. Default is0.lpโ set low-pass frequency. Default is0. If high-pass frequency is lower than low-pass frequency and low-pass frequency is higher than0then filter will create band-pass filter coefficients, otherwise band-reject filter coefficients.phaseโ set filter phase response. Default is50. Allowed range is from0to100.betaโ set Kaiser window beta.attโ set stop-band attenuation. Default is120dB, allowed range is from40to180dB.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 is440Hz.beep_factor,bโ enable a periodic beep every second with frequencybeep_factortimes the carrier frequency. Default is0, meaning the beep is disabled.sample_rate,rโ specify the sample rate, default is44100.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 from0.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 is2. Allowed range is from1to63. For example, a radius of3tells the filter to calculate the average of7frames. ๐ซถfactorโ sets the factor to amplify the difference. Default is2. Allowed range is from0to65535.thresholdโ sets the threshold for difference amplification. Any difference greater or equal to this value will not alter the source pixel. Default is10. Allowed range is from0to65535.toleranceโ sets the tolerance for difference amplification. Any difference lower than this value will not alter the source pixel. Default is0. Allowed range is from0to65535.lowโ sets the lower limit for changing the source pixel. Default is65535. Allowed range is from0to65535. 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 is65535. Allowed range is from0to65535. 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 from0to15.
Commands ๐ฎ
This filter supports the following commands that correspond to the option of the same name:
factorthresholdtolerancelowhighplanes
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 is0.02. Valid range is0to0.3.0bโ sets threshold B for the 1st plane. Default is0.04. Valid range is0to5.1aโ sets threshold A for the 2nd plane. Default is0.02. Valid range is0to0.3.1bโ sets threshold B for the 2nd plane. Default is0.04. Valid range is0to5.2aโ sets threshold A for the 3rd plane. Default is0.02. Valid range is0to0.3.2bโ sets threshold B for the 3rd plane. Default is0.04. Valid range is0to5.
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 is9. 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 isp(parallel). Alternatively it can be set tos(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 is32767. Valid range is from0to32767. 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 to0effectively 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 assizeX. Default is0.
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 is16.
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 is0to512. Default is0.1.sigmaRโ sets sigma of the gaussian function used to calculate the range weight. Allowed range is0to1. Default is0.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 is1.filterโ filters out noisy pixels from thebitplaneset 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 to98.threshold,threshโ the threshold below which a pixel value is considered black; it defaults to32.
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 ofall_mode. Default value isnormal.
Available values for component modes are:
additionandaveragebleachburndarkendifferencedividedodgeexclusionextremityfreezegeometricglowgrainextractgrainmergehardlighthardmixhardoverlayharmonicheatinterpolatelightenlinearlightmultiplymultiply128negationnormaloroverlayphoenixpinlightreflectscreensoftdifferencesoftlightstainsubtractvividlightxorc0_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 useall_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 withall_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 from0X,Yโ the coordinates of the current sampleW,Hโ the width and height of the currently filtered planeSW,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 ayuv420pframe the values are1,1for the luma plane and0.5,0.5for the chroma planesTโ time of the current frame, expressed in secondsTOP,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 than1, 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 than1, 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 is1. Allowed range is from0to999.9. Ngl the denoising algorithm is very sensitive tosigma, 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 is4. Allowed range is from1to64. Smaller values allow processing more reference blocks and are slower. ๐ญgroupโ set the maximal number of similar blocks for the 3rd dimension. Default value is1. When set to1, no block matching is done. Larger values allow more blocks in a single group. Allowed range is from1to256.rangeโ set the radius for search block matching. Default is9. Allowed range is from1toINT32_MAX.mstepโ set the step between two search locations for block matching. Default is1. Allowed range is from1to64. Smaller is slower. ๐thmseโ set the threshold of mean square error for block matching. Valid range is0toINT32_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 bebasicorfinal. Default isbasic.refโ if enabled, the filter will use the 2nd stream for block matching. Default is disabled for thebasicvalue of theestimoption, and always enabled if the value ofestimisfinal.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
nlmeansfilter 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,lrluma_power,lpchroma_radius,crchroma_power,cpalpha_radius,aralpha_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 pixelscw,chโ the input chroma image width and height in pixelshsub,vsubโ the horizontal and vertical chroma subsample values. For example, for the pixel formatyuv422p,hsubis2andvsubis1.
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_countfor 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 is0.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.01matches only the exact key color, while1.0matches literally everything.blendโ blend percentage.0.0makes 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 withyuvenabled 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 is30. Allowed range is from1to200.sizewโ sets the horizontal radius of the rectangle used for averaging. Allowed range is from1to100. Default is5.sizehโ sets the vertical radius of the rectangle used for averaging. Allowed range is from1to100. Default is5.stepwโ sets the horizontal step used when averaging. Default is1. Allowed range is from1to50. Mostly useful to speed-up filtering.stephโ sets the vertical step used when averaging. Default is1. Allowed range is from1to50. 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 is200. Allowed range is from1to200.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 is200. Allowed range is from1to200.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 is200. Allowed range is from1to200.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 besmear,default, orwarp.
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,470mebu,470bgsmpte240mapplewidergbcie1931rec709,hdtvuhdtv,rec2020dcip3
cieโ sets the CIE system. Possible values:xyyucsluv
gamutsโ sets which gamuts to draw. See thesystemoption for the available values.size,sโ sets the ciescope size, by default set to512.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 formvare:pfโ forward predicted MVs of P-framesbfโ forward predicted MVs of B-framesbbโ 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 theframe_typeoption. The available flags formv_typeare:fpโ forward predicted MVsbpโ backward predicted MVs
frame_type,ftโ sets the frame type to visualize motion vectors of. The available flags forframe_typeare: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 is0.0. Allowed range is from-1.0to1.0.gmโ sets the green-magenta contrast. Defaults is0.0. Allowed range is from-1.0to1.0.byโ sets the blue-yellow contrast. Defaults is0.0. Allowed range is from-1.0to1.0.rcw,gmw,bywโ sets the weight of eachrc,gm,byoption value. Default value is0.0. Allowed range is from0.0to1.0. If all weights are0.0, filtering is disabled. Iconic behavior honestly.plโ sets the amount of preserving lightness. Default value is0.0. Allowed range is from0.0to1.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.0to1.0. Default value is0.blโ sets the blue shadow spot. Allowed range is from-1.0to1.0. Default value is0.rhโ sets the red highlight spot. Allowed range is from-1.0to1.0. Default value is0.bhโ sets the blue highlight spot. Allowed range is from-1.0to1.0. Default value is0.saturationโ sets the amount of saturation. Allowed range is from-3.0to3.0. Default value is1.analyzeโ if set to anything other thanmanual, it will analyze every frame and use derived parameters for filtering the output frame. Possible values are:manualaverageminmaxmedian
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 is1forrr, and0forrg,rbandra.gr,gg,gb,gaโ Adjust contribution of input red, green, blue and alpha channels for output green channel. Default is1forgg, and0forgr,gbandga.br,bg,bb,baโ Adjust contribution of input red, green, blue and alpha channels for output blue channel. Default is1forbb, and0forbr,bgandba.ar,ag,ab,aaโ Adjust contribution of input red, green, blue and alpha channels for output alpha channel. Default is1foraa, and0forar,agandab.
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 is0.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 from0to360. Default value is0.saturationโ Set the color saturation. Allowed range is from0to1. Default value is0.5.lightnessโ Set the color lightness. Allowed range is from0to1. Default value is0.5.mixโ Set the mix of source lightness. By default is set to1.0. Allowed range is from0.0to1.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 to0(full transparency). See"Color"section in theffmpeg-utilsmanual. 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 is0.01to1.0.0.01matches within a very small radius around the exact key color, while1.0matches everything. Default is0.01.blendโ Set how the alpha value for pixels that fall outside the similarity radius is computed.0.0makes 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 is0.0to1.0. Default is0.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.01matches only the exact key color, while1.0matches everything.blendโ Blend percentage.0.0makes 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 are0.rimax,gimax,bimax,aimaxโ Adjust red, green, blue and alpha input white point. Allowed ranges for options are"[-1.0, 1.0]". Defaults are1.
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 are0.romax,gomax,bomax,aomaxโ Adjust red, green, blue and alpha output white point. Allowed ranges for options are"[0, 1.0]". Defaults are1.
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 is64.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:
euclideanweuclidean
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.709fccโ FCCbt601โ BT.601bt470โ BT.470bt470bgโ BT.470BGsmpte170mโ SMPTE-170Msmpte240mโ SMPTE-240Mbt2020โ 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.470Mbt470bgโ BT.470BGbt601-6-525โ BT.601-6 525bt601-6-625โ BT.601-6 625bt709โ BT.709smpte170mโ SMPTE-170Msmpte240mโ SMPTE-240Mbt2020โ BT.2020
spaceโ Specify output colorspace.
The accepted values are:
bt709โ BT.709fccโ FCCbt470bgโ BT.470BG or BT.601-6 625smpte170mโ SMPTE-170M or BT.601-6 525smpte240mโ SMPTE-240Mycgcoโ YCgCobt2020nclโ BT.2020 with non-constant luminance
trcโ Specify output transfer characteristics.
The accepted values are:
bt709โ BT.709bt470mโ BT.470Mbt470bgโ BT.470BGgamma22โ Constant gamma of 2.2gamma28โ Constant gamma of 2.8smpte170mโ SMPTE-170M, BT.601-6 625 or BT.601-6 525smpte240mโ SMPTE-240Msrgbโ 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.470Mbt470bgโ BT.470BG or BT.601-6 625smpte170mโ SMPTE-170M or BT.601-6 525smpte240mโ SMPTE-240Mfilmโ film ๐ฌsmpte431โ SMPTE-431smpte432โ SMPTE-432bt2020โ BT.2020jedec-p22โ JEDEC P22 phosphors
range โ sets the output color range. The accepted values are:
tvโ TV (restricted) range ๐บmpegโ MPEG (restricted) rangepcโ PC (full) range ๐ปjpegโ JPEG (full) range
format โ sets the output color format. Accepted values go like:
yuv420pโ YUV 4:2:0 planar 8-bitsyuv420p10โ YUV 4:2:0 planar 10-bitsyuv420p12โ YUV 4:2:0 planar 12-bitsyuv422pโ YUV 4:2:2 planar 8-bitsyuv422p10โ YUV 4:2:2 planar 10-bitsyuv422p12โ YUV 4:2:2 planar 12-bitsyuv444pโ YUV 4:4:4 planar 8-bitsyuv444p10โ YUV 4:4:4 planar 10-bitsyuv444p12โ 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 adaptationvonkriesโ von Kries whitepoint adaptationidentityโ 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 from1000to40000. Default is6500K ๐ก๏ธmixโ sets the mixing with the filtered output. Allowed range is from0to1. Default is1.plโ sets the amount of preserving lightness. Allowed range is from0to1. Default is0.
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 of9,25or49signed integers in square mode, and from1to49odd number of signed integers in row mode.0rdiv,1rdiv,2rdiv,3rdivโ set the multiplier for the calculated value for each plane. If unset or0, it will be1/sumof 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 is0.0.0mode,1mode,2mode,3modeโ set the matrix mode for each plane. Can besquare,roworcolumn. Default issquare.
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 befirstorall. Default isall.
Theconvolvefilter also supports theframesyncoptions ๐
๐ 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. Uselist_filtersto 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 namedefaultavailable 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 inyuv420.modeโ set the covering mode.
It accepts the following values:
coverโ cover it by the supplied imageblurโ 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 toiw. This expression is evaluated only once during the filter configuration, or when theworout_wcommand is sent.h,out_hโ the height of the output video. Defaults toih. This expression is evaluated only once during the filter configuration, or when thehorout_hcommand 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 to1it will force the output display aspect ratio to be the same as the input, by changing the output sample aspect ratio. Defaults to0.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 to0.
The out_w, out_h, x, y parameters are expressions containing the following constants:
x,yโ the computed values forxandy. They are evaluated for each new frame.in_w,in_hโ the input width and height.iw,ihโ these are the same asin_wandin_h.out_w,out_hโ the output (cropped) width and height.ow,ohโ these are the same asout_wandout_h.aโ same asiw/ihsarโ input sample aspect ratiodarโ input display aspect ratio, it is the same as(iw / ih) * sarhsub,vsubโ horizontal and vertical chroma subsample values. For example for the pixel formatyuv422p,hsubis2andvsubis1.nโ the number of the input frame, starting from0.posโ the position in the file of the input frame,NANif unknown; deprecated, do not use ๐tโ the timestamp expressed in seconds. It'sNANif 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
100x100at 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/3of 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:100and the right-bottom corner corresponding to the right-bottom corner of the input image.
crop=in_w-100:in_h-100:100:100
- Crop
10pixels from the left and right borders, and20pixels 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
xdepending on the value ofy:
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 onmode, 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 optionlimit.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 (255for 8-bit based formats). An intensity value greater than the set value is considered non-black. It defaults to24. You can also specify a value between0.0and1.0which will be scaled depending on the bitdepth of the pixel format.roundโ the value which the width/height should be divisible by. Defaults to16. The offset is automatically adjusted to center the video. Use2to get only even dimensions (needed for 4:2:2 video).16is best when encoding to most video codecs.skipโ set the number of initial frames for which evaluation is skipped. Default is2. Range is0toINT_MAX.reset_count,resetโ set the counter that determines after how many framescropdetectwill reset the previously detected largest video area and start over to detect the current optimal crop area. Default value is0.
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 to8.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 is0.prerollโ the duration of content to pass on as preroll, expressed in seconds. Default is0.bufferโ the maximum duration of content to buffer before waiting for the cue, expressed in seconds. Default is0.
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 ther,g,bparameters; in this case, the later options take priority on the preset values. available presets are:nonecolor_negativecross_processdarkerincrease_contrastlighterlinear_contrastmedium_contrastnegativestrong_contrastvintage
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 withr,g,borallsince 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 includingmaster). can be used in addition to the other key points component options. in this case, the unset component(s) will fallback on thisallsetting.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 usingffmpegandgnuplot:
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 is45.radiusโ set radius of directional blur. default is5.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<<ndefines 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 is0.02. valid range is0.00003to0.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 is16. 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,-PIor-2*PIradians will pick only pixels on same row and-PI/2will 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 beweakorstrong. default isstrong. this controls what kind of deblocking is applied.blockโ set size of block, allowed range is from4to512. default is8.alpha,beta,gamma,deltaโ set blocking detection thresholds. allowed range is0to1. defaults are:0.098foralphaand0.05for the rest. using higher threshold gives more deblocking strength. settingalphacontrols 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 to0disables 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 is5.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 is1.1.scthreshโ sets the scene change threshold. Default is15.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 is32.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 to1, the first stream is the pre-processed input and the second stream is the clean source from where the kept frames are chosen. Default is0.chromaโ sets whether chroma is considered in the metric calculations or not. Default is1.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 befirstorall. Default isall.noiseโ sets the noise used when doing divisions. Default is0.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 ofdotcrawlfor cross-luminance reduction and/orrainbowsfor 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 is65535. If0, 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 is5. Allowed range is2-129.mode,mโ set the averaging mode for smoothing out those temporal luminance variations.
Available values are:
amโ Arithmetic meangmโ Geometric meanhmโ Harmonic meanqmโ Quadratic meancmโ Cubic meanpmโ Power meanmedianโ 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 supportscustom, that method is used; otherwise it falls back tobob. 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.
๐ delogo
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 to1, a green rectangle is drawn on the screen to simplify finding the rightx,y,w, andhparameters. The default value is0.
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,0and size100x77:
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:
- Recurrent Squeeze-and-Excitation Context Aggregation Net (RESCAN). See <http://openaccess.thecvf.com/content_ECCV_2018/papers/Xia_Li_Recurrent_Squeeze-and-Excitation_Context_ECCV_2018_paper.pdf>.
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 thedrawboxfilter, 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 range0-64pixels. Default is16.edgeโ specify how to generate pixels to fill blanks at the edge of the frame. Available values are:blank,0โ fill zeroes at blank locationsoriginal,1โ original image at blank locationsclamp,2โ extruded edge value at blank locationsmirror,3โ mirrored edge at blank locations
Default value is mirror.
blocksizeโ specify the blocksize to use for motion search. Range4-128pixels, default8.contrastโ specify the contrast threshold for blocks. Only blocks with more than the specified contrast (difference between darkest and lightest pixels) will be considered. Range1-255, default125.searchโ specify the search strategy. Available values are:exhaustive,0โ set exhaustive searchless,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-1for greenscreen.blueโ controls amount of blue in spill area. Should be-1for 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_fieldtop,tโ top field firstbottom,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 is23.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 is0.
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 is65535. If0, plane will remain unchanged.coordinatesโ flag which specifies the pixel to refer to. Default is255i.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 onlyopenvinonow, 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 id0, and the second line is the name of label id1, 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 onlyopenvinonow, 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 id0(usually it is'background'), and the second line is the name of label id1, 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-libtensorflowopenvinoโ 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 usetools/python/tf_sess_config.pyto 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 to0. ๐ซถwidth,w/height,hโ the expressions that specify the width and height of the box; if0they're interpreted as the input width and height. Defaults to0.color,cโ specify the color of the box to write. For the general syntax of this option, check the "Color" section in theffmpeg-utilsmanual. If the special valueinvertis 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 offillwill create a filled box. Default value is3. See below for the list of accepted constants.replaceโ applicable if the input has alpha. With value1, the pixels of the painted box will overwrite the video's color and alpha pixels. Default is0, 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 formatyuv422phsubis2andvsubis1.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 asside_data_detection_bboxesif 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 iswhite. ๐คmodeโ set graph mode. Available values formodeis:bardotline
Default is line.
slideโ set slide mode. Available values forslideis: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 theffmpeg-utilsmanual. The default value is900x256.rate,rโ set the output frame rate. Default value is25.
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 to0.width,w/height,hโ the expressions that specify the width and height of the grid cell, if0they're interpreted as the input width and height, respectively, minusthickness, so image gets framed. Default to0.color,cโ specify the color of the grid. For the general syntax of this option, check the "Color" section in theffmpeg-utilsmanual. If the special valueinvertis 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 is1. See below for the list of accepted constants.replaceโ applicable if the input has alpha. With1the pixels of the painted grid will overwrite the video's color and alpha pixels. Default is0, 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 formatyuv422phsubis2andvsubis1.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 either1(enable) or0(disable). The default value ofboxis0.boxborderwโ set the width of the border to be drawn around the box usingboxcolor. The value must be specified using one of the following formats:boxborderw=10โ set the width of all the borders to10boxborderw=10|20โ set the width of the top and bottom borders to10and the width of the left and right borders to20boxborderw=10|20|30โ set the width of the top border to10, the width of the bottom border to30and the width of the left and right borders to20boxborderw=10|20|30|40โ set the borders width to10(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 theffmpeg-utilsmanual. The default value ofboxcoloriswhite.line_spacingโ set the line spacing in pixels. The default value ofline_spacingis0.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 theyvalue is referred to. Possible values are:textโ the top of the highest glyph of the first text line is placed atybaselineโ the baseline of the first text line is placed atyfontโ the baseline of the first text line is placed atyplus 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 usingbordercolor. The default value ofborderwis0.bordercolorโ set the color to be used for drawing border around text. For the syntax of this option, check the "Color" section in theffmpeg-utilsmanual. The default value ofbordercolorisblack.expansionโ select how the text is expanded. Can be eithernone,strftime(deprecated) ornormal(default). See thedrawtext_expansion, Text expansion section below for details.basetimeโ set a start time for the count. Value is in microseconds. Only applied in the deprecatedstrftimeexpansion mode. To emulate in normal expansion mode use theptsfunction, supplying the start time (in seconds) as the second argument.
Ngl,strftimeis deprecated-deprecated. If you're reaching forbasetime, maybe consider theptsfunction route instead โ that's straight from the manual, not me being creative ๐
fix_boundsโ bestie, when this one'strueit 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 theffmpeg-utilsmanual.
The default value of fontcolor is black.
fontcolor_exprโ a string that gets expanded the same way astextto get a dynamic fontcolor value. By default this option is empty and just vibes, unprocessed. When you set it, it overrides thefontcoloroption. Main character energy fr fr โจfontโ the font family used for drawing text. By defaultSans. 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 between0.0and1.0. The expression accepts the same variablesx,yas well. The default value is1. Please seefontcolor_expr. She's transparent, she's layered, she contains multitudes ๐fontsizeโ the font size used for drawing text. The default value offontsizeis16.text_shapingโ if set to1, 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 default1(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:
defaultno_scaleno_hintingrenderno_bitmapvertical_layoutforce_autohintcrop_bitmappedanticignore_global_advance_widthno_recurseignore_transformmonochromelinear_designno_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 theffmpeg-utilsmanual.
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 ofboxwis 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 ofboxhis 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 is0.start_numberโ the starting frame number for then/frame_numvariable. The default value is0.tabsizeโ the size in number of spaces to use for rendering the tab. Default value is4.timecodeโ set the initial timecode representation inhh:mm:ss[:;.]ffformat. It can be used with or withouttextparameter.timecode_rateoption 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 is1. Drop-frame timecode is supported for frame rates30&60. Only those two, don't try it ๐tc24hmaxโ if set to1, the output of thetimecodeoption will wrap around at 24 hours. Default is0(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 parametertextfile.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 asside_data_detection_bboxesif 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โ thetextfilewill be reloaded at specified frame interval. Be sure to updatetextfileatomically, or it may be read partially, or even fail. Range is0toINT_MAX. Default is0. 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 formatyuv422phsubis2andvsubis1.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 toascent - 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 from0.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,NANif 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-1indicates 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: astrftimeC function format string. The format string is extended to support the variable%[1-6]Nwhich 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: astrftimeC function format string. The format string is extended to support the variable%[1-6]Nwhich prints fractions of the second with optionally specified number of digits. Same asgmtimebut 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 from0.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 positionx=100andy=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_LINEis 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
CREDITSoff 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_aand thefontsizevalue are included in theyoffset.
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_basenamemetadata onto each frame if such metadata exists. Otherwise, plot the string"NA". Note thatimage2demuxer must have option-export_path_metadata 1for 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 is256.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 is1. Lowkey a tradeoff, highkey worth it.seed,sโ set a random seed, must be an integer included between0andUINT32_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โ setpal8output 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 eithernormalordiff. Default isnormal.
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:2for"2xEPX",3for"3xEPX". Default is3.
๐ 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.0to1000.0. The default value is"1".brightnessโ set the brightness expression. The value must be a float value in range-1.0to1.0. The default value is"0".saturationโ sets the saturation expression, bestie ๐ the value has to be a float in range0.0to3.0, and the default is"1".gammaโ sets the gamma expression, float in range0.1to10.0, default"1".gamma_rโ gamma expression for red specifically ๐น float in range0.1to10.0, default"1".gamma_gโ gamma expression for green ๐ float in range0.1to10.0, default"1".gamma_bโ gamma expression for blue ๐ซ float in range0.1to10.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 range0.0to1.0. At0.0the gamma correction is turned all the way down, at1.0it'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,NANif unspecified. deprecated, do not use ๐ฉrโ frame rate of the input video,NANif the input frame rate is unknown.tโ timestamp expressed in seconds,NANif 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 thegamma_rexpression.gamma_gโ set thegamma_gexpression.gamma_bโ set thegamma_bexpression.gamma_weightโ set thegamma_weightexpression.
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 is65535. If0, that plane stays unchanged.coordinatesโ flag specifying which pixels to refer to. Default is255, 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 is1. Allowed range is1to15.redgeโ search radius for best edge matching. Default value is2. Allowed range is0to15.ecostโ edge cost for edge matching. Default value is2. Allowed range is0to50.mcostโ middle cost for edge matching. Default value is1. Allowed range is0to50.dcostโ distance cost for edge matching. Default value is1. Allowed range is0to50.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.0to3.0EV. Default value is0EV.blackโ set the black level correction. Allowed range is from-1.0to1.0. Default value is0.
๐ฌ 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:
yuvargb
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 is0.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 is25.alphaโ if set to1, fade only the alpha channel, if one exists on the input. Default value is0.start_time,stโ the timestamp (in seconds) of the frame to start applying the fade effect. If bothstart_frameandstart_timeare specified, the fade will start at whichever comes last. Default is0.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 bothdurationandnb_framesare specified,durationis used. Default is0(nb_framesis 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
100x100with thegblurfilter:
[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
100x100with thedrawboxfilter:
[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
100x100with thepixelizefilter:
[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 is1. Allowed range is from0to30. 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 is1. Allowed range is from0to1.blockโ set the size of the block in pixels. Default is32, can be8to256.overlapโ set the block overlap. Default is0.5. Allowed range is from0.2to0.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 to0.nextโ set the number of next frames to use for denoising. By default it's set to0.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 range0to1000. Default is0, no cap.dc_Uโ same deal but for the 1st chroma plane ๐. Integer in range0to1000, default0.dc_Vโ and this one's for the 2nd chroma plane ๐ฉท. Integer in range0to1000, default0.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 from0.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 is0or"top") or the bottom field (if the value is1or"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.pcmode 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_ubmode 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 betweenpcandpcn_ubin 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 theclip2feature 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 asorder, 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 asorder).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 to0only if your clip has bad chroma problems such as heavy rainbowing or other artifacts ๐. Setting it to0could 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 betweeny0andy1from 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 ๐ .y0sets the starting scan line andy1sets the ending line; all lines in betweeny0andy1(includingy0andy1) get ignored. Settingy0andy1to the same value disables the feature.y0andy1default to0.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 casecombmatch=sc. The range forscthreshis"[0.0, 100.0]".
Default value is 12.0.
combmatchโ whencombatch(yep, the page spells it that way in this one spot ๐) is notnone,fieldmatchwill 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โ forcesfieldmatchto calculate the combed metrics for certain matches and print them ๐. This setting is known asmicoutin 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 pixelsmirrorโ fill pixels using mirroring (half sample symmetric)fixedโ fill pixels with constant valuereflectโ fill pixels using reflecting (whole sample symmetric)wrapโ fill pixels using wrappingfadeโ fade pixels to constant valuemarginsโ fill pixels at top and bottom with weighted averages pixels near borders
Default is smear.
colorโ Set color for pixels infixedorfademode. Default isblack.
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 objectlavfi.rect.hโ height of objectlavfi.rect.xโ x position of objectlavfi.rect.yโ y position of objectlavfi.rect.scoreโ match score of the found object
It accepts the following options:
objectโ Filepath of the object image, needs to be ingray8.thresholdโ Detection threshold, expressed as a decimal number in the range0-1. A threshold value of0.01means only exact matches, a threshold of0.99means almost everything matches. Default value is0.5.mipmapsโ Number of mipmaps, default is3.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
ffprobeand 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
yuv420pformat
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 ratentscโ NTSC frame rate of30000/1001palโ PAL frame rate of25.0filmโ film frame rate of24.0ntsc_filmโ NTSC-film frame rate of24000/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 to0to 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 0infโ round away from 0downโ round towards -infinityupโ round towards +infinitynearโ 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 framespassโ 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 otherlinesโ the views are packed by linecolumnsโ the views are packed by columnframeseqโ 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 is50.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 is15.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 is240.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 is8.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 optionscene. 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 everystepframes. Allowed values are positive integers higher than 0. Default value is1.
๐ง 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 casedBis appended to the specified value) or as a difference ratio between 0 and 1. Default is-60dB, or0.001.duration,dโ set freeze duration until notification (default is2seconds).
๐ฅถ 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 variableFREI0R_PATHis defined, the frei0r effect is searched for in each of the directories specified by the colon-separated list inFREI0R_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
distort0reffect, setting the first two double parameters:
frei0r=filter_name=distort0r:filter_params=0.5|0.01
- Apply the
colordistanceeffect, taking a color as the first parameter:
frei0r=colordistance:0.2/0.3/0.4
frei0r=colordistance:violet
frei0r=colordistance:0x112233
- Apply the
perspectiveeffect, 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 range4-5. Default value is4.qpโ force a constant quantization parameter. It accepts an integer in range0-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-15to32. Lower values mean more details but also more artifacts, while higher values make the image smoother but also blurrier. Default value is0โ PSNR optimal.use_bframe_qpโ enable the use of the QP from the B-Frames if set to1. Using this option may cause flicker since the B-Frames have often larger QP. Default is0(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 is0.5.stepsโ how many steps the Gaussian approximation gets. Default is1. 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 from0.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. Returns0if there's no such plane.cr(x, y)โ returns the value of the pixel at location (x,y) of the red-difference chroma plane. Returns0if 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. Returns0if there's no such component.alpha(x, y)โ returns the value of the pixel at location (x,y) of the alpha plane. Returns0if 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 thesumpostfix.interpolationโ set one of the interpolation methods:nearest,nbilinear,b
Default is bilinear.
For these functions, ifxandyland 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
vignettefilter, 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.51to64; the default value is1.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 are8-32; the default value is16. 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.5strength and radius of8:
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 ishd720.opacity,oโ set video opacity. Default is0.9. Allowed range is from0to1.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 is25. 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 ๐ซถ
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 is1.minknormโ the Minkowski parameter used for calculating the Minkowski distance. Must be chosen in the range[0,20]and the default value is1. Set it to0to 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 is1.floor( sigma * break_off_sigma(3) )can't be equal to0ifdiffordis greater than0. 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 is1to20. Default is3.epsโ set the regularization parameter (with square). Allowed range is0to1. Default is0.01.modeโ set the filter mode. Can be"basic"or"fast". Default is"basic".subโ set the subsampling ratio for"fast"mode. Range is2to64. Default is4. 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
- Dehazing, structure-transferring filtering, detail enhancement with guided filter. For making the guidance image, go read the paper "Guided Image Filtering" fr โ it's right here: <http://kaiminghe.com/publications/pami12guidedfilter.pdf>.
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 arefirstorall. Default isall.shortestโ force it to stop when the shortest input stops. Default is0.repeatlastโ keep applying that last CLUT after the stream ends. A value of0disables the filter once the last frame of the CLUT is hit. Default is1.
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 to0.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 to0.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 arenone,weakorstrong. Defaults tonone.
๐ 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 is200. Allowed range is[50, 2048].scale_heightโ set the height of the color scale. Default value is12. 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 inparade, except the graphs representing color components are superimposed directly over one another.
Default is stack.
levels_modeโ set the mode. Can be eitherlinearorlogarithmic. Default islinear.componentsโ set which color components to display. Default is7.fgopacityโ set the foreground opacity. Default is0.7.bgopacityโ set the background opacity. Default is0.5.colors_modeโ set the colors mode. It accepts these values:whiteonblackblackonwhitewhiteongrayblackongraycoloronblackcoloronwhitecolorongrayblackoncolorwhiteoncolorgrayoncolor
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 to4.0.chroma_spatialโ a non-negative floating point number that specifies spatial chroma strength. Defaults to3.0*luma_spatial/4.0.luma_tmpโ a floating point number that specifies luma temporal strength. Defaults to6.0*luma_spatial/4.0.chroma_tmpโ a floating point number that specifies chroma temporal strength. Defaults toluma_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
hwmapfilter can be used again in the next mode to retrieve it.
- 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
- 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
hwuploadfilter, 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_deviceoption. 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.
- A device must be supplied for the output, either directly or with the
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_devicetype โ 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_devicetype โ 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:2forhq2x,3forhq3x, and4forhq4x. Default is3.
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 is2.shortestโ if set to1, forces the output to terminate when the shortest input terminates. Default value is0.
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-360to360. Default value is0.satโ sets the saturation value used in the color difference calculation. Allowed range is from-1to1. Default value is0.valโ sets the value used in the color difference calculation. Allowed range is from-1to1. Default value is0.similarityโ sets the similarity percentage with the key color. Allowed range is from0to1. Default value is0.01.
0.00001 matches only the exact key color, while 1.0 matches literally everything.
blendโ blend percentage. Allowed range is from0to1. Default value is0.
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-360to360. Default value is0.satโ sets the saturation value used in the color difference calculation. Allowed range is from-1to1. Default value is0.valโ sets the value used in the color difference calculation. Allowed range is from-1to1. Default value is0.similarityโ sets the similarity percentage with the key color. Allowed range is from0to1. Default value is0.01.
0.00001 matches only the exact key color, while 1.0 matches everything.
blendโ blend percentage. Allowed range is from0to1. Default value is0.
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:handHare 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 from0.ptsโ presentation timestamp of the input frame, expressed in time base units.rโ frame rate of the input video,NANif the input frame rate is unknown.tโ timestamp expressed in seconds,NANif 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:
bshH
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 is0. Allowed range is from-180to180.saturationโ sets the saturation shift. Default is0. Allowed range is from-1to1.intensityโ sets the intensity shift. Default is0. Allowed range is from-1to1.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 from0to100. Default value is1.rw,gw,bwโ set the weight for each RGB component. Allowed range is from0to1. By default it's set to0.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 is0xf, 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 is0.
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 containunknown. Enabled by default.
iccgen ๐จ
Generates ICC profiles and attaches them to frames.
This filter accepts the following options:
color_primariescolor_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'', orundetermined''.
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 detectionmultiple.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, orundetermined๐ฆmultiple.bffโ cumulative count of bottom-field-first frames, multiple-frame detectionsingle.progressiveโ cumulative count of frames detected as progressive, single-frame detectionmultiple.progressiveโ same thing but via multiple-frame detectionsingle.undeterminedโ cumulative count of frames that single-frame detection literally could not classify ๐ญmultiple.undeterminedโ same, multiple-frame detectionrepeated.current_frameโ which field in the current frame is repeated from the last one. One ofneither,top, orbottomrepeated.neitherโ cumulative number of frames with no repeated fieldrepeated.topโ cumulative number of frames whose top field is repeated from the previous frame's top fieldrepeated.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 thresholdprog_thresโ set the progressive thresholdrep_thresโ threshold for repeated field detectionhalf_lifeโ number of frames after which a given frame's contribution to the statistics is halved (so it only contributes0.5to its classification). Default is0, which means every frame ever seen keeps its full weight of1.0forever, iconic commitment ๐ซถanalyze_interlaced_flagโ when this is not0,idetuses 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 dropidetin 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,lchroma_mode,calpha_mode,a
Available values for luma_mode, chroma_mode and alpha_mode are:
noneโ do nothingdeinterleave,dโ deinterleave fields, placing one above the otherinterleave,iโ interleave fields, reversing the effect of deinterleaving
Default value is none.
luma_swap,lschroma_swap,csalpha_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:
threshold0threshold1threshold2threshold3
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 framelowpassโ vertical lowpass filter to avoid twitter interlacing and reduce moire patterns ๐0,offโ disable vertical lowpass filter1,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 to10. A value of0means the process gets applied to every pixel, go off ๐ญmapโ paint pixels exceeding the threshold value to white if set to1. Default is0.orderโ set the fields order. Swap fields if set to1, leave fields alone if0. Default is0.sharpโ enable additional sharpening if set to1. Default is0.twowayโ enable twoway sharpening if set to1. Default is0.
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 is0xf, meaning all planes get processedscaleโ set the value that gets multiplied with the filtered resultdeltaโ 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 from0to1planesโ set which planes to filter. Default is all. Allowed range is from0to15
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 is0.5cyโ 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 is0.5k1โ coefficient of the quadratic correction term. Range is[-1,1].0means no correction. Default is0k2โ coefficient of the double quadratic correction term. Range is[-1,1].0means no correction. Default is0iโ set the interpolation type. Can benearestorbilinear. Default isnearestfcโ specify the color of the unmapped pixels. For the syntax of this option, check theColorsection in the ffmpeg-utils manual. Default color isblack@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. Default18.apertureโ the aperture of the image/video (expected constant for video). Note that aperture is only used for vignetting correction. Default3.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 is1000).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 of0means a value is chosen automatically such that there's little or no unmapped area in the output image.1.0means 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)fisheyepanoramicequirectangularfisheye_orthographicfisheye_stereographicfisheye_equisolidfisheye_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:nearestlinear(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 theidxvariable, 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 areiwandih. 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)/2and(ih-ch)/2.crop_w,crop_hโ set the input crop width/height expressions. Default values areiwandih.pos_x,pos_yโ set the output placement x/y expressions. Default values are(ow-pw)/2and(oh-ph)/2.pos_w,pos_hโ set the output placement width/height expressions. Default values areowandoh.rotateโ rotate the input frame clockwise by the specified angle. Options are:0,36090180270
fpsโ set the output frame rate. Can be rational, e.g.60000/1001. If you set it to the special stringnone(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 theframe_mixeroption.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 thatforce_divisible_byalso works withfit_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โ likereset_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 withfit_mode. Disabled by default.pad_crop_ratioโ specifies a ratio (between0.0and1.0) between padding and cropping when the input aspect ratio doesn't match the output aspect ratio andnormalize_saris in effect. The default of0.0always pads the content with black borders, while1.0always 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 bypos_x/yandpos_w/h). The names and their implementations are taken from the CSS 'object-fit' property. Note that this option is mutually exclusive withnormalize_sar. Defaults tofill. Valid values:fillโ stretch the input to the output rectangle, ignoring aspect ratio mismatches. Note that unlessreset_saris 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 tonormalize_sarwithpad_crop_ratioset to0.0.coverโ scale the input to fill the output, preserving aspect ratio by cropping. Equivalent tonormalize_sarwithpad_crop_ratioset to1.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 eithercontainornone, depending on whether the input is larger than the output or not.
fit_senseโ whenfit_modeis in use, this option controls how the fit strategy is applied against the specified output resolution. Mutually exclusive withforce_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 ofnormalize_sar. For the general syntax of this option, check the "Color" section in the ffmpeg-utils manual. Defaults toblack@0.corner_roundingโ render frames with rounded corners. ๐ The value, given as a float ranging from0.0to1.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 to0.0.lutโ specifies a custom LUT (in Adobe.cubeformat) to apply to the colors as part of color conversion. The exact interpretation depends on the value oflut_type.lut_typeโ controls the interpretation of color values fed to and from the LUT specified aslut. Valid values:autoโ chooses the interpretation of the LUT automatically from tagged metadata, and otherwise falls back tonative. (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 ofkey=valuepairs 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 thesetparamsfilter 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,cwandcrop_h,chโ the computed values ofcrop_wandcrop_h.pos_w,pwandpos_h,phโ the computed values ofpos_wandpos_h.in_t,tโ the input frame timestamp, in seconds.NANif input timestamp is unknown.out_t,otโ the input frame timestamp, in seconds.NANif input timestamp is unknown.nโ the input frame number, starting with0.
โจ 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 (between0.0and1.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 theyadiffilter for more details.bwdifโ bob weaver deinterlacing filter. see thebwdiffilter 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 range1to4. defaults to1.deband_thresholdโ debanding filter strength. higher numbers lead to more aggressive debanding. defaults to4.0.deband_radiusโ debanding filter radius. a higher radius is better for slow gradients, while a lower radius is better for steep gradients. defaults to16.0.deband_grainโ amount of extra output grain to add. helps hide imperfections. defaults to6.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.0and1.0. defaults to0.0.contrastโ contrast gain, between0.0and16.0. defaults to1.0.saturationโ saturation gain, between0.0and16.0. defaults to1.0.hueโ hue shift in radians, between-3.14and3.14. defaults to0.0. this will rotate the UV subvector, defaulting to BT.709 coefficients for RGB inputs.gammaโ gamma adjustment, between0.0and16.0. defaults to1.0.temperatureโ color temperature adjustment. lower values make the output warmer/redder, down to1667, while higher values make the output cooler/bluer, up to25000. defaults to6500(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", between0.0and10.0. a value of1.0results in no change to color vision. a value of0.0(the default) simulates complete loss of those cones. values above1.0result 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, between0.0and1000.0. Higher values mean peak detection gets less responsive to changes in the input. Defaults to20.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 between0.0and100.0. Default to1.0and3.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 to99.995, a pretty conservative value. Setting this to100.0disables 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 toperceptualbut 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 to1.0for 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 to1.0, rather than the value of0.5from 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 to0.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 of0.5implies that the reference white will be about half as bright as when clipping. Defaults to0.5, which results in the simplest formulation of this function.mobiusโ Generalization of thereinhardtone 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 near1.0make this curve behave likeclip, while values near0.0make this curve behave likereinhard. The default value is0.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 toreinhardwith parameter0.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 to0.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 to1.0.
tonemapping_paramโ For tunable tone mapping functions, this parameter can be used to fine-tune the curve behavior. Refer to the documentation oftonemapping. The default value of0.0is 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, between2and1024. Defaults to256. Note that this figure is squared when combined withpeak_detect.contrast_recoveryโ Contrast recovery strength. If set to a value above0.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 to0.30.contrast_smoothnessโ Contrast recovery lowpass kernel size. Defaults to3.5. Increasing or decreasing this will affect the visual appearance substantially. Has no effect whencontrast_recoveryis 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 of6. Texture-less.whiteโ Dither with white noise. Texture-less.
dither_lut_sizeโ Dither LUT size, as log base2 between1and8. Defaults to6, corresponding to a LUT size of64x64.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, orsub).poolโ Set the pool method to be used for computing vmaf. Options aremin,harmonic_meanormean(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.mpgis compared with a reference filereference.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-1will result in infinite loops. Default is0.sizeโ Set maximal size in number of frames. Default is0.startโ Set first frame of loop. Default is0.timeโ Set the time of loop start in seconds. Only used if option namedstartis 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โ Iridascspโ 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โ AfterEffectscubeโ Iridasdatโ DaVincim3dโ Pandoracspโ 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 is0.toleranceโ Set the range of luma values to be keyed out. Default value is0.01.softnessโ Set the range of softness. Default value is0. 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 expressionc1โ set second pixel component expressionc2โ set third pixel component expressionc3โ set fourth pixel component expression, corresponds to the alpha componentrโ set red component expressiongโ set green component expressionbโ set blue component expressionaโ alpha component expressionyโ set Y/luma component expressionuโ set U/Cb component expressionvโ 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 theminval-maxvalrange.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 theminval-maxvalrange; it corresponds to the expressionmaxval-clipval+minval.clip(val)โ The computed value inval, clipped to theminval-maxvalrange.gammaval(gamma)โ The computed gamma correction value of the pixel component value, clipped to theminval-maxvalrange. It corresponds to the expressionpow((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 expressionc1โ set second pixel component expressionc2โ set third pixel component expressionc3โ set fourth pixel component expression, corresponds to the alpha componentdโ set output bit depth, only available for thelut2filter. By default it's0, 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 is0.overshootโ default value is0.planesโ set which planes will be processed as bitmap, unprocessed planes will be copied from first stream. By default value0xf, 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 value0xf, 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 value0xf, 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 value0xf, 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 value0xf, all planes will be processed.modeโ set mode of filter operation. Can beabsordiff. Default isabs.
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 to0.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 byfilloption. Typically useful for scene changes when used in combination withtblendfilter.
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:
fastmediumslowโ use iterative motion estimationextra_slowโ likeslow, 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 first1,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 is1. Allowed range is integer from1to127.planesโ set which planes to process. Default is15, which is all available planes.radiusVโ set vertical radius size. Default value is0. Allowed range is integer from0to127. If it is0, value will be picked from horizontalradiusoption.percentileโ set median percentile. Default value is0.5. Default value of0.5will pick always median values, while0will pick minimum values, and1maximum 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 is0.
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 isyuva444p.map0s,map1s,map2s,map3sโ set input to output stream mapping for output Nth plane. Default is0.map0p,map1p,map2p,map3pโ set input to output plane mapping for output Nth plane. Default is0.
Examples
- Merge three gray video streams of same width and height into a single video stream:
[a0][a1][a2]mergeplanes=0x001020:yuv444p
- Merge 1st
yuv444pstream and 2nd gray video stream into ayuva444pvideo stream:
[a0][a1]mergeplanes=0x00010210:yuva444p
- Swap Y and A plane in
yuva444pstream:
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
yuv420pstream:
format=yuv420p,mergeplanes=0x000201:yuv420p
- Cast a
rgb24clip toyuv444p:
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. Default16.search_paramโ Search parameter. Default7.
๐ 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. Only8and16are supported. Default16.
๐ฌ 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 is15, 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 iffpsis lower than source fps. Default60.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. Default16.search_paramโ Motion estimation search parameter. Default32.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 is0(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 satisfiesscd_thresholdscene change is detected.
Default method is fdiff.
scd_thresholdโ Scene change detection threshold. Default is10.
๐ 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 to2.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 defaultscaleis auto scaled to sum of weights.planesโ Set which planes to filter. Default is all. Allowed range is from0to15.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-1to1. Default value is0.crโ Set the chroma red spot. Allowed range is from-1to1. Default value is0.sizeโ Set the color filter size. Allowed range is from.1to10. Default value is1.highโ Set the highlights strength. Allowed range is from0to1. Default value is0.
๐ฌ 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:erodedilateopenclosegradienttophatblackhat
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 befirstorall. Default isall.
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 is0, the frame is dropped disregarding the number of previous sequentially dropped frames. Default value is0.keepโ Set the maximum number of consecutive similar frames to ignore before to start dropping them. If the value is0, the frame is dropped disregarding the number of previous sequentially similar frames. Default value is0.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 is1. Allowed range is0to9.offsetโ sets the offset applied to the second video stream. Default is0.5. Allowed range is-1to1.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:yuvargb
negate_alphaโ with a value of1it negates the alpha component, if there is one. Default value is0.
๐ซ 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 is1.0. Must be in range[1.0, 30.0].pโ set the patch size. Default is7. Must be an odd number in range[0, 99].pcโ same aspbut for the chroma planes. The default value is0, which means automatic.rโ set the research size. Default is15. Must be an odd number in range[0, 99].rcโ same asrbut for the chroma planes. The default value is0, 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.bindeintโ 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:s8x6s16x6s32x6s48x6s8x4s16x4s32x4
nnsโ set the number of neurons in the predictor neural network. Can be one of:n16n32n64n128n256
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 errors,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:
noneoriginalnewnew2new3
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, likepix_fmts=yuv420p|monow|rgb24".
๐ธ Examples ๐ธ
- Force libavfilter to use a format different from
yuv420pfor the input to thevflipfilter:
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 ofall_seed. Default value is123457.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 ofall_strength. Default value is0. 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 ofall_flags. Available values for component flags are:aโ averaged temporal noise (smoother)pโ mix random noise with a (semi)regular patterntโ 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 toblackpt. The maximum input value gets mapped towhitept. The defaults are black and white respectively. Specifying white forblackptand black forwhiteptwill 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 thesmoothingprevious frames. The default is0(no temporal smoothing).independenceโ controls the ratio of independent (color shifting) channel normalization to linked (color preserving) normalization.0.0is fully linked,1.0is fully independent. Defaults to1.0(fully independent).strengthโ overall strength of the filter.1.0is full strength.0.0is a rather expensive no-op. Defaults to1.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 useconfig=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 withview.viewโ set the view colorspace, used in combination withdisplay.inverseโ when used in combination withdisplayandview, 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 torgb24,rgba,rgb48,rgba48,gbrp10,gbrp12,gbrpf32le,gbrapf32le. For most encoding we would recommendrgb48๐ (like, genuinely,rgb48is the moment).context_paramsโ lets you add extra context parameters to the OCIO filter ๐ธ it's a list ofkey=valuepairs, 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 forx, andyare 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 bestraightorpremultiplied, orautoto choose the alpha mode automatically. Default isauto๐
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 forxandy. 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"hsubis2andvsubis1๐nโ the number of input frame, starting from0โญposโ the position in the file of the input frame,NANif unknown; deprecated, do not use ๐ like fr fr, don't.tโ the timestamp, expressed in seconds. It'sNANif the input timestamp is unknown ๐ฆ
This filter also supports the framesync options.
Note that then,tvariables are available only when evaluation is done per frame, and will evaluate toNANwhenevalis set toinit๐
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 thexandyof 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_complexoption:
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
ffmpegtool 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
deshakefilter) with theffplaytool:
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
delogofilter 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 anintin the range8-16; default is8.luma_strength,lsโ sets the luma strength. Must be adoublevalue in the range0-1000; default is1.0.chroma_strength,csโ sets the chroma strength. Must be adoublevalue in the range0-1000; default is1.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 forwidthorheightis0, 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 ofwidthandheightis0.x/yโ the offsets for placing the input image inside the padded area, relative to the top/left border of the output image. Thexexpression can reference the value set by theyexpression, and vice versa. The default value ofxandyis0. Ifxoryevaluate 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 theColorsection in the ffmpeg-utils manual. The default value ofcolorisblack.evalโ when to evaluate thewidth,height,x, andyexpressions. 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 asin_wandin_h.out_w,out_hโ the output width and height (the size of the padded area), as specified by thewidthandheightexpressions.ow,ohโ these are the same asout_wandout_h.x,yโ thexandyoffsets as specified by thexandyexpressions, orNANif not yet specified.aโ same asiw / 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 formatyuv422p,hsubis2andvsubis1.
โจ Examples
- Add padding with the color
violetto the input video. The output video size is640x480, and the top-left corner of the input video is placed at column0, row40:
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/hratio of16: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
sarin 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 contain256colors; the unused palette entries will be black.reserve_transparentโ creates a palette of255colors 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 be256. 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โ ordered8x8bayer dithering (deterministic).heckbertโ dithering as defined by Paul Heckbert in1982(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 is2.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 is128.
โจ Examples
- Use a palette (generated for example with
palettegen) to encode a GIF usingffmpeg:
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 are0:0:W:0:0:H:W:Hand with those, perspective stays exactly as it was (no change, iconic). If thesenseoption is set tosource, then the points you specify get sent to the corners of the destination. Ifsenseis set todestination, 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:
linearcubic
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 coordinatesx0,y0,...x3,y3get 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 amongtandbmodes on a frame by frame basis using field flags. If no field information is available, then this works just likeu.uโ capture unknown or varying, transfer opposite. Filter selects amongtandbon 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 amongtandpusing image analysis.Bโ capture bottom-first, transfer unknown or varying. Filter selects amongbandpusing image analysis.Aโ capture determined by field flags, transfer unknown or varying. Filter selects amongt,bandpusing field flags and image analysis. If no field information is available, then this works just likeU. This is the default mode. ๐Uโ both capture and transfer unknown or varying. Filter selects amongt,bandpusing 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 is30.threshold,tโ set detection threshold factor. Default is1. Lower is stricter.skipโ set how many pixels to skip when sampling frames. Default is1. Allowed range is from1to1024.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 is16.mode,mโ set the mode of pixelization used.
Possible values are:
avgminmax
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 range0to63. 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 value0xf, 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 value0xf, 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 value0xf, 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 expressionc1โ set pixel second component expressionc2โ set pixel third component expressionc3โ set pixel fourth component expression, corresponds to the alpha componentindex,iโ set component to use as base for altering colorspreset,pโ pick one of built-in LUTs. By default is set tonone.
Available LUTs:
magmainfernoplasmaviridisturbocividisrange1range2shadowshighlightssolarnominalpreferredtotalspectralcoolheatfierybluesgreenhelix
opacityโ set opacity of output colors. Allowed range is from0to1. Default value is set to1.
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 is1.output_maxโ decides whether the max value gets dumped into the stats log. Default is0. Needsstats_version >= 2, periodt. If you set this andstats_versionis 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 matchstats_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 of8pixels, while top and bottom are in units of2lines. The default is8pixels on each side.sbโ set the strict breaks. Setting this option to1reduces 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-1makes 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 is0.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โ1if index is not129,0otherwise.qpโ sequential index starting from-129to128.
โจ 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. Theqrcode_widthexpression can reference the value set by thepadded_qrcode_widthexpression, and vice versa. By defaultpadded_qrcode_widthis set toqrcode_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. Thexexpression can reference the value set by theyexpression, 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 isL.
It accepts the following values:
LMQH
expansionโ select how the input text is expanded. Can be eithernone, ornormal(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 offoreground_colorisblack, the default value ofbackground_coloriswhite.
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 formatyuv422p,hsubis2andvsubis1.main_h,Hโ the input height.main_w,Wโ the input width.nโ the number of input frame, starting from0.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,NANif 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 thetextoption 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 thetextfileoption 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 theexprfunction. Arg two is the output format โ allowed values arex,X,dandu, 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]Nwhich prints fractions of the second with optionally specified number of digits. ๐ฐ๏ธlocaltimeโ literally the same vibe asgmtimebut 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]Nwhich 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.xlavfi.quirc.N.coreer.M.yโ the x/y positions of the four corners of the square containing the QR code, whereMis the index of the corner starting from 0. (yes,coreeris 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 is30. ๐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 is0. โฌ๏ธscan_maxโ set the line to end scanning for EIA-608 data. Default is29. โฌ๏ธspwโ set the ratio of width reserved for sync code detection. Default is0.27. Allowed range is"[0.1 - 0.7]". ๐chpโ enable checking the parity bit. In the event of a parity error, the filter will output0x00for that character. Default isfalse. ๐จ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-1the full video frame is scanned. Default is45. ๐thr_bโ set the luma threshold for black. Accepts float numbers in the range[0.0,1.0], default value is0.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 is0.6. The value must be equal or greater than"thr_b". ๐ค
bestie note: those two thresholds are a couple,thr_bcan never be bigger thanthr_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 said24โ Similar as 23.
๐ removelogo ๐
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 besmear,default, orwarp.
๐ 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 value0xf, 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 to1, a value of0disables it. Default value is1.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 theffmpeg-utilsmanual. 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 from0. It is alwaysNANbefore the first frame is filtered.tโ time in seconds of the input frame, it is set to0when the filter is configured. It is alwaysNANbefore the first frame is filtered.hsub,vsubโ horizontal and vertical chroma subsample values. For example for the pixel formatyuv422phsubis2andvsubis1.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 range0.1-4.0, default value is1.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 the0.1-2.0range, default value is1.0.luma_strength,lsโ set luma maximum difference between pixels to still be considered, must be a value in the0.1-100.0range, default value is1.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.0range.chroma_strength,csโ set chroma maximum difference between pixels to still be considered, must be a value in the-0.9-100.0range.
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 evaluatewidthandheightexpression. 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โ setlibswscalescaling flags. See theffmpeg-scalermanual for the complete list of values. If not explicitly specified the filter applies the default flags.param0,param1โ setlibswscaleinput parameters for scaling algorithms that need them. See theffmpeg-scalermanual 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 theffmpeg-utilsmanual.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,unknownleftcentertoplefttopbottomleftbottom
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 โจbt709bt470mbt470bgsmpte170msmpte240mfilmbt2020smpte428smpte431smpte432jedec-p22ebu3213
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 โจbt709bt470mgamma22bt470bggamma28smpte170msmpte240mlineariec61966-2-1srgbiec61966-2-4xvyccbt1361ebt2020-10bt2020-12smpte2084smpte428arib-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-1forworhโ 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 asin_wandin_h.out_w,out_hโ the output (scaled) width and height.ow,ohโ these are the same asout_wandout_h.aโ the same asiw / 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 formatyuv422p,hsubis 2 andvsubis 1.ohsub,ovsubโ horizontal and vertical output chroma subsample values. For example, for the pixel formatyuv422p,hsubis 2 andvsubis 1.nโ the (sequential) number of the input frame, starting from 0. Only available witheval=frame.tโ the presentation timestamp of the input frame, expressed as a number of seconds. Only available witheval=frame.posโ the position (byte offset) of the frame in the input stream, orNaNif this information is unavailable and/or meaningless (for example in case of synthetic video). Only available witheval=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
scaleandsetsar:
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 value0xf, 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 is0. Allowed range is from-1to1. Negative values change the scrolling direction.vertical,vโ set the vertical scrolling speed. Default is0. Allowed range is from-1to1. Negative values change the scrolling direction.hposโ set the initial horizontal scrolling position. Default is0. Allowed range is from0to1.vposโ set the initial vertical scrolling position. Default is0. Allowed range is from0to1.
๐ฎ 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 is10.. โจsc_pass,sโ sets the flag to pass scene change frames to the next filter. Default value is0. 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 than128)neutralsโ adjustments for all pixels except pure black and pure whiteblacksโ adjustments for black pixels (pixels where all components are lesser than128)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(setdaronly),sar(setsaronly) โ 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 value0is 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 is100.
The parameter sar is an expression containing the following constants:
w,hโ the input width and height.aโ same asw / 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 formatyuv422phsubis2andvsubis1. ๐
๐ 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).bt709unknownbt470mbt470bgsmpte170msmpte240mfilmbt2020smpte428smpte431smpte432jedec-p22
color_trcโ set the color transfer. Available values are:autoโ keep the same color trc property (default).bt709unknownbt470mbt470bgsmpte170msmpte240mlinearlog100log316iec61966-2-4bt1361eiec61966-2-1bt2020-10bt2020-12smpte2084smpte428arib-std-b67
colorspaceโ set the colorspace. Available values are:autoโ keep the same colorspace property (default).gbrbt709unknownfccbt470bgsmpte170msmpte240mycgcobt2020ncbt2020csmpte2085chroma-derived-ncchroma-derived-cictcp
chroma_locationโ set the chroma sample location. Available values are:autoโ keep the same chroma location (default).unspecified,unknownleftcentertoplefttopbottomleftbottom
alpha_modeโ set the alpha mode. Available values are:autoโ keep the same alpha mode (default).unspecified,unknownpremultipliedstraight
๐ shear
Apply shear transform to input video.
This filter supports the following options:
shxโ shear factor in X-direction. Default value is0. Allowed range is from-2to2.shyโ shear factor in Y-direction. Default value is0. Allowed range is from-2to2.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 valuenoneis selected then no background is printed (useful for example if the background is never shown). Default value isblack. ๐คinterpโ set interpolation type. Can bebilinearornearest. Default isbilinear.
๐ฎ 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 from0.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 formnum/den. ๐ฆsโ the size of the input frame. For the syntax of this option, check the "Video size" section in theffmpeg-utilsmanual. ๐iโ the type of interlaced mode (Pfor progressive,Tfor top field first,Bfor bottom field first).iskeyโ this is1if the frame is a key frame,0otherwise. ๐typeโ the picture type of the input frame (Ifor an I-frame,Pfor a P-frame,Bfor a B-frame, or?for an unknown type). Also refer to the documentation of theAVPictureTypeenum and of theav_get_picture_type_charfunction defined inlibavutil/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 is30(for a30x30pixel 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 beforwardorinversedirection. Default direction isforward.mode,mโ set shuffle mode. Can behorizontal,verticalorblockmode.width,wandheight,hโ set shuffleblock_size. In case ofhorizontalshuffle mode only thewidthpart of size is used, and in case ofverticalshuffle mode only theheightpart 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 setdirectiontoinverse. ๐ฒ
๐ธ 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โstatspecifies an additional form of image analysis.outoutputs 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 theoutoption. The default color isyellow. ๐
โจ 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 is1. ๐ข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%dor%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 is9000.th_dcโ threshold for detecting all words as similar. Integer greater than zero, please. Default is60000.th_xhโ threshold for detecting frames as similar. Integer greater than zero. Default is116.th_diโ the minimum length of a sequence (in frames) before it counts as a matching sequence. Gotta be a non-negative integer. Default is0.th_itโ the minimum relation that matching frames to all frames must have. Double value between0and1, periodt. Default is0.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.xmlandsignature1.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 to1, summary statistics get printed to the console. Default is0.
๐ 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 is1.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 is1.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 of0filters the whole image, values in[0,30]filter flat areas, and values in[-30,0]filter edges. Default is0.chroma_radius,crโ sets the chroma radius. Float in[0.1,5.0], same variance-of-the-gaussian-filter situation (slower if larger). Default isluma_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 isluma_strength.chroma_threshold,ctโ sets the chroma threshold, same coefficient logic. Integer in[-30,30]:0filters all the image,[0,30]filters flat areas,[-30,0]filters edges. Default isluma_threshold.alpha_radius,arโ sets the alpha radius. Float in[0.1,5.0], the gaussian variance thing again (larger = slower). Default isluma_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 isluma_strength.alpha_threshold,atโ sets the alpha threshold, coefficient-style. Integer in[-30,30]:0filters all the image,[0,30]filters flat areas,[-30,0]filters edges. Default isluma_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 is0xf, 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 range0-6. If it's0, the filter literally has no effect.6means the higher quality. Every increment of this value drops the speed by a factor of approximately2๐. Default is3.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 to1. Warning bestie: using this option may cause flicker, since B-Frames often have a larger QP. Default is0(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 currently6๐
sr ๐ง
Scales the input by applying one of the super-resolution methods based on convolutional neural networks. The supported models:
- Super-Resolution Convolutional Neural Network model (SRCNN). See
https://arxiv.org/abs/1501.00092. - Efficient Sub-Pixel Convolutional Neural Network model (ESPCN). See
https://arxiv.org/abs/1609.05158.
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:tensorflowโ the TensorFlow backend. To enable it you need to install the TensorFlow for C library (seehttps://www.tensorflow.org/install/lang_c) and configure FFmpeg with--enable-libtensorflow.
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 are2,3and4. Default is2. 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 thescalefilter.algorithmโ sets the algorithm used for scaling:bilinearโ Bilinearbicubicโ Bicubicsr1-0โ Video SR1.0. This is the default valuepointโ Pointsr1-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 isfalse.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 1Y,U,V,R,G,Bโ SSIM of the compared frames for the component specified by the suffixAllโ SSIM of the compared frames for the whole framedBโ 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
psnrandssimat 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 firsticrโ 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 firstchrโ checkerboard, right eye firsticlโ interleaved columns, left eye firsticrโ interleaved columns, right eye firsthdmiโ 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 theffmpeg-utilsmanual. 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.subtitlesfilter only. Only useful if not UTF-8.stream_index,siโ set subtitles stream index.subtitlesfilter only.force_styleโ override default style or script info parameters of the subtitles. It accepts a string containing ASS style formatKEY=VALUEcouples separated by",".wrap_unicodeโ break lines according to the Unicode Line Breaking Algorithm. Availability requires at least libass release0.17.0(orLIBASS_VERSION 0x01600010), and libass must have been built withlibunibreak.
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 heightaโ same asw / hsarโ input sample aspect ratiodarโ input display aspect ratio, it is the same as(w / h) * sarnโ the number of the input frame, starting from 0tโ the timestamp expressed in seconds. It'sNANif the input timestamp is unknownposโ the position in the file of the input frame,NANif 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 firstbottom,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 is23๐ธ.
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 is0. A value of0means 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 theparade, 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 is7.bgopacity,bโ set background opacity. Default is0.9.envelope,eโ show envelope. Default is disabled.ecolor,ecโ set envelope color. Default is"gold"๐.slideโ set slide mode. Available values forslideare: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 value0xf, 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 ofnframes, the filter will pick one of them, and then handle the next batch ofnframes until the end. Default is100.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 formCOLUMNSxROWS. Range is up toUINT_MAXcells. Default is"6x5".nb_framesโ set the maximum number of frames to render in the given area. It must be less than or equal towxh. The default value is0, meaning all the area will be used.marginโ set the outer border margin in pixels. Range is0to1024. Default is0.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 thepadvideo filter. Range is0to1024. Default is0.colorโ specify the color of the unused area. For the syntax of this option, check theColorsection in theffmpeg-utilsmanual. The default value ofcoloris"black"๐ค.overlapโ set the number of frames to overlap when tiling several successive frames together. The value must be between0andnb_frames - 1. Default is0.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 between0andnb_frames - 1. Default is0.
Examples
- Produce
8x8PNG 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 thetop_field_firstflag. 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 modeinterleave_topandinterleave_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 is1. Allowed range is from1to127.planesโ Set which planes to filter. Default value is15, by which all planes are processed.percentileโ Set median percentile. Default value is0.5. Default value of0.5will pick always median values, while0will pick minimum values, and1maximum 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 is5. Allowed range is from1to127.sigmaโ Set filtering sigma. Default is0.5. This controls strength of filtering. Setting this option to0effectively does nothing. (Zero = no thoughts, head empty ๐)planesโ Set which planes to process. Default is15, 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 to3.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 from0to15.
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:
weightsscaleplanes
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 thanreinhard, 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 to1.0.gammaโ Specifies the exponent of the function. Default to1.8.clipโ Specify an extra linear coefficient to multiply into the signal before clipping. Default to1.0.reinhardโ Specify the local contrast coefficient at the display peak. Default to0.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 tomobiustransform. 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 to0.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 is0.stopโ Specify number of padding frames after input video stream. Set to-1to pad indefinitely ๐ญ Default is0.start_modeโ Set kind of frames added to beginning of stream. Can be eitheraddorclone. Withaddframes of solid-color are added. Withcloneframes are clones of first frame. Default isadd.stop_modeโ Set kind of frames added to end of stream. Can be eitheraddorclone. Withaddframes of solid-color are added. Withcloneframes are clones of last frame. Default isadd.start_duration,stop_durationโ Specify the duration of the start/stop delay. See the Time duration section in theffmpeg-utils(1)manual for the accepted syntax. These options overridestartandstop. Default is0.colorโ Specify the color of the padded area. For the syntax of this option, check the "Color" section in theffmpeg-utilsmanual.
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 between4-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 (whenheight >= width).landscapeโ Preserve landscape geometry (whenwidth >= 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 asstart, except this option sets the start timestamp in timebase units instead of seconds.end_ptsโ This is the same asend, 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 thestart/endoptions and thedurationoption look at the frame timestamp, while the_framevariants 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 asetptsfilter after thetrimfilter.
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 value0xf, 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 between3and23. The default value is5.luma_msize_y,lyโ Set the luma matrix vertical size. It must be an odd integer between3and23. The default value is5.luma_amount,laโ Set the luma effect strength. It must be a floating point number, reasonable values lay between-1.5and1.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 between3and23. The default value is5.chroma_msize_y,cyโ Set the chroma matrix vertical size. It must be an odd integer between3and23. The default value is5.chroma_amount,caโ Set the chroma effect strength. It must be a floating point number, reasonable values lay between-1.5and1.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 theffmpeg-utilsmanual.
๐ธ 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 range0-8. If set to0, the filter will have no effect. A value of8means the higher quality. For each increment of that value the speed drops by a factor of approximately 2. Default value is3. 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 ofsnow.
๐ 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โ rightlโ leftuโ updโ downfโ forwardbโ 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 clockwise1โ 90 degrees clockwise2โ 180 degrees clockwise3โ 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 monosbsโ side by sidetbโ 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โ yawp,Pโ pitchr,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 to0. Allowed range is from-1to1.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
3x2layout and1%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 is2.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,8for a640x480frame โ as2^9 = 512 > 480). Valid values are integers between1and32. Default value is6.percentโ partial of full denoising (limited coefficients shrinking), from0to100. Default value is85.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 from0to254. Default is0.max_rโ set the max allowed radius. Allowed range is from1to255. Default is8.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 optionsxandy. The 3rd color component is static.color2โ the actual color component values present in the video frame are displayed on the graph.color3โ similar tocolor2, but a higher frequency of the same valuesxandyon the graph increases the value of another color component, which is luminance by default values ofxandy.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 tocolor, but with the 3rd color component picked from a radial gradient.
xโ set which color component will be represented on the X-axis. Default is1.yโ set which color component will be represented on the Y-axis. Default is2.intensity,iโ set intensity, used by modesgray,color,color3andcolor5for 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:nonegreencolorinvert
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 is0. 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 of0.1, the actual threshold is0.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 is1. 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 of0.9, the actual threshold is0.9 * 255 = 230.colorspace,cโ set what kind of colorspace to use when drawing the graticule:auto601709
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 istransforms.trf.shakinessโ set how shaky the video is and how quick the camera is. It accepts an integer in the range1-10; a value of1means little shakiness, a value of10means strong shakiness. Default value is5.accuracyโ set the accuracy of the detection process. It must be a value in the range1-15. A value of1means low accuracy, a value of15means high accuracy. Default value is15. ๐ฏstepsizeโ set the stepsize of the search process. The region around the minimum is scanned with 1 pixel resolution. Default value is6.mincontrastโ set minimum contrast. Below this value a local measurement field is discarded. Must be a floating point value in the range0-1. Default value is0.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 range0-2. Default value is0, which disables any visualization. ๐fileformatโ format for the transforms data file to be written. Acceptable values are:asciiโ human-readable plain textbinaryโ binary format, roughly40%smaller thanascii. (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 istransforms.trf.smoothingโ Set the number of frames (value*2 + 1) used for lowpass filtering the camera movements. Default value is10.
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 to1. Default value is0.relativeโ Consider transforms as relative to previous frame if set to1, absolute if set to0. Default value is0.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 is0(no zoom).optzoomโ Set optimal zooming to avoid borders.
Accepted values are:
0โ disabled1โ 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), seezoomspeed
Note that the value given at zoom is added to the one calculated here.
zoomspeedโ Set percent to zoom maximally each frame (enabled whenoptzoomis set to2). Range is from0to5, default value is0.25.interpolโ Specify type of interpolation.
Available values are:
noโ no interpolationlinearโ linear only horizontalbilinearโ linear in both directions (default)bicubicโ cubic in both directions (slow)
tripodโ Enable virtual tripod mode if set to1, which is equivalent torelative=0:smoothing=0. Default value is0.
Use also tripod option of vidstabdetect.
debugโ Increase log verbosity if set to1. Also the detected global motions are written to the temporary fileglobal_motions.trf. Default value is0.
Examples
- Use
ffmpegfor 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 is0. Allowed range is from-2to2.rbalโ Set the red balance. Default is1. Allowed range is from-10to10.gbalโ Set the green balance. Default is1. Allowed range is from-10to10.bbalโ Set the blue balance. Default is1. Allowed range is from-10to10.rlumโ Set the red luma coefficient.glumโ Set the green luma coefficient.blumโ Set the blue luma coefficient.alternateโ Ifintensityis negative and this is set to1, 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. Respectivelyw/2andh/2by 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 theinitmode 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 is1(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 heightnโ the number of input frame, starting from 0ptsโ the PTS (Presentation TimeStamp) time of the filtered video frame, expressed in TB units,NANif undefinedrโ frame rate of the input video,NANif the input frame rate is unknowntโ the PTS (Presentation TimeStamp) of the filtered video frame, expressed in seconds,NANif undefinedtbโ 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 identicalscalefilter options.reset_sarโ Works the same as the identicalscalefilter option.color_profileโ Specify all color properties at once.
The accepted values are:
bt601โ BT.601bt709โ BT.709bt2020โ BT.2020
trcโ Specify output transfer characteristics.
The accepted values are:
bt709โ BT.709gamma22โ Constant gamma of 2.2gamma28โ Constant gamma of 2.8smpte170mโ SMPTE-170Msmpte240mโ SMPTE-240Mlinearโ LinearlogโLOGlog-sqrtโLOG_SQRTiec61966-2-4โ iec61966-2-4bt1361-ecgโBT1361_ECGiec61966-2-1โ iec61966-2-1bt2020-10โ BT.2020 for 10-bits contentbt2020-12โ BT.2020 for 12-bits content
smpte2084โ SMPTE2084smpte428โ SMPTE428arib-std-b67โ ARIB_STD_B67primariesโ Specify output color primaries. The accepted values are:bt709โ BT.709bt470mโ BT.470Mbt470bgโ BT.470BG or BT.601-6 625smpte170mโ SMPTE-170M or BT.601-6 525smpte240mโ SMPTE-240Mfilmโ filmbt2020โ BT.2020smpte428โ SMPTE-428smpte431โ SMPTE-431smpte432โ SMPTE-432jedec-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 is2.shortestโ If set to1, force the output to terminate when the shortest input terminates. Default value is0.
๐๏ธ 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 iscomplex.
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 isfield.
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 isauto. 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 isall.
๐ฎ 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 eitherrow, orcolumn. Default iscolumn. In row mode, the graph on the left side represents color component value0and the right side represents value =255. In column mode, the top side represents color component value =0and 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 is0.04. Allowed range is[0, 1].mirror,rโ Set mirroring mode.0means unmirrored,1means mirrored. In mirrored mode, higher values will be represented on the left side forrowmode and at the top forcolumnmode. Default is1(mirrored).display,dโ Set display mode. It accepts the following values:overlayโ Presents information identical to that in theparade, 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 inrowmode or one below the other incolumnmode.paradeโ Display separate graph for the color components side by side incolumnmode or one below the other inrowmode. 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 isstack.
components,cโ Set which color components to display. Default is1, which means only luma or red color component if input is in RGB colorspace. If is set for example to7it 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 smallstepvalue.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. Acceptsdigital,millivolts,ire. Default isdigital.bgopacity,bโ Set background opacity.tint0,t0,tint1,t1โ Set tint for output. Only used withlowpassfilter and when display is notoverlayand 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 to1/1.sizeโ Set sample aspect ratio to match input size of video. Default isnone.
inputโ Set input formats for filter to pick from. Can beall, for selecting from all available formats, orfirst, for selecting first available format. Default isfirst.
๐งต 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
selectandseparatefieldsfilter:
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:2for2xBR,3for3xBRand4for4xBR. Default is3.
๐งฎ 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 befirstorall. Default isall.
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:
customfadewipeleftwiperightwipeupwipedownslideleftsliderightslideupslidedowncirclecroprectcropdistancefadeblackfadewhiteradialsmoothleftsmoothrightsmoothupsmoothdowncircleopencircleclosevertopenvertclosehorzopenhorzclosedissolvepixelizediagtldiagtrdiagbldiagbrhlslicehrslicevuslicevdslicehblurfadegrayswipetlwipetrwipeblwipebrsqueezehsqueezevzoominfadefastfadeslowhlwindhrwindvuwindvdwindcoverleftcoverrightcoverupcoverdownrevealleftrevealrightrevealuprevealdown
Default transition effect is fade โ sheโs the default for a reason ๐
.
durationโ Set cross fade duration in seconds. Range is0to60seconds. Default duration is1second.offsetโ Set cross fade start relative to first input stream in seconds. Default offset is0.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
2seconds starting at offset of5seconds:
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 is3. Allowed range is from3to255. 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 is15, by which all planes are processed.percentileโ Set median percentile. Default value is0.5. Default value of0.5will pick always median values, while0will pick minimum values, and1maximum 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.yuvandtest_video.yuv, both at24frames per second, with color format4:2:0, bit depth8, 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.yuvwith bit depth8andtest_video.yuvwith bit depth10, both at60frames per second with color format4: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 is2.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 at0and are separated by'_'. Optionally one can usewXandhX, whereXis 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 to1, force the output to terminate when the shortest input terminates. Default value is0.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
4inputs into2x2grid.
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
4inputs into1x4grid.
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
9inputs into3x3grid.
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
16inputs into4x4grid.
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โ likesend_frame, but it skips the spatial interlacing check3,send_field_nospatialโ likesend_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 first1,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 frames1,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 is3.planes,pโ set which planes to filter. default is only the first plane.sigma,sโ set blur strength. default value is128.
๐ฌ 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 is1-10. default is1.x,yโ set the x and y expression. default is0.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 is90.sโ set the output image size, default ishd720.fpsโ set the output frame rate, default is25.
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'sNANif the input timestamp is unknown.out_time,time,otโ the output timestamp expressed in seconds.x,yโ last calculatedxandyposition fromxandyexpression for current input frame.px,pyโxandyof last output frame of previous input frame, or0when there was not yet such frame (first input frame).zoomโ last calculated zoom fromzexpression 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 fromdexpression 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 theffmpeg-utilsmanual.dither,dโ set the dither type. possible values are:none,ordered,random,error_diffusion. default isnone.filter,fโ set the resize filter type. possible values are:point,bilinear,bicubic,spline16,spline36,spline64,lanczos. default isbilinear.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. parameterbfor bicubic, and the number of filter taps for lanczos.param_bโ parameter B for scaling filters. parametercfor 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 asin_wandin_h.out_w,out_hโ the output (scaled) width and height.ow,ohโ these are the same asout_wandout_h.aโ the same asiw / 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 formatyuv422p,hsubis2andvsubis1.ohsub,ovsubโ horizontal and vertical output chroma subsample values. for example for the pixel formatyuv422p,hsubis2andvsubis1.
๐ฌ 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 typecudacalled 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_cudaandbilateral_cudafilters:
./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 cudaor-hwaccel_output_format cuda) โ bestie you do NOT need to callhwuploadyourself, 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
hwuploadto 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
hwdownloadto bring it back to CPU memory. no shortcuts, sorry ๐ซถ
Heads up fr:hwuploaduploads data to a surface with the same layout as the software frame, so you might have to drop aformatfilter right beforehwuploadto make sure the input is in the correct format. Same energy in reverse:hwdownloadmay not support all output formats, so an extraformatfilter right afterhwdownloadin 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: thellvmlib 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 is0.1to512. Default is0.1.sigmaRโ Set sigma of gaussian function to calculate color range weight, also called sigma color. Allowed range is0.1to512. Default is0.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 is1to255. Default is1.
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) rangempegโ MPEG (restricted) rangepcโ PC (full) rangejpegโ 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 from0.posโ The byte offset position in the file of the main input frame,NANif unknown. Deprecated, do not use. (like fr, don't)tโ The timestamp of the main input frame, expressed in seconds,NANif unknown.
Default value is 0 for both expressions.
evalโ Set when the expressions forxandyare 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โ Seeframesync.shortestโ Seeframesync.repeatlastโ Seeframesync.
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โ Bilinearbicubicโ 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 to0, 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 to1, filter with a generic weight LUT instead of using fixed-function shader kernels. May be faster or slower depending on the hardware. A value ofauto(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 identicalscalefilter options.reset_sarโ Works the same as the identicalscalefilter 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 is100.
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 withscale_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โ likesend_frame, but it skips the spatial interlacing check.3,send_field_nospatialโ likesend_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 stringsame(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.linearcubiccubic2p_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โ supersamplinglanczos
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-1forworhโ 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 withforce_original_aspect_ratio. This works similar to using-nin thewandhoptions.
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 identicalscalefilter 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 heightiw,ihโ these are the same asin_wandin_h.out_w,out_hโ the output (scaled) width and heightow,ohโ these are the same asout_wandout_haโ the same asiw / ihsarโ input sample aspect ratiodarโ the input display aspect ratio. Calculated from(iw / ih) * sar.nโ the (sequential) number of the input frame, starting from0. Only available witheval=frame.tโ the presentation timestamp of the input frame, expressed as a number of seconds. Only available witheval=frame.posโ the position (byte offset) of the frame in the input stream, orNaNif this information is unavailable and/or meaningless (for example in case of synthetic video). Only available witheval=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 heightmain_aโ the same asmain_w / main_hmain_sarโ the main input video's sample aspect ratiomain_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 from0. Only available witheval=frame.main_tโ the presentation timestamp of the main input frame, expressed as a number of seconds. Only available witheval=frame.main_posโ the position (byte offset) of the frame in the main input stream, orNaNif this information is unavailable and/or meaningless (for example in case of synthetic video). Only available witheval=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 (whenheight >= width).landscapeโ preserve landscape geometry (whenwidth >= 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 typeopenclcalled 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_openclfilter 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 is1.planesโ Set which planes to filter. Default value is0xf, by which all planes are processed.sizeYโ Set vertical radius size. Range is[1, 1024]and default value is0. If zero,sizeXvalue 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,lrluma_power,lpchroma_radius,crchroma_power,cpalpha_radius,aralpha_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 expressionmin(w,h)/2for the luma and alpha planes, and ofmin(cw,ch)/2for the chroma planes. Default value forluma_radiusis2. If not specified,chroma_radiusandalpha_radiusdefault to the corresponding value set forluma_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 formatyuv422p,hsubis2andvsubis1.
chroma_radius,crโ Same radius expression setup for the chroma plane; if not specified, it defaults to the corresponding value set forluma_radius.alpha_radius,arโ Same radius expression setup for the alpha plane; if not specified, it defaults to the corresponding value set forluma_radius.luma_power,lpโ Specify how many times the boxblur filter is applied to the luma plane. Default value forluma_poweris2. A value of0will 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 forluma_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 forluma_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
2and luma, chroma, and alpha power set to3. The filter will run3times with box-radius set to2for 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_powerto1,chroma_radiusto4,chroma_powerto5,alpha_radiusto3andalpha_powerto7.
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.01matches only the exact key color, while1.0matches everything.blendโ Blend percentage.0.0makes 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 of9,25or49signed numbers. Default value for each plane is0 0 0 0 1 0 0 0 0.0rdiv,1rdiv,2rdiv,3rdivโ Set multiplier for calculated value for each plane. If unset or0, it will be sum of all matrix elements. The option value must be a float number greater or equal to0.0. Default value is1.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 to0.0. Default value is0.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 is65535. If0, plane will remain unchanged.coordinatesโ Flag which specifies the pixel to refer to. Range is[0, 255]and default value is255, 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
threshold0set to30,threshold1set40,threshold2set to50andcoordinatesset to231, setting each pixel of the output to the local minimum between pixels:1,2,3,6,7,8of the3x3region 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 to0.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 verboseto ffmpeg. Viewing point matches in the output video is only supported for RGB input. Defaults to0.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 to1.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 to1.smooth_strengthโ The strength of the smoothing applied to the camera path from0.0to1.0.1.0is the maximum smoothing strength while values less than that result in less smoothing.0.0causes the filter to adaptively choose a smoothing strength on a per-frame basis. Defaults to0.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 from0.1to10.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 to2.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 to0, 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
threshold0set to 30,threshold1set 40,threshold2set to 50 andcoordinatesset 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
LOGOat the top-left corner of theINPUTvideo. Both inputs areyuv420pformat, 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
INPUTisyuv420pand theLOGOisyuva420p๐:
-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 theffmpeg-utilsmanual.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 asin_wandin_h.out_w/out_hโ the output width and height (the size of the padded area), as specified by thewidthandheightexpressions.ow/ohโ these are the same asout_wandout_h.x/yโ the x and y offsets as specified by thexandyexpressions, or NAN if not yet specified.aโ same asiw/ihsarโ input sample aspect ratiodarโ 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 is0xf, 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
scaleset to 2 anddeltaset 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 theffmpeg-utilsmanual. 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 is0xf, 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
scaleset to 2 anddeltaset 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 is0xf, 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 is1.0.deltaโ the value that gets added to the filtered result. Range is[-65535, 65535]and the default is0.0.
โจ Example โจ
- Apply the sobel operator with
scaleset to2anddeltaset to10:
-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 thetonemapoption intonemap.paramโ tunes the tone mapping algorithm. Same as theparamoption intonemap.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 is0.2.formatโ specify the output pixel format.
Currently supported formats are:
p010nv12
range,rโ set the output color range.
Possible values are:
tv/mpegpc/jpeg
Default is same as input.
primaries,pโ set the output color primaries.
Possible values are:
bt709bt2020
Default is same as input.
transfer,tโ set the output transfer characteristics.
Possible values are:
bt709bt2020
Default is bt709.
matrix,mโ set the output colorspace matrix.
Possible value are:
bt709bt2020
Default is same as input.
โจ Example โจ
- Convert HDR(PQ/HLG) video to bt2020-transfer-characteristic
p010format 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 is5.luma_msize_y,lyโ set the luma matrix vertical size. Range is[1, 23]and the default value is5.luma_amount,laโ set the luma effect strength. Range is[-10, 10]and the default value is1.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 is5.chroma_msize_y,cyโ set the chroma matrix vertical size. Range is[1, 23]and the default value is5.chroma_amount,caโ set the chroma effect strength. Range is[-10, 10]and the default value is0.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.
fadewipeleftwiperightwipeupwipedownslideleftsliderightslideupslidedown
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 between0and1inclusive.
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 is0for both expressions.w,hโ Set expressions for the width and height of the overlaid video on the main video. Default values areoverlay_iwforwandoverlay_ih*w/overlay_iwforh.
The expressions can contain the following parameters:
main_w,Wandmain_h,Hโ the main input width and height.overlay_iwandoverlay_ihโ the overlay input width and height.overlay_w,wandoverlay_h,hโ the overlay output width and height.overlay_x,xandoverlay_y,yโ position of the overlay layer inside of main.
More options:
alphaโ Set transparency of overlaid video. Allowed range is0.0to1.0. Higher value means lower transparency. Default value is1.0.eof_actionโ see framesync.shortestโ see framesync.repeatlastโ see framesync.
This filter also supports the framesync options. ๐ซถ
๐ Examples ๐
- Overlay an image
LOGOat the top-left corner of theINPUTvideo. Both inputs for this filter areyuv420pformat.
-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuv420p, hwupload[b], [a][b]overlay_vaapi" OUTPUT
- Overlay an image
LOGOat the offset(200, 100)from the top-left corner of theINPUTvideo. The inputs have same memory layout for color channels, the overlay has additional alpha plane, likeINPUTisyuv420p, and theLOGOisyuva420p.
-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 isnv12for HDR-to-SDR tone-mapping andp010for HDR-to-HDR tone-mapping.primaries,pโ Set the output color primaries. Default isbt709for HDR-to-SDR tone-mapping and same as input for HDR-to-HDR tone-mapping.transfer,tโ Set the output transfer characteristics. Default isbt709for HDR-to-SDR tone-mapping and same as input for HDR-to-HDR tone-mapping.matrix,mโ Set the output colorspace matrix. Default isbt709for 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โ seehstack.shortestโ seehstack.heightโ Set height of output. If set to0, this filter will set height of output to height of the first input stream. Default value is0.
๐ 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โ seevstack.shortestโ seevstack.widthโ Set width of output. If set to0, this filter will set width of output to width of the first input stream. Default value is0.
โญ 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โ seexstack.shortestโ seexstack.layoutโ seexstack. 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โ seexstack.grid_tile_sizeโ Set output size for each input stream whengridis 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 theffmpeg-utilsmanual.fillโ seexstack.
๐ง 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,wandheight,hโ Specify an expression for the size of the output image with the paddings added. If the value for width or height is0, 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 is0.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 is0. 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 theffmpeg-utilsmanual.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 asin_wandin_h.out_w,out_hโ the output width and height (the size of the padded area), as specified by thewidthandheightexpressions.ow,ohโ these are the same asout_wandout_h.x,yโ the x and y offsets as specified by thexandyexpressions, orNANif not yet specified.aโ same asiw / 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 to0.width,wandheight,hโ The expressions which specify the width and height of the box; if0they are interpreted as the input width and height. It defaults to0.color,cโ Specify the color of the box to write. For the general syntax of this option, check the "Color" section in theffmpeg-utilsmanual.thickness,tโ The expression which sets the thickness of the box edge. A value offillwill create a filled box. Default value is3. See below for the list of accepted constants.replaceโ With value1, the pixels of the painted box will overwrite the video's color and alpha pixels. Default is0, 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,ihandin_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 (whenheight >= width).landscapeโ preserve landscape geometry (whenwidth >= 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 typevulkancalled name, using the given device parameters and options in key=value. The following options are supported:debugโ Switches validation layers on if set to1.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 regularmemcpy()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 is3.sizeYโ Set vertical radius size. Range is[1, 32]and default value is3.planesโ Set which planes to filter. Default value is0xf, 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_modec1_modec2_modec3_modeall_modeโ Set blend mode for specific pixel component or all pixel components in case ofall_mode. Default value isnormal.
Available values for component modes are:
normalmultiply
๐ 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 is0.dist_yโ Similarly, this sets the vertical displacement multiplier. Default is0.
๐ 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 isblack.sizeโ The size of the output frame. Default value is1920x1080.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 is1/1.formatโ The pixel format of the output Vulkan frames. Default value isyuv444p.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 is0.5.sigmaVโ Set vertical sigma, if negative it will be same assigma. 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 is19.sizeVโ Set the kernel size along the vertical axis. Default is0, which sets to use the same value assize.
๐ 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 is1.0. Must be in range[0.0, 100.0].pโ Set patch size for all planes. Default is7. Must be odd number in range[0, 99].rโ Set research size. Default is15. Must be odd number in range[0, 99].tโ Set parallelism. Default is8. 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.s0s1s2s3โ Set denoising strength for a specific component. Default is1.0, equal tos. Must be in range[0.0, 100.0].0.0disables denoising in that component.p0p1p2p3โ Set patch size for a specific component. Default is7, equal top. 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 is0.yโ Set the y coordinate of the overlaid video on the main video. Default value is0.
๐ง 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 (whenheight >= width).landscapeโ Preserve landscape geometry (whenwidth >= 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โ Seehstack.shortestโ Seehstack.heightโ Set height of output. If set to0, this filter will set height of output to height of the first input stream. Default value is0.
๐ฆ 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โ Seevstack.shortestโ Seevstack.widthโ Set width of output. If set to0, this filter will set width of output to width of the first input stream. Default value is0.
๐ธ 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โ Seexstack.shortestโ Seexstack.layoutโ Seexstack. 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โ Seexstack.grid_tile_sizeโ Set output size for each input stream whengridis 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โ Seexstack.
๐ 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 anAVHWFramesContextdescribing 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 is25.random_fill_ratio,ratioโ Set the random fill ratio for the initial cellular automaton row. It is a floating point number value ranging from0to1, defaults to1/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 between0andUINT32_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 from0to255. Default value is110.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 to1, scroll the output upward when all the rows in the output have been already filled. If set to0, the new generated row will be written over the top row just after the bottom row is filled. Defaults to1.start_full,fullโ If set to1, completely fill the output with generated rows before outputting the first frame. This is the default behavior, for disabling set the value to0.stitchโ If set to1, stitch the left and right row edges together. This is the default behavior, for disabling set the value to0.
๐ Examples
- Read the initial state from
pattern, and specify an output of size200x400.
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 is320x240.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 is25.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
CIQRCodeGeneratorto 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 ๐ Whendup_framesis 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 istrue(the default), the filter duplicates frames when the desktop hasn't been updated, so it can keep approximately constant target framerate. When it'sfalse, 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 themax_framerate. If you need a stable rate, you need to add anfpsfilter 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โ aswindow_title, but matched against the window class name.window_exeโ aswindow_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 is60FPS. 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 to1, return frames with premultiplied alpha. Default is0(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 outputrgbaf16,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 theffmpeg-utilsmanual. Default value is640x480.rate,rโ set frame rate, expressed as number of frames per second. Default value is25.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 from2to8. Default value is2.seedโ set seed for picking gradient line points.duration,dโ set the duration of the sourced video. See the Time duration section in theffmpeg-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:linearradialcircularspiralsquare
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 is400.end_scaleโ set the terminal scale value. Must be a floating point value. Default value is0.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 is10.0.maxiterโ set the maximum of iterations performed by the rendering algorithm. Default value is7189.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 is25.size,sโ set frame size. For the syntax of this option, check the "Video size" section in theffmpeg-utilsmanual. Default value is640x480.start_scaleโ set the initial scale value. Default value is3.0.start_xโ set the initial x position. Must be a floating point value between-100and100. Default value is-0.743643887037158704752191506114774.start_yโ set the initial y position. Must be a floating point value between-100and100. 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 formatframe_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 theffmpeg-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_lumadc_chromafreq_lumafreq_chromaamp_lumaamp_chromacbpmvring1ring2allmax_frames,mโ Sets the maximum number of frames generated for each test, default value is30.
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 formnum/denor 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 is25.random_fill_ratio,ratioโ Sets the random fill ratio for the initial random grid. It's a floating point number value ranging from0to1, defaults to1/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 between0andUINT32_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 to1, stitch the left and right grid edges together, and the top and bottom edges also. Defaults to1.moldโ Sets cell mold speed. If set, a dead cell will go fromdeath_colortomold_colorwith a step ofmold.moldcan have a value from0to255.life_colorโ Sets the color of living (or new born) cells. ๐death_colorโ Sets the color of dead cells. Ifmoldis 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 size300x300pixels:
life=f=pattern:s=300x300
- Generate a random grid of size
200x200, with a fill ratio of2/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 is25.octavesโ Specifies the total number of components making up the noise, each one with doubled frequency. Default value is1.persistenceโ Sets the ratio used to compute the amplitude of the next octave component with respect to the previous component amplitude. Default value is1.xscaleyscaleโ 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 is1.tscaleโ Defines a scale factor used to multiple the time coordinate. This can be useful to change the time variation speed. Default value is1.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 therandom_seedoption.
Default value is "random".
random_seed,seedโ Whenrandom_modeis set torandom_seed, use this value to compute the initial pattern. Default value is0.
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
lutyuvto 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,qpadded_qrcode_width,Qโ Specify an expression for the width of the rendered QR code, with and without padding. Theqrcode_widthexpression can reference the value set by thepadded_qrcode_widthexpression, and vice versa. By defaultpadded_qrcode_widthis set toqrcode_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 (likexortorยธ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 isL. It accepts these values:LMQH
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 forforeground_coloris"black", default forbackground_coloris"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 justrgb24. 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 ofNgenerates a picture ofN*N*NbyN*N*Npixels to be used as identity matrix for 3D lookup tables. Each component is coded on a1/(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 is320x240.
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:blackwhiteall
patch_sizeโ set patch size of single color patch, only available in the"colorchart"source. Default is64x64.presetโ set colorchecker colors preset, only available in the"colorchart"source.
Available values are:
referenceskintones
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 is25.duration,dโ sets how long the sourced video lives. like, the accepted syntax is in the Time duration section of theffmpeg-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 is10. allowed range is from4to16.xoโ sets the horizontal axis offset for the output signal. default is0.yoโ sets the vertical axis offset for the output signal. default is0.toโ sets the time axis offset for the output signal. default is0.k0โ sets the 0-order constant added to the signal phase. default is0.kxโ sets the 1-order phase factor multiplier for the horizontal axis. default is0.kyโ sets the 1-order phase factor multiplier for the vertical axis. default is0.ktโ sets the 1-order phase factor multiplier for the time axis. default is0.kxt,kyt,kxyโ set the phase factor multipliers for combinations of the spatial and temporal axes. default is0.kx2โ sets the 2-order phase factor multiplier for the horizontal axis. default is0.ky2โ sets the 2-order phase factor multiplier for the vertical axis. default is0.kt2โ sets the 2-order phase factor multiplier for the time axis. default is0.kuโ sets the constant added to the final phase to produce the chroma-blue component of the signal. default is0.kvโ sets the constant added to the final phase to produce the chroma-red component of the signal. default is0.
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 theffmpeg-utilsmanual. default value is"hd720".fovโ sets the camera field of view. default is90degrees. allowed range is from40to150.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 theffmpeg-utilsmanual. 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 theffmpeg-utilsmanual. default value is"hd720".scaleโ sets the display scale.
it accepts the following values:
logโ logarithmicsqrtโ square rootcbrtโ cubic rootlinโ linearrlogโ reverse logarithmic
default is "log".
ascaleโ sets the amplitude scale.
it accepts the following values:
logโ logarithmiclinโ linear
default is "log".
acountโ sets how many frames to accumulate in the histogram. default is1. setting this to-1accumulates 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 is25.size,sโ sets the video size for the output. for the syntax of this option, check the "Video size" section in theffmpeg-utilsmanual. default value is"800x400".rc,gc,bcโ specify the red, green and blue contrast. default values are2,7and1. 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 is0. allowed range is[0, 1].angle,aโ sets the angle threshold for out-of-phase detection, in degrees. default is170. 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 is2.
Examples โจ
- complete example with
ffmpegto detect 1 second of mono with0.001phase 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 theffmpeg-utilsmanual. default value is"400x400".rate,rโ sets the output frame rate. default value is25.rc,gc,bc,acโ specify the red, green, blue and alpha contrast. default values are40,160,80and255. allowed range is[0, 255].rf,gf,bf,afโ specify the red, green, blue and alpha fade. default values are15,10,5and5. allowed range is[0, 255].zoomโ sets the zoom factor. default value is1. allowed range is[0, 10]. values lower than1will 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 itxyโ 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 keylavfi.bench.start_time), and pass the frame on down to the next filter ๐ซถstopโ grab the current time and pull thelavfi.bench.start_timemetadata off the input frame to get the time difference. Then it prints the time difference, average, maximum and minimum time (respectivelyt,avg,maxandmin). Timestamps are in seconds โญ
โจ Examples โจ
- Benchmark the
selectivecolorfilter, 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 is2.vโ set the number of output video streams, which is also the number of video streams in each segment. Default is1.aโ set the number of output audio streams, which is also the number of audio streams in each segment. Default is0.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 streams1and2):
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 is0.sizeโ set the video size. This option is for video only. For the syntax of this option, check the "Video size" section in theffmpeg-utilsmanual. Default and minimum resolution is640x480.meterโ set the EBU scale meter. Default is9. Common values are9and18, 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 to1, the audio input will be segmented into100msoutput frames, each of them containing various loudness information in metadata. All the metadata keys are prefixed withlavfi.r128.. Default is0.framelogโ force the frame logging level.
Available values are:
quietโ logging disabled ๐คซinfoโ information logging levelverboseโ 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 aflagtype). 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 bySPK).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 byTPK) and true-peak per frame (identified byFTPK). This mode requires a build withlibswresampleโ ๏ธ 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 totrue, 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-23LUFSas 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 aremomentaryandshortterm. 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 areabsolute(in LUFS) orrelative(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 is2by 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 bothvalueandkeyare set, it selects frames that have such metadata. if onlykeyis set, it selects every frame that has such key in its metadata.addโ adds new metadatakeyandvalue. if the key is already available, do nothing (respect the existing, queen).modifyโ modifies the value of an already present key.deleteโ ifvalueis set, deletes only keys that have such value. otherwise, deletes the key. and ifkeyisn'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. ifkeyisn'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 exceptprintanddelete.valueโ sets the metadata value that will be used. this option is mandatory formodifyandaddmode. no skipping it โจfunctionโ which function to use when comparing metadata value andvalue. can be one of the following:same_strโ values are interpreted as strings, returns true if the metadata value is the same asvalue.starts_withโ values are interpreted as strings, returns true if the metadata value starts with thevalueoption string.lessโ values are interpreted as floats, returns true if the metadata value is less thanvalue.equalโ values are interpreted as floats, returns true ifvalueis equal with the metadata value.greaterโ values are interpreted as floats, returns true if the metadata value is greater thanvalue.exprโ values are interpreted as floats, returns true if the expression from theexproption evaluates to true.ends_withโ values are interpreted as strings, returns true if the metadata value ends with thevalueoption string.
exprโ sets the expression used whenfunctionis set toexpr. the expression is evaluated through the eval API and can contain the following constants:VALUE1,FRAMEVALโ float representation ofvaluefrom the metadata key.VALUE2,USERVALโ float representation ofvalueas supplied by the user in thevalueoption.
fileโ if specified inprintmode, 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 thefileoption is not set, output is written to the log withAV_LOG_INFOloglevel.directโ reduces buffering in print mode when output is written to a URL set usingfile.
๐ธ Examples ๐ธ
- print all metadata values for frames with key
lavfi.signalstats.YDIFwith values between 0 and 1:
signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'
- print
silencedetectoutput to the filemetadata.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 therandommode, must be an integer included between0andUINT32_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 aformatoraformatfilter before theperms/apermsfilter 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 is2seconds.speedโ speed factor for processing. the value must be a float larger than zero. values larger than1.0will result in faster than realtime processing, smaller will slow processing down. the limit is automatically adapted accordingly. default is1.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 indexceil(val)-1, assuming the input index starts from 0. - for example, a value of
1.2corresponds to the output with indexceil(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 is1.
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'sNANif undefined.TBโ the timebase of the input timestamps.ptsโ the PTS (Presentation TimeStamp) of the filtered frame, expressed inTBunits. it'sNANif undefined.tโ the PTS of the filtered frame, expressed in seconds. it'sNANif undefined.prev_ptsโ the PTS of the previously filtered frame. it'sNANif undefined.prev_selected_ptsโ the PTS of the last previously filtered frame. it'sNANif undefined.prev_selected_tโ the PTS of the last previously selected frame, expressed in seconds. it'sNANif undefined.start_ptsโ the first PTS in the stream which is notNAN. it remainsNANif not found.start_tโ the first PTS, in seconds, in the stream which is notNAN. it remainsNANif 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 is1if the filtered frame is a key-frame,0otherwise.posโ the position in the file of the filtered frame,-1if 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_timeand thelavf.concat.durationpacket metadata values which are also present in the decoded frames.
- this works by comparing the frame pts against the
concatdec_selectโ this lil variable is-1when the frame's pts is at leaststart_timeand either the duration metadata is missing or the frame pts is less thanstart_time + duration. It's0otherwise, and it'sNaNif thestart_timemetadata 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, usetime(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 limitedfull,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 theffmpeg-utilsmanual. Default value is"1920x1080".fps,rate,rโ set the output frame rate. Default value is25.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, usesize,sinstead. Default value is1.sono_v,volumeโ specify the sonogram volume expression. It can contain variables:bar_vโ thebar_vevaluated expressionfrequency,freq,fโ the frequency where it is evaluatedtimeclamp,tcโ the value oftimeclampoption
...and functions:
a_weighting(f)โ A-weighting of equal loudnessb_weighting(f)โ B-weighting of equal loudnessc_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โ thesono_vevaluated expressionfrequency,freq,fโ the frequency where it is evaluatedtimeclamp,tcโ the value oftimeclampoption
...and functions:
a_weighting(f)โ A-weighting of equal loudnessb_weighting(f)โ B-weighting of equal loudnessc_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 is3. Acceptable range is"[1, 7]".bar_g,gamma2โ specify the bargraph gamma. Default value is1. Acceptable range is"[1, 7]".bar_tโ specify the bargraph transparency level. Lower value makes the bargraph sharper. Default value is1. 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. Iftimeclampis 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 is0.17.attackโ set attack time in seconds. The default is0(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 is20.01523126408007475, which is frequency 50 cents below E0. Acceptable range is"[10, 100000]".endfreqโ specify the transform end frequency. Default value is20495.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 evaluatedtimeclamp,tcโ the value oftimeclampoption.
Default value is "384*tc/(384+tc*f)".
countโ specify the transform count for every video frame. Default value is6. Acceptable range is"[1, 30]".fcountโ specify the transform count for every single pixel. Default value is0, 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 custombasefreqandendfreqโ use theaxisfileoption instead.fontโ specify fontconfig pattern. This has lower priority thanfontfile. 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 value0xRRGGBB. It can contain variables:frequency,freq,fโ the frequency where it is evaluatedtimeclamp,tcโ the value oftimeclampoption
...and functions:
midi(f)โ midi number of frequencyf, some midi numbers:E0(16),C1(24),C2(36),A4(69)r(x),g(x),b(x)โ red, green, and blue value of intensityx.
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 thefontfileandfontcoloroptions. main character energy ๐axis,textโ enable/disable drawing text to the axis. If it is set to0, drawing to the axis is disabled, ignoring thefontfileandaxisfileoptions. Default value is1.cspโ set colorspace. The accepted values are:unspecifiedโ unspecified (default)bt709โ BT.709fccโ FCCbt470bgโ BT.470BG or BT.601-6 625smpte170mโ SMPTE-170M or BT.601-6 525smpte240mโ SMPTE-240Mbt2020nclโ 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 theffmpeg-utilsmanual. Default value is"640x512".rate,rโ set the output frame rate. Default value is25.scaleโ set the frequency scale used. Allowed values are:linearlogbarkmelerbssqrtcbrtqdrtfm
Default value is "linear".
iscaleโ set the intensity scale used. Allowed values are:linearlogsqrtcbrtqdrt
Default value is "log".
minโ set the minimum frequency that will be used in output. Default is20Hz.maxโ set the maximum frequency that will be used in output. Default is20000Hz. โ ๏ธ 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 is0to1. Default is0.0001. ๐ซdeviationโ sets the frequency deviation. Values lower than1are more frequency-oriented, higher than1are more time-oriented. Allowed range is0to10. Default is1.ppsโ sets the number of pixel output per each second in one row. Allowed range is1to1024. Default is64.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:replacescrollframe
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 is0.rotationโ sets color rotation, must be in the[-1.0, 1.0]range. Default value is0.
๐ 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 theffmpeg-utilsmanual. Default is"1024x512".rate,rโ set the video rate. Default is25.modeโ set the display mode. This sets how each frequency bin gets represented. It accepts the following values:linebardot- 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 from16to65536. Default is2048.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 is1, 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 to0will display current maximal peaks. Default is1, 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:combinedseparate- Default is
"combined".
minampโ set the minimum amplitude used in thelogamplitude scaler.dataโ set the data display mode. It accepts the following values:magnitudephasedelay- 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 theffmpeg-utilsmanual. Default value is"512x512".win_sizeโ set the window size. Allowed range is from1024to65536. Default size is4096.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 theffmpeg-utilsmanual. 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.0is no saturation at all. Saturation must be in the[-10.0, 10.0]range. Default value is1. ๐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 is0. When the value is1, 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 is1.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 is0.startโ set the start frequency from which to display the spectrogram. Default is0.stopโ set the stop frequency to which to display the spectrogram. Default is0.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 is120dBFS. Allowed range is from10to200.limitโ set the upper limit of input audio samples volume in dBFS. Default is0dBFS. Allowed range is from-100to100.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 is4096x2048. ๐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 iscombined.
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 isintensity.
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 islog.
fscaleโ set the frequency scale. It acceptslin(linear) andlog(logarithmic). Default value islin.saturationโ set the saturation modifier for displayed colors. Negative values provide an alternative color scheme.0is no saturation at all. Saturation must be in[-10.0, 10.0]range. Default value is1.win_funcโ set the window function. It acceptsrect,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 is1.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 is0.startโ set the start frequency from which to display the spectrogram. Default is0.stopโ set the stop frequency to which to display the spectrogram. Default is0.drangeโ set the dynamic range used to calculate intensity color values. Default is120 dBFS. Allowed range is from10to200.limitโ set the upper limit of input audio samples volume in dBFS. Default is0 dBFS. Allowed range is from-100to100.opacityโ set opacity strength when using pixel format output with alpha component. ๐
Examples
- Extract an audio spectrogram of a whole audio track in a
1024x1024picture usingffmpeg:
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 is1.wโ set channel width, allowed range is[80, 8192]. Default is400.hโ set channel height, allowed range is[1, 900]. Default is20.fโ set fade, allowed range is[0, 1]. Default is0.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 from0.
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 is0, which means step is disabled.pโ set background opacity, allowed range is[0, 1]. Default is0.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 whendmoption 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 is600x240.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 forrateis not explicitly specified.rate,rโ set the (approximate) output frame rate. This is done by setting the optionn. Default value is"25".split_channelsโ set if channels should be drawn separately or overlap. Default value is0.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 highn. 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 is600x240.split_channelsโ set if channels should be drawn separately or overlap. Default value is0.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
1024x800picture usingffmpeg:
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 arePANSCAN,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 spectrumsscaleโ set the scale that was used when generating the magnitude input spectrum. Can belinorlog. Default islog๐slideโ set the slide that was used when generating the inputs spectrums. Can bereplace,scroll,fullframeorrscroll. Default isfullframewin_funcโ set the window function used for resynthesisoverlapโ 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 beverticalorhorizontal. Default isvertical
๐ธ 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 is30.samplerate,srโ Set output audio sample rate. Default value is44100.amplitude,aโ Set output audio beep amplitude. Default value is0.7.period,pโ Set output audio beep period in seconds. Default value is3.delay,dlโ Set output video flash delay in number of frames. Default value is0.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 frommovie_nameor 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 withav_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,dvandda, specify respectively the default (best suited) video and audio stream. Default isdv, ordaif the filter is called asamovie.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 calledamovie, it will select audio instead of video.loopโ Specifies how many times to read the stream in sequence. If the value is0, 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 ofkey=valuepairs separated by:. The following example shows how to addprotocol_whitelistandprotocol_blacklistoptions:
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.2seconds from the start of the AVI filein.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
video4linux2device, 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
0x81fromdvd.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 usingav_seek_frame. The syntax is:seek stream_index|timestamp|flagsstream_index: Ifstream_indexis-1, a default stream is selected, andtimestampis automatically converted fromAV_TIME_BASEunits to the stream specifictime_base.timestamp: Timestamp inAVStream.time_baseunits or, if no stream is specified, inAV_TIME_BASEunits.flags: Flags which select direction and seeking mode.
get_durationโ Get movie duration inAV_TIME_BASEunits.
๐ 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
- alpine 3.24: ffmpeg-doc 8.1.3-r0 ยท GPL-2.0-or-later AND LGPL-2.1-or-later
- nixos 26.05: ffmpeg 8.1.3
- nixos 26.05: ffmpeg-headless 8.1.3
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms