Re-Seed Grain Every Frame, or It Reads as a Dirty Screen
Holding one grain seed reads as a dirty screen, and re-seeding every second frame strobes at 24 fps. These are the film grain settings and export chain we use, and the parts we have not yet proven on Instagram.

Key takeaways
- Our grain starts at 2 to 3 percent amount with a 1.5 to 2.5 px cell at 1080 wide; these are starting points, not measured survival rates.
- A 1 px grain cell is the value we avoid, because per-pixel noise gets smoothed away or turns into blocks in skin and shadows.
- A grain shader re-seeded every frame at 24 fps reads as film; holding one seed reads as a dirty screen, and re-seeding every second frame strobes.
- Our default JPEG frame capture at quality 80 eats grain first, so finishing renders use PNG frames tagged bt709.
- When grain dances on faces after upload, our finishing notes say +0.3 px cell size and -0.5 percent amount; that rule is not yet measured on our uploads.
Start at 2 to 3 percent, with cells at 1.5 to 2.5 px
Our grain starts at 2 to 3 percent amount with a cell size of 1.5 to 2.5 px at 1080 wide, applied mostly in luma. The reference setting, L1, uses 2.5 percent amount, a size of 2.0, chroma at 0.15, and a shadow cut of 0.4, which pulls grain out of the deepest 10 percent of shadows.
These are starting points. We have not measured how much of this grain survives an Instagram upload, so treat the range as a working default rather than a proven threshold.
The value we avoid is 1 px. A one-pixel cell is per-pixel noise, and per-pixel noise is the most expensive detail for the Instagram encoder. It gets smoothed away, or it turns into blocks in skin and shadows.
The reason the range sits where it does comes down to how much of the grain is per-pixel detail. Smaller cells look finer on the monitor, but per-pixel detail is exactly what the encoder discards first, so the finer the cell, the less of it is left on the feed.
Capture PNG, not JPEG at quality 80
Our default frame capture is JPEG at quality 80, and that format eats grain first. By the time the video reaches the encoder, the fine texture is already gone. Finishing renders use PNG frames instead, with the colour space tagged bt709.
The colour tag is a separate fix. Remotion leaves colour untagged by default, so we always pass the bt709 colour-space flag. We checked this against the installed renderer, version 4.0.478. An untagged frame leaves the colour space to be guessed, and we do not want that guess made for us.
Capture is a one-way step. Any loss at capture is inherited by every later stage, so the frames that enter the grain pass should already be as clean as the pipeline allows. Choosing PNG costs disk space and buys back the texture that JPEG would have removed before the grain was ever added.
Run at 24 fps and re-seed every frame
A grain shader re-seeded every frame at 24 fps reads as film. Holding one seed reads as a dirty screen. Re-seeding every second frame strobes at 24 fps. The seed pattern decides whether the grain moves like film or like a fault.
We compose at 24 fps because it is Seedance's native rate. The 30 fps default in our Remotion template adds pulldown judder, and interpolating up to 30 smears the film cadence. The grain and the picture should run on the same clock, and at 24 fps they do.
Tying the re-seed to the frame rate is the practical part. At 24 fps, a seed that changes every second frame produces a visible beat, and that beat is the strobe we see. Re-seeding every frame removes the beat rather than hiding it under a lower amount.
Grain goes last, after halation and bloom
Order decides what grain can survive. Grain goes in after halation and bloom. The gate weave moves the image and the grain together, so the texture stays locked to the picture rather than sliding over it.
Grain is never applied before an upscale, because the upscaler sharpens it into a crawl. The same problem shows up on our own upscale path. FlashVSR over-sharpens faces and erases skin texture in our tests, so the grain we add afterwards becomes the only texture left on skin. Its settings have to hold up on a surface that has been smoothed.
Halation stays off skin. We raise its threshold instead of cutting its intensity, and the subject matte keeps it off faces. The glow stays in the background, and the face keeps the grain it was given.
Each step in this order is a place where grain can be lost or distorted, so the sequence is part of the recipe. Changing the order changes the result even when every individual setting stays the same.
Export for the round-trip, then judge the upload
Our export is H.264 at CRF 15, slow preset, yuv420p, bt709, with the mix at 320 kbps AAC, 48 kHz. These settings are chosen for the file that leaves our machine, but the file that counts is the one Instagram serves back.
Judge grain after an Instagram round-trip, not on the monitor. A grain pass can look right in the editor and still turn to mush once the platform has re-encoded it. Upload the clip, pull back the version the platform serves, and judge that frame by frame before deciding the grain is right or wrong.
Nothing after the export can add back texture that the export removed. The platform's re-encode is the last stage, so the only thing you can still change is the file you hand it.
When grain dances on faces after upload
If grain moves or shimmers on faces after upload, our finishing notes give one correction: increase the cell size by 0.3 px and reduce the amount by 0.5 percent. Start from L1, where the amount is 2.5 percent and the cell size is 2.0, and apply the correction from there. The correction is relative to the setting you are already running, so it moves with your baseline rather than replacing it.
This is a rule from our finishing notes, not a measured result on our own uploads. We have not yet checked it against a phone test, so run it on one clip and judge the round-trip before you change a whole batch.
What we have not measured yet
Three things in this article are rules or starting points, and they should be read that way.
- The 1.5 to 2.5 px survival range has not been validated by a phone test.
- We have no measured survival rate for any grain amount after an Instagram upload.
- The +0.3 px and -0.5 percent correction comes from our finishing notes and has not been measured on our own uploads.
The first test to run is the phone test: the same clip rendered at 1 px, 1.5 px, 2.0 px and 2.5 px, uploaded, pulled back from the feed and judged side by side. Until that exists, the numbers above are the settings we start from, not the settings the platform has been shown to keep.



