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 inargs (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.