Skip to main content

transcode

Re-encode a video to a different codec, container, or quality.

trim

Cut a clip by start offset and duration (lossless).

segment

Split a video into fixed-length segments (multi-output).

thumbnails

Extract frames at a fixed interval (multi-output).

scale

Resize a video (aspect-preserving when height is -2/-1).

extract_audio

Extract the audio track to mp3/wav/m4a. Optional sample_rate + mono make the output speech-to-text ready (a fixed-rate mono track an ASR model can ingest).

gif

Make an animated GIF from the clip.

watermark

Overlay an image/video (input_urls = [base, overlay]).

captions

Burn subtitles (SRT/VTT/ASS) into the video (input_urls = [video, subtitle]).

subtitle_compose

Author + burn animated TikTok-style captions — a timed top hook + a word-styled, animated bottom transcript — from word timings. input_urls = [video]; the styled .ass is server-generated from words/hook/style, so no subtitle file is supplied. Pass concrete style fields directly (no preset names).

concat

Concatenate 2-10 clips (input_urls = clips, normalized).

concat_copy

Losslessly rejoin 2-50 already-encoded, SAME-codec chunks via the concat demuxer with -c copy — no re-encode (input_urls = chunks in order). The chunks MUST share identical video+audio codecs/params; the engine probe-gate rejects a mismatch (a -c copy across divergent codecs can exit 0 yet play corrupt). For clips that differ, use concat (filter-concat re-encode) instead.

speed

Change playback speed (0.25x-4x).

volume

Adjust audio volume (0-10x). Container mp4/mkv only.

loudnorm

Normalize audio loudness to a target (EBU R128). Container mp4/mkv only.

reverse

Reverse video + audio.

poster

Produce an mp4 + a jpg poster frame (named outputs).

rotate

Rotate 90/180/270 degrees.

crop

Crop a region (omit x/y to center).

pad

Pad onto a canvas with a background color (omit x/y to center).

reframe

Reframe to a social aspect ratio (9:16/1:1/4:5/16:9) by crop (fill) or pad (letterbox).

reframe_track

Pan a fixed-size crop window across the frame to follow a subject, driven over time by a crop-track sidecar (input_urls = [video, crop_track]). input1 is a server-staged ffmpeg sendcmd script of timestamped crop commands. NOTE: the crop-track is emitted upstream by a saliency/face-tracking model that is NOT yet in the catalog, so this capability is INERT until that model is onboarded — it is not generally usable yet.

fade

Fade the video (and matching audio afade) in and/or out. type out/both REQUIRE fade_out_start (static argv cannot derive the clip duration).

color

Grade a clip via ffmpeg’s eq filter: brightness/contrast/saturation/gamma. A bare color (all defaults) is the identity grade — it re-encodes but leaves the picture unchanged.

lut3d

Color-grade a clip through a caller-supplied .cube 3D-LUT via ffmpeg’s lut3d filter (input_urls = [video, cube_lut]).

stills

Extract a single frame as a jpg/png image. position first/last/at (default first); position at REQUIRES timestamp (static argv cannot derive the clip duration). quality applies to jpg only (png is lossless).

overlay

Composite a second video over a base at a corner/center anchor (input_urls = [base, overlay]).

audio_replace

Replace or mix a video’s audio track with a second input (input_urls = [video, audio]). Container mp4/mkv only.

package_abr

Package a video into an adaptive-bitrate streaming bundle: CMAF HLS (master.m3u8) + DASH (manifest.mpd) over shared fragmented-mp4 segments. Clear (no DRM); stream-copies (no re-encode). Input should carry both a video and an audio stream. Routed to the Shaka packager.

package_abr_ladder

Package a video into a multi-rendition adaptive-bitrate ladder: CMAF HLS (master.m3u8) + DASH (manifest.mpd) over N renditions (clear, no DRM). Re-encodes each rung, so any source codec is accepted; the input must carry both a video and an audio stream. Give an explicit renditions list OR a ladder preset (not both); omit both for a default ladder clipped to the source height. Widths are derived from the source aspect (never supplied); a rung taller than the source is rejected (no upscaling). Unlike package_abr (single-rendition stream-copy via Shaka) this builds the full ladder; unlike hls_ladder (HLS only) it also emits DASH.

hls_ladder

Encode a TRUE multi-rendition adaptive-bitrate HLS ladder (master.m3u8 + N variant playlists/segments) in one ffmpeg pass. Re-encodes every rung, so any source codec is accepted; the input must carry an audio stream. Give an explicit renditions list OR a ladder preset (not both); omit both for a default 3-rung 720p ladder. Unlike package_abr (single-rendition stream-copy via Shaka), this builds the full ladder over the ffmpeg baseline. Upscaling above the source is NOT rejected, so choose rungs at or below the source height.

scene_detect

Detect hard cuts and return a structured analysis ({scenes:[{time,score}]}) as the result — a metadata RESULT, not a media URL (egress 0).

silence_detect

Detect silent spans in the audio and return a structured analysis ({silences:[{start,end,duration}]}) as the result — a metadata RESULT, not a media URL (egress 0); an input with no silence is a valid empty result.

probe

Probe a media file with ffprobe and return its container format + streams as a structured JSON RESULT (codecs, duration, resolution, bitrate, …) — a metadata RESULT, not a media URL (egress 0). Use it to inspect a source before choosing an operation.

silence_remove

Keep only the given time ranges and concatenate them into one continuous output (gaps closed) in a single ffmpeg pass — the ‘act’ half of silence-skip and long->short editing. Chain silence_detect first and invert its silent spans into the kept ranges. Ranges must be sorted ascending and non-overlapping; everything outside them is dropped. Re-encodes.

storyboard_sprites

Sample frames at a fixed interval and pack them into one tiled sprite sheet image PLUS a WebVTT thumbnail index (named outputs: sheet + vtt).

slideshow

Turn 2-50 still images into one silent video (input_urls = images): each image is shown for image_duration, normalized to a common canvas, optionally Ken Burns-zoomed, and concatenated.

crossfade

Crossfade two clips into one (input_urls = [first, second]): the video xfade starts offset seconds into the first clip and blends over duration seconds; the audio always acrossfades at the junction of the two tracks. Both inputs must carry a video AND an audio stream and share a frame rate. Re-encodes.

silence_split

Detect silences and split the file at them in one job (multi-output: seg_000, seg_001, … in order): each cut lands at the END of a detected silence, so each new segment starts where sound resumes. max_segment_seconds force-cuts when no usable silence arrives in time. The input must carry an audio stream. Default stream-copy snaps cuts to keyframes; reencode=true gives exact boundaries (H.264, invalid in webm).

sticker_overlay

Composite a sticker/logo image (or video) over a base video inside a timed window (input_urls = [base, sticker]): visible from start until end (omit end to run to the source end). Same anchors as overlay; the sticker’s own alpha is honored (no opacity control). Only the base’s audio is kept. Re-encodes.

title_card

Draw a text title over the video with drawtext (rendered verbatim — no ffmpeg expansion; newlines break lines; max 200 chars after normalization). Show window: omit start and end for the whole video, start alone runs to the end, end alone runs from the beginning. Re-encodes.

audio_duck

Duck a music/program bed under a voice track (input_urls = [music, voice]): the voice drives a sidechain compressor that lowers the music while the voice is above threshold, then the same voice is mixed on top. Audio-only output (a video input contributes only its audio) running exactly as long as the music; levels are never auto-normalized. Both inputs must carry an audio stream.

audio_master

Master the audio track to a distribution loudness target: a fixed gentle compressor, then single-pass EBU R128 normalization, then a true-peak limiter, written audio-only (always resampled to 44100 Hz). Give target_lufs/ceiling_dbtp OR a named preset — NOT both (a call supplying preset alongside target_lufs/ceiling_dbtp is rejected before submission); omit all three for the engine defaults (-14 LUFS / -1 dBTP). For normalization without compression use loudnorm instead. The input must carry an audio stream.

audio_analysis

Measure the audio track — integrated loudness (LUFS), loudness range (LU), true peak (dBTP), sample peak (dBFS), and the astats clipping indicators flat_factor/peak_count — via astats+ebur128, returned as a structured JSON RESULT, not a media URL (egress 0). The input MUST carry an audio stream. A field that cannot be measured is omitted (e.g. digital silence has no finite dB peak) — treat a missing field as not-measurable, never as 0.

run_ffmpeg

Run an arbitrary ffmpeg command (full power). Put the ffmpeg arguments in args (the leading ffmpeg is added for you). Use {input} for a single input_url, or {input0}/{input1}/… for multiple input_urls; use {output} for the output. Subject to server-side allowlist.

upload_file

Upload a local file (max 100MB) to eachlabs storage and get a public URL usable as input_url for the other tools. The presign call and the upload PUT do not create a prediction and are not billed as one; storage egress may bill per your plan.

get_job

Fetch the current status/result of a prediction you did not wait for.
Last modified on August 13, 2026