Skip to content
OMNI Labs
WorkLookbookMusicJournal
TalentMethodCertificationWardrobe
BuildAutomationEmbodimentAutonomyPen
Contact
Creative AI Production Studio
OMNI Labs
01Home02Work03Lookbook04Music05Journal
StudioTalentMethodCertificationWardrobe
LabBuildAutomationEmbodimentPen
06Contact
hello@omnilabs.studioIstanbul · Global

Start a project →

© OMNI Labs · Creative AI Production Studio

← Journal
  1. Home
  2. Journal
Cost & Workflow

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.

OMNI Labs17 Oct 2026Updated 25 Oct 2026

Low-light still from OMNI Dramas: a woman and a man in a dim, warm interior

On this page

  1. Start at 2 to 3 percent, with cells at 1.5 to 2.5 px
  2. Capture PNG, not JPEG at quality 80
  3. Run at 24 fps and re-seed every frame
  4. Grain goes last, after halation and bloom
  5. Export for the round-trip, then judge the upload
  6. When grain dances on faces after upload
  7. What we have not measured yet

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.

warning

The phone test that would prove the 1.5 to 2.5 px rule has not been run yet. Until it has, the range is our practice, not a result.

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.

OMNI Labs is a creative AI production studio.Everything in the Journal comes from our own productions and tests.Start a project

Related

  • Talk-show desk with a vintage microphone and a rotary telephone in a wood-panelled 1970s studio

    test25 Oct 2026

    Local Voice Acting Speed Is Set by Layers, Not VRAM

    Eight expert layers ran at 2.5 frames per second; twenty ran at 22.1. VRAM sat near 16 GB at every setting, so memory was never the speed knob in our AI voice acting TTS runs.

  • Beauty close-up of synthetic model Milena Lindqvist: pale skin with freckles and fine texture, side-lit

    test25 Oct 2026

    Upscaling AI Video Without Plastic Skin

    The upscaler with the best sharpness score was the one a producer rejected. Here is what we tested, what each one did to faces and products, and how to check an upscale properly.

  • Still from the OMNI Labs GRAUWALD film: a small figure at the foot of a giant pine in a white, fog-filled forest

    guide20 Oct 2026

    MiniMax H3 Needs a Schema, Not Prose

    We rewrote a camera move and the walk direction and got a byte-identical video. We changed only the seed and got a different film. What H3 actually listens to, measured on a local 16 GB GPU.