Recipe

Film Grain

encode settings

Temporal luma/chroma noise to break up flat AI gradients, plus the matching x264 `-tune grain` encode so the grain survives compression instead of being smeared away.

13 units use it

What it is

## What it is Two things that go together: (1) `noise=alls=N:allf=t` adds per-frame (temporal) grain so banded AI skies / gradients stop looking plastic, and (2) the `-tune grain` x264 preset tells the encoder to preserve that random texture instead of denoising it away. Skipping (2) is the classic mistake — the grain you added gets smeared into mush at any reasonable CRF. ## When to use it - Any analog / VHS / horror register, or any clip with visible AI banding. - As the FINAL encode of a noise-heavy render (the choose-path masters use CRF 30 `-tune grain`). ## Knobs - `alls` = grain strength 0..100. 8 is a light tape grain; 20+ is heavy 16mm. - `allf=t` = temporal (re-randomized every frame). Drop the `t` for static grain. - Encode: `-tune grain`, CRF 20-30. Higher CRF is fine here because grain hides compression.

How to use it standalone

encode settings
# Add grain (verbatim from cli/lib/ffmpeg-recipes.ts buildVhsFilter grain layer):
ffmpeg -i in.mp4 -vf "noise=alls=8:allf=t" -c:v libx264 -preset fast -crf 20 -c:a copy grain.mp4

# Grain-preserving final encode (verbatim from optimizeReencode, the -tune grain path):
ffmpeg -i grain.mp4 -c:v libx264 -preset slow -crf 23 -tune grain -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart out.mp4
ParamValue
crf23
allft
alls8
tunegrain
crf_noise_heavy30

Units that use this recipe

13 units

Every finished unit with Film Grain in its recipe. Open one to see the full ingredient list, or remix straight from a tile.