Show only what moved between frames: tblend in difference mode

Sume's video filter allowlists tblend. In difference mode each frame is blended with the previous one so static areas go dark and movement lights up.

4 min readSume
All posts

tblend blends each frame with the one before it, and it is on the allowlist in Video filter under Time. With all_mode=difference, areas that did not change between frames come out near black and areas that moved stay visible, which makes a quick motion map. It is useful for checking a locked-off shot for unwanted drift or flicker, not a finished-video effect.

Which tblend options choose the effect?

Options of tblend as listed in the FFmpeg filter documentation, read 2026-10-01.
OptionWhat it does
all_modeBlend mode for all components. Includes difference, average, darken, addition and many others.
c0_mode to c3_modeSet one component's mode separately.
all_opacityBlend strength, 0 to 1.

How do I run a motion check?

Check the graph and encode a short range. A tripod shot should come out nearly black, with bright edges only where something moved. A shot with camera shake lights up the whole frame, which is the signal you wanted.

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/motion.mp4",
    "filtergraph": "tblend=all_mode=difference"
  }'

Is this the same as frame blending for motion blur?

It uses the same filter family but a different goal. Motion blur averages neighbouring frames to smear movement; see add motion blur with tmix. difference subtracts instead, so static pixels cancel.

What can I do with the result?

Look at it, or pull stills from it with video inspect to check the amount of motion at specific times. The filter output is a normal MP4 and can sit in a Timeline 1.0 slot as a graphic. If a clip flickers rather than moves, deflicker is the allowlisted filter to try.

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