Before and after the eq filter. Left is the untouched frame; right has brightness=0.10, contrast=1.35 and saturation=1.6 applied, making it brighter and more saturated

Left is the untouched frame. Right is eq=brightness=0.10:contrast=1.35:saturation=1.6, which raises brightness, contrast and saturation together.

Source: Tears of Steel (CC) Blender Foundation | mango.blender.org, CC BY 3.0. One frame of the film, processed with the filter shown.

Basic Commands

Increase Brightness

ffmpeg -i input.mp4 -vf "eq=brightness=0.1" output.mp4

brightness accepts -1.0 to 1.0, and the default is 0. Positive values brighten the image and negative values darken it. To choose between eq, curves and colorbalance, see the color correction overview.

Increase Contrast

ffmpeg -i input.mp4 -vf "eq=contrast=1.5" output.mp4

contrast accepts -1000.0 to 1000.0, and the default is 1. 1 leaves the image unchanged, and larger values increase contrast.

Apply Gamma Correction

ffmpeg -i input.mp4 -vf "eq=gamma=1.5" output.mp4

gamma mainly changes the brightness of the shadows and midtones. It accepts 0.1 to 10.0, and the default is 1. 1 leaves the image unchanged, values above 1 brighten the shadows and midtones, and values below 1 darken them.

Adjust Saturation

ffmpeg -i input.mp4 -vf "eq=saturation=1.5" output.mp4

saturation sets how strong the colors are. It accepts 0.0 to 3.0, and the default is 1. 0 gives grayscale and 1.5 makes colors more vivid. To shift the hue itself, use the hue filter.

Parameter Reference

Parameter Description Default Range
contrast Contrast 1.0 -1000 to 1000
brightness Brightness offset 0.0 -1.0 to 1.0
saturation Saturation multiplier 1.0 0.0 to 3.0
gamma Gamma correction 1.0 0.1 to 10.0
gamma_r Gamma for the red channel 1.0 0.1 to 10.0
gamma_g Gamma for the green channel 1.0 0.1 to 10.0
gamma_b Gamma for the blue channel 1.0 0.1 to 10.0
gamma_weight Highlight-protection weight 1.0 0.0 to 1.0

Specifying Multiple Parameters at Once

ffmpeg -i input.mp4 -vf "eq=brightness=0.05:contrast=1.2:saturation=1.3:gamma=1.1" output.mp4

Separate the settings with colons (:) to set several at once.

Adjusting White Balance with Per-Channel Gamma Correction

ffmpeg -i input.mp4 -vf "eq=gamma_r=0.9:gamma_g=1.0:gamma_b=1.1" output.mp4

Lowering the red gamma slightly and raising the blue gamma gives a cooler, bluer look.

Grayscale Conversion

ffmpeg -i input.mp4 -vf "eq=saturation=0" output.mp4

saturation=0 removes all color and leaves a grayscale image.

Dynamic Parameters (Changing Over Time)

eq values can also be formulas (FFmpeg expressions).

ffmpeg -i input.mp4 -vf "eq=brightness='0.1*sin(t)':eval=frame" output.mp4

t is the time of the current frame in seconds, so the brightness rises and falls in a wave. eval=frame makes eq recalculate the expression for every frame. Without it, the expression is calculated once at the start and the brightness does not change over time.

Practical Correction Examples

Brighten a Dark Video

ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.1:gamma=1.3" output.mp4

Make a Faded Video More Vivid

ffmpeg -i input.mp4 -vf "eq=saturation=1.4:contrast=1.15" output.mp4

Give the Video a Hard, Cinematic Look

ffmpeg -i input.mp4 -vf "eq=contrast=1.2:saturation=0.85:gamma=0.95" output.mp4

What Not to Do

Bad example: saturatoin (misspelled)
ffmpeg -i input.mp4 -vf "eq=saturatoin=1.5" output.mp4

A misspelled option name stops FFmpeg with Error applying option 'saturatoin' to filter 'eq': Option not found.

Differences from the hue Filter

Feature eq hue
Brightness ✓ (offset) ✓ (offset)
Contrast ✓ ✗
Gamma ✓ ✗
Saturation ✓ ✓
Hue rotation ✗ ✓

Use eq for brightness, contrast and gamma, and hue to change the hue.

Measured: time and size

Here is the command that was measured.

ffmpeg -i input.mp4 -vf eq=brightness=0.1 -c:v libx264 -crf 23 -preset medium -an output.mp4
Metric Measured
Wall time 27.07 s (4.43x real time)
Output size 86.26 MB
Size vs. a no-filter re-encode 0%

Source: 1920x1080, 30 fps, 120 s, 351.4 MB (Big Buck Bunny, looped, CC BY 3.0). Rig: Core i9-14900KF (32 threads), FFmpeg 8.1 (gyan.dev), measured 2026-09-05, one command at a time. The raw numbers are in the dataset.

Why the number looks like this

In the same run, a re-encode with no filter (ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -an output.mp4) took 27.97 s. With eq it took no longer. So those 27 seconds are the cost of libx264, not of eq. eq changes each pixel on its own, without looking at neighbouring pixels or other frames, so its cost is hidden behind the encoder.

Other filters on the same source with the same encoder settings: curves took 42.01 s, a colour-correction chain (colorbalance + eq) 53.29 s, and boxblur=10:3 59.37 s. boxblur reads neighbouring pixels. curves and colorbalance work in RGB, so every frame is converted to RGB and back, and those runs were encoded as 4:4:4 (yuv444p), which takes longer than 4:2:0. eq works on YUV directly and keeps 4:2:0, so it adds no time you can see.

The file was 86.26 MB, 0% different from the no-filter re-encode. brightness=0.1 shifts the brightness level without adding detail, so at the same CRF x264 uses the same number of bits. Lifting the shadows is often said to reveal noise and make the file bigger; at this strength it did not. The measurement covers brightness=0.1 only. A stronger correction, or a filter that adds edge detail, can behave differently.

The real cost is that -c:v copy is off the table

In the same run, operations that did not re-encode the video took about a second each: remapping streams 0.41 s, moving the moov atom 0.49 s, and an audio fade with the video copied 1.03 s. eq rewrites pixels, so -c:v copy (copying the video without re-encoding) is not possible, and the job takes about 27 seconds instead. eq itself is cheap, but even a small brightness fix needs a full re-encode of the video.

The measured command drops the audio with -an, so 86.26 MB is video only. If you keep the audio with -c:a copy, the file is larger by the size of the audio.

Common Pitfalls

  • You get an Option not found error. An option name is misspelled, for example saturatoin. Check the spelling of brightness, contrast, saturation and gamma. Copying the names from the parameter table above is the safest way.

  • Brightening blows out the highlights. brightness is too high, so the bright areas are stuck at 255. Keep brightness small (0.03–0.05) and add gamma=1.1. Gamma brightens the shadows and midtones while leaving white almost unchanged, so the highlights are less likely to clip.

  • The expression brightness='0.1*sin(t)' does not change over time. By default eq calculates expressions only once, at the start. Add :eval=frame so it recalculates them for every frame.

  • Re-encoding is slow, or -c:v copy does not work. eq rewrites pixels, so the video must be re-encoded. Keep the audio with -c:a copy, and tune crf on a short section before you process the whole file.

FAQ

Q. What is the difference between brightness and gamma? A. brightness adds the same amount to the whole image, so shadows and highlights move equally. gamma mainly lifts (>1) or lowers (<1) the midtones and shadows. To brighten an image naturally, use gamma; it is less likely to clip the highlights.

Q. What is the easiest way to make it grayscale? A. eq=saturation=0. It drops the color information entirely.

Q. Can I adjust white balance? A. You can approximate it with per-channel gamma: gamma_r, gamma_g, gamma_b. Lowering red and raising blue shifts cooler; the reverse shifts warmer.

Q. Why is the contrast range so wide (-1000 to 1000)? A. That is only the allowed range. In practice 0.8–1.5 is enough; extreme values quickly make the image look wrong. 1 means no change.

Q. Should I use eq or curves? A. To adjust overall brightness, saturation and gamma a little, eq is quicker. To adjust highlights and shadows separately, use curves, which gives finer control.

  • hue — Adjusts hue, saturation, and luminance
  • curves — Tone-curve-based color correction
  • colorbalance — Color adjustment for shadows, midtones, and highlights