Does Recast change the background? Check frames with video inspect

Docs say Recast keeps motion, camera, cuts and sound, not props. Compare matching stills from source and output with POST /v1/video-inspect.

6 min readSume
All posts

The documentation promises that Recast changes who is on screen while keeping the source's motion, camera, cuts and sound; it does not promise that the background, props and on-screen text come through pixel for pixel. fal's description reads that way (read 2026-10-03), and Sume's Video Router docs say the output "keeps source motion, camera, cuts and sound" (Video Router docs). So treat the rest of the frame as something to verify. The fastest way is to sample stills at the same timestamps from the source and the output with POST /v1/video-inspect and compare them.

The inspect call reads a Sume-hosted clip, returns probe facts such as duration and audio, and returns stills as durable media URLs. It never re-encodes anything.

What is and is not promised

A careful reading of the two docs separates the guaranteed from the plausible. People are replaced by the people in the photos. Motion, camera, cuts and audio are kept. Anything else in the frame, such as a logo on a shirt of a person who is replaced, a product the person holds, a screen behind them or text in the scene, is not mentioned, so a clip that depends on any of it needs a look before it ships.

Recast promises and what to check, read 2026-10-03
ElementDocumentedCheck?
Who is on screenReplaced by reference photosYes: every cut
Motion and cameraKeptSpot check
CutsKeptCount them
AudioKeptListen once
Background and setNot specifiedYes
Props and productsNot specifiedYes
On-screen text and logosNot specifiedYes

Sample matching stills

Run inspect on the source and on the output, asking for the same timestamps. Both clips must be media.sume.com artifacts in your workspace; the docs say off-host URLs are rejected, so import the source first with POST /v1/media-imports. The frames.at array takes 1 to 24 timestamps in seconds; max_edge defaults to 768 and format to jpeg. Default mode is sync and waits up to 30 seconds, returning 200 with the result or 202 with a job to poll.

import asyncio
import os

import httpx

TIMES = [0.5, 3.0, 6.0, 9.0]

async def stills(c: httpx.AsyncClient, url: str, tag: str) -> list[dict]:
    r = await c.post(
        "/v1/video-inspect",
        json={"video_url": url, "frames": {"at": TIMES}},
        headers={"Idempotency-Key": f"inspect-{tag}-001"},
    )
    r.raise_for_status()
    body = r.json()
    inspect = body.get("video_inspect") or body.get("data", {}).get("video_inspect") or body
    return inspect.get("frames", [])

async def main() -> None:
    key = os.environ.get("SUME_API_KEY")
    if not key:
        raise SystemExit("set SUME_API_KEY")
    async with httpx.AsyncClient(
        base_url="https://api.sume.com",
        headers={"Authorization": f"Bearer {key}"},
        timeout=60,
    ) as c:
        src = await stills(c, "https://media.sume.com/artifacts/artf_demo/source.mp4", "src")
        out = await stills(c, "https://media.sume.com/artifacts/artf_demo/recast.mp4", "out")
        for a, b in zip(src, out):
            print(a.get("t"), a.get("url"), b.get("url"))

asyncio.run(main())

How to compare

Open each pair side by side. Look first at the replaced person, then at the edges of the frame, then at any text. If the frames are different in ways that matter, rerun the clip, adjust the prompt to say what to keep, or move to a tool that edits only what you describe. If the frames match, you have evidence for the specific clip, which is the only evidence that counts.

Remember the cost of the check itself. Inspect bills the Modal compute it uses, at container seconds times the Modal list times 1.25 plus the platform fee, never above its hold. Stills are cheap next to a video render, and catching a changed logo before a campaign ships is the whole point of paying for them.

  • Use the same timestamps for source and output.
  • Sample after each cut, not only at the start.
  • Keep the stills with the job record as your approval evidence.

Choosing timestamps that catch problems

Evenly spaced stills miss the moments that matter. Choose timestamps with intent: one just after each cut, because a new shot is where a replaced person is most likely to drift; one at the moment the person is closest to the camera, where face detail is easiest to judge; and one at the moment the person handles a product or points at something, where props matter. With four to six stills per clip you cover the likely failures without paying for all 24 the call allows.

The default is eight mid-bin stills, which is a reasonable first pass when you do not know the cuts. Once you know them, switch to explicit at values. If you only want to skim a long clip quickly, the docs describe a seek: fast mode that snaps each still to an earlier keyframe, but use the default precise mode here, because a comparison is meaningless if the two stills are not the same instant.

Keep the stills. A folder of paired stills with the job id is the cheapest approval record you can create, and it answers the question a client or a platform reviewer will eventually ask: what changed between the source and the delivered clip.

When to prompt about the rest

The prompt is optional, but it is where you say who becomes whom or which details to keep. If a prop matters, mention it. The docs do not guarantee that the prompt preserves it, so the stills are still your check. A prompt is guidance, and the frames are the verdict.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume