❉Recipe
Film Grain
encode settingsTemporal 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
# 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
| Param | Value |
|---|---|
| crf | 23 |
| allf | t |
| alls | 8 |
| tune | grain |
| crf_noise_heavy | 30 |
Units that use this recipe
13 unitsEvery finished unit with Film Grain in its recipe. Open one to see the full ingredient list, or remix straight from a tile.




















