AI clips look too clean. The model leaves out the small things a real camera adds: sensor noise, dark corners, grain that moves. So the picture looks glassy and flat, and viewers spot it as AI.
A grade, a vignette and per-frame grain take most of that away. Here is the whole look in one command:
ffmpeg -i clip.mp4 -vf "eq=contrast=1.07:saturation=1.10,vignette=PI/4.5,noise=c0s=14:c0f=t+u" -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -movflags +faststart -c:a copy clip-film.mp4
Three filters run in order: eq for contrast and saturation, vignette for the corners, and noise for grain. Each one is explained below, with a tuner for trying values on your own clip.
Before and after on our own clip
Both clips below are ours, made with Seedance. The left one is the model's output. The right one is the same clip after the command above.
The change is small on purpose. Heavy grain reads as a bad phone video, not film. You want viewers to feel the texture, not see it.
Step 1: raise contrast and saturation
eq=contrast=1.07:saturation=1.10
Both values are multipliers, and 1.00 leaves the frame alone. Stay between 1.05 and 1.10 for contrast, and 1.05 and 1.15 for saturation. Past that, skin turns orange and shadow detail blocks up.
Test two shots before you lock a number in: a face in daylight, and a dark scene. The dark scene shows the damage first.
Step 2: darken the corners
vignette=PI/4.5
The angle is a lens angle in radians, and the bigger the angle, the darker the corners. PI/5 is the default and barely shows, PI/4 is a clear vignette, and PI/3 is heavy, best saved for flashbacks and title cards.
Keep dialogue shots at PI/4.5 or weaker. Faces near the frame edge lose detail fast.
Step 3: add grain that moves
noise=c0s=14:c0f=t+u
c0s sets the strength on the luma channel, which keeps the grain grey, the way film looks. If you use the all-channel form instead (alls=14), the colour channels get noise too, and it reads as a phone camera in low light.
c0f=t+u changes the noise every frame. Leave the flag off and ffmpeg averages the noise over time. That turns it into a faint moving pattern, not grain.
For strength: 8 is subtle, 14 is the pair above, 24 is heavy. One catch: this grain is one pixel wide. It looks finer on a 1080×1920 export than on a 540×960 one, so pick your number at your export size.
Try the numbers on your own clip
The tuner below runs in your browser. Load a frame or a short clip, move the sliders, then copy the command it builds. Nothing is uploaded.
Live preview — close, not exact. The pair above is a real render.
Previewing our own Seedance clip. Load yours to check the look on it — the file never leaves your browser.
ffmpeg -i clip.mp4 -vf "eq=contrast=1.07:saturation=1.10,vignette=PI/4.5,noise=c0s=14:c0f=t+u" -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -movflags +faststart -c:a copy out.mp4The preview is an approximation. It uses the same numbers, but browser filters are not ffmpeg. The pair at the top is the real render.
What grain costs in file size
Grain is random detail, and encoders spend bits on random detail. These are our own numbers, from a 5-second 540×960 clip:
| Encode setting | File size | Grain |
|---|---|---|
-crf 18 | 15 MB | keeps all of it |
-crf 23 | 1.7 MB | visible but softer |
-crf 23 -tune grain | 8 MB | keeps most of it |
Takeaway: a grainy master is a big file. Export once at -crf 18 to -crf 20, then let the platform compress for playback. Re-encode a grainy clip twice and the grain turns to mush.
The same look in CapCut and Resolve
If you don't use ffmpeg:
- CapCut: add grain from Effects → Video effects → Texture, or drop in a "4K film grain" overlay. Vignette sits in the Adjust menu. Raise contrast and saturation in that same menu.
- DaVinci Resolve: drop Film Look Creator (Effects → Resolve FX → Film Emulation) onto a node. It bundles grain, vignette and halation, with 65mm and 35mm presets. Balance the shot first, or the effect fights your grade.
Whatever tool you pick, choose the grain amount while the clip plays. A still frame hides how much it flickers.
Where the look does not help
Grain changes texture, not the picture. These problems stay:
- A face that changes between shots needs reference images, not noise. See character consistency.
- Hands, crowds and physics errors stay wrong.
- A flat or badly lit frame stays flat. Grain just adds texture to a flat frame.
Next
The look lands in the edit, so editing and captions is the next step. The demo clip came from our Seedance thriller prompts. If you run models on your own machine, the ComfyUI workflows guide shows where ffmpeg fits after generation.
Sources
- mp.weixin.qq.com/s/wctLBLN5GiOHtgPg8cvVhg
- ffmpeg.org/ffmpeg-filters.html#eq
- ffmpeg.org/ffmpeg-filters.html#vignette
- ffmpeg.org/ffmpeg-filters.html#noise
- trac.ffmpeg.org/wiki/Encode/H.264
- www.capcut.com/resource/film-grain
- www.capcut.com/resource/how-film-grain-overlays-for-video
- photography.tutsplus.com/tutorials/how-to-quickly-add-vignette-effects-in-capcut--cms-108824
- blog.frame.io/2024/08/15/what-is-resolves-new-film-look-creator-plugin
- www.blackmagicdesign.com/products/davinciresolve