FFmpeg tune presets compared

Compare all seven x264 -tune values on one clip. zerolatency produced 2.2x the bytes and fastdecode 1.7x, which is not what a performance flag implies.

Share

-tune looks like a free hint to the encoder about your content. Two of its values are not free at all, and they are the two most likely to end up in a streaming config.

Short version. -tune zerolatency costs 2.2x the bytes. -tune fastdecode costs 1.7x. Only -tune animation made the file smaller.

x264 tune presets
What does -tune actually change, and does it cost anything?
Held constant: libx264 CRF 23 preset medium, same source, audio stripped
Bar chart. x264 tune presets. Encode time and output size for each variant, each metric scaled to its own maximum.
VariantEncodeSizeCost
no tune912 ms fastest433.0 KB$0.0025
film1502 ms446.6 KB$0.0030
animation2045 ms404.9 KB$0.0036
grain1133 ms450.0 KB$0.0026
stillimage959 ms536.6 KB$0.0023
fastdecode982 ms725.7 KB$0.0024
zerolatency1444 ms955.5 KB$0.0029
Measured 2026-08-20 on the Rendobar API. Encode time is the FFmpeg step alone, separated from download and upload. 7 of 7 runs succeeded. Sizes are exact and repeatable. Timings are a single sample and vary up to 2x run to run, so treat small differences as noise. Why.

The two performance tunes are the expensive ones

TuneSizevs baseline
animation404.9 KB−6.5%
none433.0 KB
film446.6 KB+3.1%
grain450.0 KB+3.9%
stillimage536.6 KB+24%
fastdecode725.7 KB+68%
zerolatency955.5 KB+121%

zerolatency more than doubles the output. That is the cost of what it actually does: it disables lookahead, B-frames and frame-based threading so that the encoder never holds a frame back. Every one of those features exists to improve compression, so turning them all off costs compression.

fastdecode is the same shape for the same reason. It disables CABAC, loop filtering and weighted prediction to make the decoder’s job cheaper, and each of those is a compression tool.

Neither flag is misnamed. They do exactly what they say. The problem is that “tune for low latency” reads like a scheduling hint and behaves like a 121% bitrate increase.

Where this bites

-tune zerolatency is in a very large number of live-streaming configs, usually copied from a tutorial, and often on a pipeline that is not actually latency-sensitive.

If you are doing genuine realtime, sub-second interactive video, you need it and the bitrate is the price. If you are streaming to HLS with a six-second segment buffer, you have already accepted seconds of latency and zerolatency is buying you nothing while costing you 121% of your bandwidth.

That is the single most expensive default in this sweep, and it is one word in a command line.

animation is the only one that pays

404.9 KB against 433.0 KB, a 6.5% saving.

animation raises deblocking strength and adjusts psychovisual settings for content with flat colour areas and hard edges, which compresses better under those settings. On actual animation the saving is usually larger than what we measured on live-action footage, so treat 6.5% as a floor for the right content type.

film and grain both made the file slightly larger, by 3.1% and 3.9%. That is intended: grain in particular tells the encoder to preserve grain rather than smooth it away, and preserving detail costs bits. You use it because you want the grain, not to save space.

stillimage is not for still images

+24%, which surprises people.

It is tuned for slideshow-type content, long static shots with occasional changes, and it raises quality on the static portions rather than reducing size. If you want a smaller file from a static source, a longer keyframe interval and a higher CRF will do far more than this flag, and FFmpeg keyframe interval compared shows the size of that lever.

Read the sizes, not the times

The encode-time column here is a single sample per variant, and repeated runs of one identical command on this infrastructure vary by up to 2x when threading is left on auto, which it is here. So animation appearing to take 2,045 ms against no tune’s 912 ms is not a result worth quoting.

The sizes are exact. They were produced by a deterministic encoder and would come out identical on a re-run. That asymmetry is covered in FFmpeg benchmark variance and it applies to every benchmark on this site.

Where this stops

One 5-second 1280x720 live-action clip, libx264 CRF 23 preset medium, audio stripped. -tune is explicitly content-dependent, so the ranking will move on other footage: animation on real animation and grain on genuinely grainy film will both behave differently from what live-action shows.

The two findings that will not move are the mechanical ones. zerolatency and fastdecode disable compression features by design, so they cost bytes on any content.

-tune is one of seven settings measured on this same source. The rest are in FFmpeg encoding settings compared.

Frequently asked questions

What does -tune zerolatency cost?

121% more bytes on our clip. It disables lookahead, B-frames and frame threading so the encoder never holds a frame back, and every one of those features exists to improve compression.

Should I use -tune zerolatency for HLS?

Usually not. If your pipeline already buffers seconds of segments you have accepted the latency, so zerolatency is doubling your bitrate for a benefit you are not collecting.

Does -tune ever make files smaller?

animation did, by 6.5% on live-action footage, and the saving is usually larger on actual animation. film and grain both made the file slightly larger, which is intended.

What is -tune stillimage for?

Slideshow-type content with long static shots. It raises quality on the static portions rather than reducing size, and we measured it 24% larger than no tune.

Sources

Tags #ffmpeg#x264#streaming#encoding#benchmarks
All posts
Share
  1. Opus vs AAC vs MP3 vs FLAC Engineering blog
  2. AV1 vs H.264 VMAF compared Engineering blog
  3. AV1 vs VP9 vs HEVC vs H.264 Engineering blog