Add a soft glow to video by API: split, gblur, screen blend

Sume's video filter allowlists split, gblur and blend, enough for a dreamy glow: blur a copy, then screen it over the original at partial opacity.

4 min readSume
All posts

A dreamy, soft-focus glow is a classic composite: blur a copy of the frame, then screen it over the sharp original. In Video filter the three pieces are all allowlisted, split and blend under Compositing and gblur under Blur / sharpen / noise, and internal labels such as [a] and [b] are allowed. Stream specifiers like [0:v] are refused because the server wraps the graph itself.

Which options set the glow strength?

Options of blend as listed in the FFmpeg filter documentation, read 2026-10-01.
OptionWhat it does
gblur sigmaBlur radius in pixels, default 0.5. Larger values spread the glow.
blend all_modeBlend mode for all components; screen brightens where the blurred copy is light.
blend all_opacityStrength of the blended copy, 0 to 1. 0.5 is a restrained starting point.

How do I write the graph?

Split the clip into labels a and b, blur b, then blend the two. The graph must start with a filter and end with a filter, not a label, so the blend is the last element. In a local ffmpeg 9.0.1 run on a test pattern this exact graph encoded without error.

curl -X POST https://api.sume.com/v1/video-filter/check \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/portrait.mp4",
    "filtergraph": "split[a][b];[b]gblur=sigma=12[bl];[a][bl]blend=all_mode=screen:all_opacity=0.5"
  }'

Will the glow hurt skin or text legibility?

It lifts highlights and lowers local contrast, so small on-screen text can look weaker. Keep all_opacity low for clips with burned-in text, or apply the look before captioning, since caption burn-in is a separate job.

Is this the same as the vignette or grain looks?

It is a different look. A vignette darkens edges, and grain adds noise; see add a vignette and film grain. They can share one graph, up to 32 named filters, if you want a full vintage-soft treatment.

What does a filter job cost and where are the limits?

The docs list $0.02 per encode job, with a source of at most 300 seconds, a filtergraph of at most 2048 characters and 32 named filters. The /v1/video-filter/check route runs the same allowlist and source checks for free and returns valid and next_action; a graph that passes can still fail on the worker (bad expression, memory, time), which comes back as a structured job error.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume