cuttingfloor

io.github.Mvp2o-ai由 GitHub 账号 Mvp2o-ai 发布v0.36.1更新于 Nov 7, 2026

Hosted video editing for AI agents: cut, caption, mix and export real video. Sign in with OAuth.

已验证Streamable HTTP可网页运行媒体与设计AI 与机器学习

概览

AI 生成的概览

面向 AI 智能体的托管式无界面视频编辑器:导入素材、剪辑、加字幕、混音、加特效并导出真实视频文件。

可以做什么
  • 创建与导入素材:渲染动画 HTML、静态图、遮罩和配音,或导入视频、音乐和标志
  • 搭建与编辑时间线:添加、裁剪、分割、移动、链接和替换片段,管理轨道,批量执行编辑
  • 调整时间与结构:变速与速度曲线、倒放、定格、roll、slip、slide,以及区间提取或移除
  • 添加文字与音频:标题、由分段或 SRT/VTT 生成的字幕、增益、声像、淡入淡出和总线限幅
  • 特效与合成:滤镜、调整层、转场、变换、遮罩、混合模式和动画
  • 分析、预览、检查与导出:转录、节拍、人脸、按描述查找片段、帧预览、质量检查,导出 MP4/ProRes/GIF/音频或 FCPXML、OTIO、EDL
适用场景
适合让助手真正制作或剪辑视频而不只是描述剪辑:剪长素材、加字幕、做社交短视频、动态图形或配音,并交付成片文件或可交给其他剪辑软件的工程。
运行要求
托管使用需在服务商网站注册账号(三天免费),并通过 MCP 客户端完成 OAuth 登录,无需安装。自建需 Docker 与 compose 配置,并设置素材与导出目录。部分功能需自备服务商密钥,例如本地用 SYNC_API_KEY、托管用 X-Cuttingfloor-Key-Sync 请求头,用于口型同步。
安装前请注意
时间线不可变,每次编辑返回新的 timeline id,需始终使用最新的一个。内容不会永久保存:时间线在最后使用后 24 小时过期,素材和导出在 7 天后过期,需导出以保留成果。托管模式下素材会上传到服务商服务器进行转录、配音、抠像和渲染。口型同步按发送的秒数向你的服务商账户计费。服务商密钥属于凭据,不要写进提示词。

安装

在 SourceWeft 中

  1. 打开 控制台中的 cuttingfloor,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.Mvp2o-ai%2Fcuttingfloor/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "cuttingfloor": {
      "type": "http",
      "url": "https://api.cuttingfloor.ai/mcp"
    }
  }
}

README

cuttingfloor

A headless video editor for agents, as an MCP server. An agent imports footage, cuts it on a timeline with granular editing tools, looks at the result after every edit, checks it, and exports a file.

  • Every edit returns a new timeline id, plus a preview image of the result. Timelines are immutable, so going back is just using an older id.
  • Nothing is stored for you. Timelines, media and outputs live in a cache with a time limit (24 hours for timelines, 7 days for media and exports). Export to keep work.
  • One Docker image runs locally (free) and hosted. Engines (FFmpeg, MLT) ship inside it; Docker is the only thing you install.

What it covers: import, cutting on words, timing, transitions, titles and captions, audio, effects, analysis (transcripts, beats, faces, tracking, scenes), compositing, motion graphics and stills from HTML, voiceover, cut-outs, stems, stabilizing, upscaling, lip-sync, previews, QA checks, and export to MP4, ProRes, GIF and audio or to Final Cut, Premiere and Resolve (FCPXML, OTIO, EDL). Every tool: cuttingfloor.ai/features. Use it from Kazi, Claude, ChatGPT or any MCP app.

Use it hosted

Sign up at cuttingfloor.ai (three days free), then add https://api.cuttingfloor.ai/mcp as a remote MCP server in Claude, ChatGPT, Cursor, Kazi or any client that takes one. The client opens the sign-in itself (OAuth). Nothing to install; transcription, voiceover, cutouts and rendering run on our servers. The official MCP Registry entry lists the same address.

Run it yourself

sh
docker compose up -d          # local mode: one node on 127.0.0.1:8787, plus the motion sandbox

Compose starts two containers from the same image: cuttingfloor (the server) and cuttingfloor-motion, the sandbox where agent-written HTML for create.motion and create.still renders. The sandbox has no route out, no data volume, no capabilities, a read-only filesystem and fixed CPU, memory and process limits. Chromium's own sandbox stays on inside it, using the seccomp profile at tools/motion/seccomp.json (Docker's default plus namespace creation). Run compose from a checkout of this repository so that file is there.

Connect an MCP client over Streamable HTTP:

json
{ "mcpServers": { "cuttingfloor": { "url": "http://127.0.0.1:8787/mcp" } } }

Or over stdio, for clients that only launch commands. The stdio process forwards to the running container, so long exports keep going after the client exits:

json
{ "mcpServers": { "cuttingfloor": { "command": "docker", "args": ["exec", "-i", "cuttingfloor", "cuttingfloor", "mcp"] } } }

Folders (set them in a .env next to compose.yaml, see .env.example):

On your machineIn the containerWhat
$CUTTINGFLOOR_MEDIA (default ~/Movies)/media/videos (read-only)Footage. Import with {"path": "/media/videos/clip.mp4"}
$CUTTINGFLOOR_EXPORTS (default ~/cuttingfloor/exports)/exportsFinished exports
Docker volume cuttingfloor-data/dataTimelines, proxies, jobs (with time limits)

Provider keys are yours (bring your own) and go in the same .env, or in Docker secrets (/run/secrets/<name lower-cased>). They never pass through a tool, and video://server/health shows only whether each is set. create.lipsync needs SYNC_API_KEY from sync. labs (Settings → API keys); they bill your account for each second sent. Run docker compose up -d after adding one.

The image includes /samples/sample.mp4 (10 s test pattern with a tone) and /samples/card.png to try things with nothing mounted.

On Docker Desktop for Mac, raise the memory limit for long 4K timelines; bind-mounted footage reads go through VirtioFS. On Linux, create the exports folder before the first start so it belongs to you.

How an agent uses it

  1. media.import each file. It's long-running: a task for clients that support MCP Tasks, otherwise a job_id to poll with job.get. The media_id is usable once the job reports processing.
  2. media.analyze turns media into data an agent can edit with: transcript (every word with its time; whisper.cpp on the CPU, the model downloads once), beats (tempo, beats, downbeats), faces (face boxes over time) and track (follow a region). Then cut by words with clip.add {source: {words: [i, j]}} and caption with caption.add {in_clip: {clip_id, segments}}, timed in the media's seconds. media.seek finds moments from plain words, so an agent doesn't have to watch the whole video: give it criteria like {too_dark: "the faces are too dark to make out their eyes", demo: "the product dashboard fills the screen"} and it returns the stretches of a video, or of an edit as it renders, where each one holds, with the best frame of each. Use it to check quality, find where something starts, pick shots, spot changes or find room for a title. TypeSafe Jev judges the frames and needs TYPESAFE_API_KEY.
  3. timeline.create with a sequence ({width, height, fps: {num, den}}).
  4. Edit: clip.add, clip.trim (with side for J/L cuts), clip.split, clip.move, clip.remove (with ripple), clip.link, track.*, or edit.batch to apply many edits at once, using {"$ref": "ops[0].clip_id"} for ids made earlier in the batch.
  5. Time: clip.set_speed (constant rate, a speed-ramp curve, reverse; pitch is kept), clip.freeze, clip.roll, clip.slip, clip.slide, clip.replace, and range.extract / range.lift to cut a span out of every track at once. clip.add {nested_timeline_id} nests a whole timeline as one clip.
  6. Transition: transition.add at the cut after a clip: dissolve, dip to black or white, wipes, slides, pushes, zooms, iris and spin. Linked audio crossfades at the same cut. By default the clips overlap and later clips move earlier; mode: "handles" uses source past the cut and moves nothing.
  7. Text: title.add and caption.add (from segments with word timings, or from SRT/VTT) put text on a video track, rendered with libass: font, size, colour, outline, shadow, box, karaoke and word highlights, typewriter and word reveals. text.set restyles many at once. Fonts are listed at video://catalog/fonts; import your own .ttf/.otf with media.import and use it with font_media_id.
  8. Audio: audio.set_gain (dB, with keyframes for rides), audio.set_pan, audio.fade and audio.set_master (gain and a limiter ceiling on the whole mix). Audio edits preview as a waveform image with the measured loudness.
  9. Effects: filter.add on a clip, every clip on a track, or the whole timeline: colour (brightness, contrast, saturation, exposure, temperature, curves, LUTs imported as .cube), blur, sharpen, vignette, grain, glitch, pixelate, chroma key; for sound EQ, compressor, noise reduction, de-esser, dialogue enhance, reverb, echo, pitch. adjustment.add adds a clip whose effects change everything below it while it runs. The list with params is at video://catalog/effects.
  10. Composite: put a clip on a higher video track, then clip.set_transform (position, scale, rotation, opacity, crop, flip, fit; any number can take keyframes with easing), clip.set_mask (rectangle, ellipse, linear, mirror, heart, star, polygon), clip.set_blend and clip.set_animation (entrance, exit and loop presets). The accepted names are resources at video://catalog/{name}.
  11. Create: create.motion renders any animated HTML to a video with alpha, frame-exactly: CSS animations and transitions, the Web Animations API, SVG, canvas or WebGL drawn in requestAnimationFrame, timers, or a window.__seek(seconds) the page defines all run on a virtual clock the renderer steps one frame at a time. anime.js, three.js, Lottie and D3 load from lib/ (<script src="lib/anime.umd.min.js">). create.still renders an HTML page to a PNG, and create.matte makes a solid or gradient picture. Each returns a media_id for clip.add; the same recipe returns the same media. Pages can't reach the network, so images and fonts go in as assets (imported media) and are referred to as assets/<name>. create.voiceover speaks English text in one of 28 Kokoro voices on the CPU (the model, about 350 MB, downloads once) and times every word, so caption.add {in_clip} can caption it exactly. create.cutout removes the background behind a subject: any (BiRefNet; products, animals, objects, people; the default for pictures; needs about 3 GB of memory free for Docker) or people (MODNet; fast enough for video, the default there), keeping the sound. create.lipsync makes someone on camera say new words: give the video, the new speech (a re-recorded line or a voiceover) and the span of the video to change, and their mouth is redrawn to match by sync. labs on your own key (SYNC_API_KEY locally, the X-Cuttingfloor-Key-Sync header hosted). Only the span is sent; the result is that span, to place over the original.
  12. Look: preview: "inline" on any edit returns the image; render.frames returns up to 16 frames as a contact sheet, or up to 4 at full size (size: "full") for thumbnails.
  13. qa.check measures the render: gaps, offline media, frame count, loudness and true peak, plus black and silent stretches with the settings you give. Facts, no verdicts.
  14. export.video with a preset: web_1080p_h264, master_prores_422hq, social_9x16_h264, web_1080p_av1, gif, audio_wav_48k or audio_mp3, and overrides for size, frame rate, bitrate or quality (video://catalog/presets). The result has a signed download URL and, locally, the file in your exports folder.
  15. export.timeline hands the edit to another editor as FCPXML (Final Cut Pro, Resolve), OTIO (Premiere, Resolve) or a CMX 3600 EDL, or writes the captions as SRT or VTT, with warnings for what the format can't carry. media: "collect" zips the media alongside. timeline.get stays the lossless copy.

Time is integer frames at the sequence rate, end-exclusive. timeline.get returns the whole timeline as JSON; timeline.load restores it after it expires. video://server/health reports engine versions and limits.

Hosted mode

The same image with CUTTINGFLOOR_MODE=hosted: no path imports (URLs only), no exports folder, and every request needs Authorization: Bearer <key> from CUTTINGFLOOR_API_KEYS (owner:key,owner2:key2, or the cuttingfloor_api_keys Docker secret). Each key's owner has separate timelines, media and jobs. CUTTINGFLOOR_PUBLIC_URL is required: download links are built from it, and the server won't start without it.

Provider keys hosted come from the client, never from the server's environment: the MCP client sends each one as a header in its server config, X-Cuttingfloor-Key-<Provider>, for example X-Cuttingfloor-Key-Sync: <your sync. labs key> for create.lipsync. The key is used for that request and the job it starts, then dropped; it is never stored or logged. A tool that needs a key you haven't sent answers credential_required, naming the header.

json
{ "mcpServers": { "cuttingfloor": { "url": "https://api.cuttingfloor.ai/mcp", "headers": { "X-Cuttingfloor-Key-Sync": "<key>" } } } }
VariableDefault
CUTTINGFLOOR_DATA/dataData root
CUTTINGFLOOR_MAX_JOBScores ÷ 4Concurrent imports, exports and QA runs (sandbox jobs queue in the sandbox instead)
CUTTINGFLOOR_HEAVY_JOBS1Concurrent create.cutout and create.stems runs, in their own slots apart from the jobs above
CUTTINGFLOOR_SHORT_JOBS1Extra job slots only short jobs take (an analysis, check or export of at most CUTTINGFLOOR_SHORT_JOB_SECONDS of media), so they never wait behind long running ones
CUTTINGFLOOR_SHORT_JOB_SECONDS60How much media a job may read and still count as short
CUTTINGFLOOR_STALL_SECONDS300A running job whose progress hasn't moved for this long (or a quarter of a second per second of media it reads, if longer) is ended with a stalled error and its slot freed
CUTTINGFLOOR_MAX_RENDERScores ÷ 2, at least 2Renders (melt, encodes, transcription) at once, jobs and inline previews together; the rest wait their turn
CUTTINGFLOOR_OUTPUT_URL_TTL_HOURS24Signed download link lifetime
CUTTINGFLOOR_MAX_DOWNLOAD_BYTES10 GiBSize cap for URL imports and uploads
CUTTINGFLOOR_MOTION_URLunset (compose sets it)The sandbox for create.motion and create.still; without it those tools explain how to start one
CUTTINGFLOOR_MOTION_WORKERSone per two CPUs, up to 4Browsers that share a create.motion render; set on the sandbox

Develop

sh
pnpm install && pnpm check       # lint, typecheck, unit and protocol tests (Node 24+, pnpm 10)docker build --target test .     # everything, including engine and end-to-end testsdocker build -t cuttingfloor:dev . && node scripts/smoke-image.ts cuttingfloor:devnode scripts/smoke-motion.ts cuttingfloor:dev   # the sandbox in compose, attacked

Layout

PathWhat
apps/clicuttingfloor serve (HTTP), cuttingfloor mcp (stdio) and cuttingfloor motion-worker (the sandbox role)
apps/hostedThe HTTP node: MCP endpoint, signed downloads and uploads, API keys and script keys
packages/serverMCP tools, resources and the Tasks adapter
packages/schemaZod schemas for every tool, the timeline document and errors
packages/coreTimeline document, edit math, content hashing, storage with TTLs
packages/engineFFmpeg and MLT as subprocesses: probe, conform, proxies, frames, export, QA
packages/motionThe sandbox worker: pages rendered frame by frame on a virtual clock, one at a time
tools/Native helpers built into the image (cf-vision, cf-segment) and the sandbox's Chromium wrapper and seccomp profile
packages/jobsFile-backed job store and runner behind MCP Tasks and job.*
packages/credentialsBring-your-own provider keys

Licence

AGPL-3.0. Use it, change it and run it yourself. If you run a changed version as a service for other people, publish your changes under the same licence. The hosted service at cuttingfloor.ai runs this code.

来源:README.md,提交 cd3b4b4

工具

72

timeline.create

Create timeline

Start an empty timeline. Returns its timeline_id and its tracks (ids for track_id). Timelines are immutable: every edit returns a new timeline_id, and older ids stay valid for 24 hours after last use. For work longer than a day, keep the timeline.get document on your side and restore it with timeline.load.

输入参数nametrackssequence必填

timeline.get

Get timeline

The full timeline: tracks, clips (frames, end exclusive), link groups and the media it uses. The server keeps a timeline 24 hours after last use: for work longer than a day, save this document on your side (it is the edit) and restore it with timeline.load.

输入参数timeline_id必填

timeline.load

Load timeline

Restore a timeline from the document timeline.get returned, e.g. after it expired (24 h after last use). Its media must still be here: media expires 7 days after last use, so import saved files again with media.import and swap them in with clip.replace.

输入参数timeline必填

timeline.history

Timeline history

The chain of edits that made this timeline, newest first. To go back, keep using an older timeline_id.

输入参数limittimeline_id必填

timeline.diff

Diff timelines

Which clips, tracks and settings differ between two timelines.

输入参数to必填from必填

timeline.set_sequence

Set sequence

Change resolution, frame rate or audio format. Clip times are kept in time, so they survive a rate change. Each picture is refitted to the new shape by its fit (contain by default, which leaves bars where the shapes differ); the result warns how many clips no longer fill the frame, and clip.set_transform {fit: "cover"} fills it. Returns the edit result (see the server instructions).

输入参数previewsequence必填timeline_id必填

track.add

Add track

Add an empty video or audio track. New video tracks go on top. Returns the edit result (see the server instructions).

输入参数kind必填namepreviewtimeline_id必填

track.remove

Remove track

Remove a track and its clips. Returns the edit result (see the server instructions).

输入参数previewtrack_id必填timeline_id必填

track.set

Set track

Rename, mute (audio), hide (video) or lock a track. Returns the edit result (see the server instructions).

输入参数namemutedhiddenlockedpreviewtrack_id必填timeline_id必填

clip.add

Add clip

Place media on the timeline. A/V media lands as a linked pair on a video and an audio track. Default: the whole media, after the last clip, overwriting. A picture is scaled to fit the frame (a small logo fills it edge to edge); clip.set_transform {fit: "none"} keeps its own pixel size. Returns the edit result (see the server instructions).

输入参数avmodesourcepreviewat_framemedia_idtrack_id必填timeline_id必填other_tracksafter_clip_idlink_track_idduration_frames另有 1 个

clip.remove

Remove clip

Remove a clip and the clips linked to it; ripple closes the gap. Returns the edit result (see the server instructions).

输入参数rippleclip_id必填previewtimeline_id必填other_tracks

clip.move

Move clip

Move a clip (and its linked clips) to a frame and optionally another track. Returns the edit result (see the server instructions).

输入参数moderippleclip_id必填previewto_frame必填timeline_id必填to_track_idother_tracks

clip.trim

Trim clip

Move the start or end edge of a clip. side: video or audio trims one half of a link group (J/L cuts). Returns the edit result (see the server instructions).

输入参数edge必填siderippleclip_id必填previewto_frame必填timeline_id必填other_tracks

clip.split

Split clip

Cut a clip (and its linked clips) in two at a frame. Returns the edit result (see the server instructions).

输入参数clip_id必填previewat_frame必填timeline_id必填

clip.set_enabled

Enable/disable clip

A disabled clip stays on the timeline but renders as a gap. Returns the edit result (see the server instructions).

输入参数clip_id必填enabled必填previewtimeline_id必填

clip.set_speed

Set speed

Speed up, slow down, ramp or reverse a clip and its linked clips. rate is constant; curve is a speed ramp over the clip. The clip keeps its source and its length changes; ripple (default) moves later clips. Pitch is kept unless preserve_pitch is false. Returns the edit result (see the server instructions).

输入参数ratecurverippleclip_id必填previewreverseinterpolatetimeline_id必填other_trackspreserve_pitch

clip.freeze

Freeze frame

Hold the frame at at_frame for duration_frames: the clip splits there, a freeze frame goes in, and later clips on its tracks move later. Freezing a clip's last frame holds it after the clip, with silence under the hold. Returns the edit result (see the server instructions).

输入参数clip_id必填previewat_frame必填timeline_id必填other_tracksduration_frames必填

clip.roll

Roll edit

Move the cut between a clip and the clip right after it: one gets longer, the other shorter, nothing else moves. Returns the edit result (see the server instructions).

输入参数clip_id必填previewto_frame必填timeline_id必填

clip.slip

Slip edit

Show earlier or later source in a clip without moving or resizing it. Returns the edit result (see the server instructions).

输入参数clip_id必填previewby_frames必填timeline_id必填

clip.slide

Slide edit

Move a clip between its neighbours: the clip before it and the clip after it change length so nothing else moves. Returns the edit result (see the server instructions).

输入参数clip_id必填previewto_frame必填timeline_id必填

clip.replace

Replace media

Swap the media in a clip, keeping its place, length, speed and look. Starts at source_in (default 0). Its linked clips swap too (linked: false for this clip only); clip_ids lists every clip swapped. Returns the edit result (see the server instructions).

输入参数linkedclip_id必填previewmedia_id必填source_intimeline_id必填

range.lift

Lift range

Remove everything in a frame range on the given tracks (default all unlocked, so a picture range takes the sound under it too: lock a track with track.set or name track_ids to keep it), leaving a gap. changed lists each clip removed or cut, with its track; a warning says when sound went with the picture. Returns the edit result (see the server instructions).

输入参数range必填previewtrack_idstimeline_id必填

range.extract

Extract range

Remove everything in a frame range on the given tracks (default all unlocked, so a picture range takes the sound under it too: lock a track with track.set or name track_ids to keep it) and close the gap. For cutting out silences, filler words or mistakes across all tracks at once. changed lists each clip removed or cut, with its track; a warning says when sound went with the picture. Returns the edit result (see the server instructions).

输入参数range必填previewtrack_idstimeline_id必填

title.add

Add title

Text on a video track, over the tracks below: styled with font, size, colour, outline, shadow and box, placed by x/y, revealed with a typewriter or word animation. A style field you leave out takes the published default (video://catalog/text: bold white Inter at 9% of the frame height, centred, with a soft shadow); timeline.get shows the full style. spans style part of the text (words first_word to last_word, from 0: one word in yellow or bold). It is a clip, so transforms, masks, animations and transitions apply. Returns the edit result (see the server instructions).

输入参数text必填spansstylepreviewat_frametrack_id必填timeline_id必填duration_frames

caption.add

Add captions

Captions on a video track from segments (with optional word timings for highlights), from SRT/VTT text, or in_clip: segments timed in seconds of a clip's media, such as transcript word times, placed where they play. One clip per caption; returns their clip_ids. A style field you leave out takes the published default (video://catalog/text: bold white Inter at 6% of the frame height, near the bottom, with a black outline); timeline.get shows the full style. Lines wrap on their own at style max_width (a fraction of the frame width), balanced in length; \n forces a break. style max_lines caps the lines on screen at once: a longer caption shows a screenful at a time, each from its first word's time. A segment's spans style part of its text (words first_word to last_word, from 0: the timed words, or the text split at spaces), e.g. the key word in yellow. Burned in when exported. Returns the edit result (see the server instructions).

输入参数srtvttstylein_clippreviewsegmentstrack_id必填timeline_id必填offset_frames

text.set

Set text

Change a title's or caption's text, or restyle many at once (clip_ids, or every one on track_id). The style is merged; null turns an outline, shadow, box or highlight off (and max_lines back to all lines). spans (one clip) restyle part of its text. Fonts: video://catalog/fonts, or an unknown font is refused with the close matches. Returns the edit result (see the server instructions).

输入参数textspansstylepreviewclip_idstrack_idtimeline_id必填

audio.set_gain

Set gain

Volume of an audio clip (or a video clip's linked audio) in dB; keyframes ride it up and down. The preview is a waveform of the clip; with preview inline it also carries the measured loudness (preview.loudness), a link preview does not. Returns the edit result (see the server instructions).

输入参数clip_id必填gain_db必填previewtimeline_id必填

audio.set_pan

Set pan

Place a clip's sound left (-1) to right (1). Returns the edit result (see the server instructions).

输入参数pan必填clip_id必填previewtimeline_id必填

audio.fade

Fade audio

Fade a clip's sound in from its start and out to its end. null removes a fade. Returns the edit result (see the server instructions).

输入参数clip_id必填previewin_framesout_framestimeline_id必填

audio.set_master

Set master

Gain (dB) and limiter ceiling on the whole mix. The ceiling caps sample peaks (dBFS); the true peak between samples can land above it, most on dense, bright sound, and qa.check measures it (dBTP). Audio edits with preview inline carry the measured loudness (preview.loudness); a link preview does not. Returns the edit result (see the server instructions).

输入参数gain_dbpreviewlimit_dbtimeline_id必填

filter.add

Add effect

Apply an effect to a clip, every clip on a track, or the whole timeline: picture effects (colour, LUT, blur, vignette, chroma key, glitch, denoise and more) on video, sound effects (EQ, compressor, noise_reduction, voice_denoise, pitch and more) on audio. Order matters: effects run in the order added (a track's before a clip's own). Picture numbers take keyframes, except glitch, denoise and chroma_key tolerance; sound params are constants. A wrong name or param is refused with the full list, ranges, units and defaults (also at video://catalog/effects); timeline.get shows every param applied. Returns its id as clip_id. Returns the edit result (see the server instructions).

输入参数name必填paramsclip_idpreviewtimelinetrack_idtimeline_id必填

filter.set

Set effect

Change an effect's params (merged) or turn it off and on. Returns the edit result (see the server instructions).

输入参数paramsenabledpreviewfilter_id必填timeline_id必填

filter.remove

Remove effect

Take an effect off. Returns the edit result (see the server instructions).

输入参数previewfilter_id必填timeline_id必填

adjustment.add

Add adjustment clip

An empty clip on a video track whose effects (filter.add with its clip_id) change everything below it while it runs: a colour grade or blur over a stretch of the edit. Returns the edit result (see the server instructions).

输入参数previewat_frametrack_id必填timeline_id必填duration_frames必填

transition.add

Add transition

Transition at the cut after a clip, into the clip that touches it (video://catalog/transitions). Linked audio gets a crossfade at the same cut. kind crossfade is sound only: on a video clip it crossfades the linked audio and the picture cuts hard (use mode handles for that). mode overlap (default) overlaps the clips and moves later clips earlier; handles uses source past the cut and moves nothing. changed lists each transition added, with its track and kind. Returns the edit result (see the server instructions).

输入参数kind必填modeclip_id必填previewtimeline_id必填other_tracksduration_frames必填

transition.set

Set transition

Change a transition's kind or duration. Returns the edit result (see the server instructions).

输入参数kindpreviewtimeline_id必填transition_id必填duration_frames

transition.remove

Remove transition

Remove a transition; the cut becomes a hard cut. Returns the edit result (see the server instructions).

输入参数previewtimeline_id必填transition_id必填

clip.set_transform

Set transform

Position, scale, rotate, fade, flip, crop or fit a video clip over the tracks below (picture-in-picture, overlays, punch-ins). fit none shows a graphic at its own pixel size, so scale 1 is its real size; the default contain scales it to touch the frame edges. Any number takes a constant or {keyframes: [{frame, value, ease}]} with frames from the clip start; a keyframe's ease shapes the move from it to the next one (sine_in_out, cubic_out, back_out, hold and more). Overlays that must follow a zoom or pan: put the clip and its overlays in a timeline of the same shape, nest it with clip.add {nested_timeline_id} and transform the nested clip, so everything moves together. Omitted fields keep their value; null resets one. To pin an overlay to a moving subject, use media.analyze track boxes as keyframes: for each box, frame = timeline frame of the box time (where the tracked clip plays that media second) minus this clip's start, x = box x + w/2 and y = box y + h/2 (add your offset). That holds when the tracked clip fills the frame as is; if it is scaled, moved or cropped, map the box through its transform first. Skip boxes with found false. The result's placements say where the clip now shows, in sequence pixels: its picture box, the part visible after crop and mask inside the frame, and the source pixels that show there. Returns the edit result (see the server instructions).

输入参数xyfitcropflipscaleclip_id必填opacitypreviewscale_xscale_yrotation另有 1 个

clip.set_blend

Set blend mode

How a video clip mixes with the tracks below: normal, multiply, screen, overlay and more (video://catalog/blend_modes). Returns the edit result (see the server instructions).

输入参数mode必填clip_id必填previewtimeline_id必填

clip.set_mask

Set mask

Select part of a video clip, then show, hide or fill it: rectangle (rounded), ellipse, linear, mirror, heart, star, polygon or matte (a media's alpha, e.g. a create.cutout), with feather and invert. Several shapes: add. A fill paints the selection from the picture around it and from earlier frames where that area showed, so something that never moves against its background leaves a smudge: nothing ever shows what is behind it. It is a job of its own (job.list shows its progress); a render that needs it names the job until it is done, and an export waits for it. Position, size and rotation animate like transform values. Coordinates are fractions of the clip's fitted frame: a sequence-shaped box with the picture fitted inside (bars where the shapes differ), before the clip's scale and position. A narrower picture fills k = (its aspect / the sequence's) of the box width, centred, so a picture-fraction box maps to x = 0.5 + (x - 0.5) * k, width * k (a wider picture: the same on y and height, with k = the sequence aspect / its). null removes the mask. Returns the edit result (see the server instructions).

输入参数mask必填clip_id必填previewtimeline_id必填

clip.set_animation

Set animation

Entrance, exit and loop presets layered over the clip transform (video://catalog/animations): e.g. in {name: "pop", duration_frames: 12}, loop {name: "float"}; a loop runs the whole clip, or only from_frame to to_frame of it (loop {name: "shake", from_frame: 30, to_frame: 45} for a jolt). null removes one. Returns the edit result (see the server instructions).

输入参数inoutloopclip_id必填previewtimeline_id必填

edit.batch

Batch edit

Apply many edits as one change: one new timeline_id, one preview. All apply or none do. Use {"$ref":"ops[N].clip_id"} (or track_id, clip_ids[M]) to use an id an earlier op made. Returns the edit result plus results: [{tool, clip_id?, clip_ids?, track_id?}] per op.

输入参数ops必填previewtimeline_id必填

media.import

Import media

Import the user's own video, audio, image or font to edit with or place as is: probe, fingerprint, conform if needed (VFR, rotation, HDR → BT.709), 540p proxy and integrated loudness. A reference image to recreate needs no import: rebuild it with create.motion or create.still. Long-running: returns a task, or {job_id, media_id} for job.get. The media_id is usable in edits as soon as the job reports processing, so with many files, start every import first and edit while they finish. Sources: an http(s) URL (Dropbox and Google Drive share links work as they are), {upload: {name, bytes}} for a file you send yourself (the answer is the new media with upload.url: PUT the file there, curl --fail -T file '<url>', and it imports once the last byte arrives, with no base64 in a message; a broken PUT resumes as media.upload says), the upload_id of a file sent through media.upload, a small file as a data: URI (up to 8 MB, with its sha256 so a garbled copy is refused), the job_id of a completed export.video (its render becomes media), or still: one frame of a video (media_id) or of an edit (timeline_id) as a PNG still at full size, to place as a picture, cut out or reuse. A URL is fetched once, when the import starts: it only has to work until then (a short-lived signed link from the user's own storage is enough), and the copy stays here 7 days after last use. A file the user attached in the chat comes as file, when the client passes it. Importing the same file again returns the same media_id.

输入参数filenamesourceidempotency_key

media.upload

Upload media

A signed URL to send one of the user's files to this server, for files on their machine that the server can't read: PUT the file there (curl --fail -T interview.mp4 '<url>'), then media.import {source: {upload_id}}. The URL needs no other credentials and works for a day. A broken upload resumes: HEAD the url for Upload-Offset (the bytes received), then PUT the rest with Content-Range: bytes <offset>-<last>/<total>. Large files can go in parts the same way. Without a way to send it yourself, give the user the url: opened in a browser it is a page to drop the file on, which sends it and resumes on its own. media.import says whether the file is all in yet.

输入参数name必填bytes

media.list

List media

What the user has here: imported and created media, and files they sent that aren't imported yet (through media.upload, or dropped on their account page at cuttingfloor.ai/account), with names, sizes and when each expires, plus the account's storage used and its cap. When the user mentions a file they sent or dropped ("the interview I uploaded"), find it here by name and media.import {source: {upload_id}} it; complete says it is all in. Listing does not count as a use, so nothing here lasts longer for being listed.

无需输入参数。

media.delete

Delete media

Delete a media for good, so an old or wrong version stops turning up: its file here, proxy, mezzanine and media.analyze results go, and its room comes back to the storage cap. A path import leaves the original in its folder; exports made from it stay. Timelines that use it keep their ids and edits but no longer render (media_offline names it, as for expired media): replace those clips with clip.replace. Importing the same file again makes a new media_id.

输入参数media_id必填

media.analyze

Analyze media

Find what is in imported media, or in the sound of an edit, as data for edits. transcript: every word with its time (whisper.cpp on the CPU; the model downloads once). For English the word edges are then aligned to the sound (wav2vec2 forced alignment): a word starts and ends within about 0.05 s of where its letters sound, and an end on a soft consonant (s, t, k, f) or a breath can ring on up to about 0.1 s more; timing_confidence says how clearly each word was heard. Other languages keep whisper's own times, up to about a second off. Short ums and uhs are often left out of the words; kind speech still hears them. from_seconds and until_seconds transcribe just that stretch. beats: tempo, beat and downbeat times, and strengths: each beat's onset strength, 0–1 of the strongest (the hardest hits, the drop). faces: face boxes over time, e.g. to reframe to 9:16 with clip.set_transform keyframes. track: follow a region you give from a moment on, a box for each sampled time (found false where the subject was lost); to make a title, sticker, arrow or mask follow the subject, turn the boxes into clip.set_transform (or clip.set_mask) keyframes, no tracking of your own needed. look: your own typed questions about what is on screen, answered on every sampled frame (to find where something happens from plain words, media.seek). silence: stretches quieter than threshold_db for at least min_seconds. scenes: times the picture changes by more than threshold (0–100; hard cuts between ordinary shots score about 10 to 30, see threshold), with each cut's score. speech: the probability that someone is speaking, every 32 ms (Silero VAD), and the spans where it is at least your min_probability; it hears speech, not noise or music, so a cough or a door is not speech. loudness: integrated loudness (LUFS), true peak (dBTP), loudness range (LU), RMS level and noise floor (dBFS) over the whole media or from_seconds to until_seconds. To line up two recordings, media.correlate. sounds: what can b

输入参数kind必填modelstatelabelsregionregionslanguagemedia_idspeakersquestionsthresholdat_seconds另有 11 个

media.correlate

Sync offset

Find how far one recording sits from another: the sync offset of b against a, by cross-correlating their sound, with how strongly they match. Use it to line up a camera with a separate microphone, two cameras of the same moment, or a re-recorded line against the original. Each side is imported media or an edit's mix (timeline_id), over its own from_seconds to until_seconds, so you can match a short stretch of b against a longer stretch of a. offset_seconds: b's moment t lines up with a's moment t + offset_seconds, each in its own seconds. To line them up on a timeline, place b's clip so it starts offset_seconds later than a's (earlier when negative), source starts being equal. strength is the correlation of the overlapping sound at that offset, -1 to 1: near 1 the same sound, near 0 unrelated; next_best is the best offset outside the winning peak, and a strength close to it means the match is unclear (repetitive sound, or not the same moment). Offsets are searched up to max_offset_seconds either way, where at least half of the shorter sound overlaps the other. Up to 600 s read from each side. A side with no sound in its range (no audio stream, a range past its end, or digital silence) fails with no_audio, naming which side. Short reads answer at once; longer ones return a task or job.

输入参数a必填b必填idempotency_keymax_offset_seconds必填

media.get

Get media

Status, where it came from (origin: the import source, the export of which timeline_id and preset, or the create.* tool and the media it was made from), a signed download url for the file (media is kept 7 days after last use: save the file from it to keep it, and media.import it again later) and a page_url that plays or shows it in any browser (to give a person), its format (extension and mime_type, read from the file, not its name), everything the probe read (probe: the format and every stream, e.g. pix_fmt, colour space, primaries, transfer), duration, frame rate, conform reasons, integrated loudness and summaries of media.analyze results under analyses (counts only: analyses.transcript.words is how many words). While it is importing or being made, job names the job doing it and its progress. include returns those results at the top level, e.g. include ["transcript"] gives transcript.words, the list of words with times. For long media, read them in pieces: from_seconds and to_seconds keep what overlaps that stretch of the media, offset and limit page through what is left, and pages says, per analysis, the index of the first item returned in the whole list (for transcript words, the index clip.add source {words} takes), how many matched and next_offset for the next page (null at the end).

输入参数limitoffsetincludemedia_id必填to_secondsfrom_seconds

media.seek

Seek by natural language

Find the moments in a video, or in an edit as it renders, that match what you describe in plain words, so you go straight to them instead of watching it all. Name each criterion and say what a matching frame shows; you get back the stretches of time where each one holds, with the time and picture of the best frame in each. Use it to: - Check quality: find frames that are too dark or blown out, out of focus, black or blank (a gap in an edit), with a microphone or crew in shot, with text cut off at the edge, or with a caption over a face. With timeline_id it checks the edit as it renders, titles, effects and gaps included. - Watch efficiently: looking through a whole video costs you a picture for every moment. Seek judges the frames for you and says where things are, so you look only there: where the demo starts, where the speaker holds up the product, where the second location begins. - Pick shots: B-roll or a thumbnail moment that fits a description ("a wide shot of a city street at night", "she smiles straight at the camera with her eyes open"). - Find changes: with with_previous, where the slide changes, someone walks in or the camera angle switches ("`frame` shows a different slide from `previous`"). - Find room or trouble for overlays: where the lower third stays empty for a title, or where a logo, a licence plate or a face appears that needs a blur. HOW TO WRITE CRITERIA. TypeSafe Jev, a fast judgment model (preview), judges each sampled frame on its own, as a picture named `frame` (about 512 px on its long edge; with with_previous also `previous`, the frame sampled before), and gives each criterion the probability that it is true. A criterion is a statement or a question about how the picture looks. Keep one judgment to a criterion, and say what shows rather than a verdict: not "bad lighting" but "the faces are too dark to make out their eyes"; not "a good thumbnail" but "a person looks straight at the camera with eyes open and mouth closed". Criteria that na

输入参数statecriteria必填media_idat_secondstimeline_idfrom_secondsevery_secondsuntil_secondswith_previousidempotency_keymin_probability

media.listen

Find sounds by description

Find when something can be heard in a video or audio file, or in an edit as it plays, from what you describe in plain words, so you go straight to it instead of listening to it all: laughter, applause, a cough, a door slamming, a phone ringing, a dog barking, music starting, someone typing, a car passing. Name each sound and say what it is; you get back the stretches of time where each one can be heard, with the moment it is clearest. Use it to: - Find reactions and moments: where the crew or the audience laughs, where people clap or cheer, a gasp, a scream. - Find trouble to cut or cover: a cough, a sneeze, a phone going off, a door, a siren, wind on the microphone, a click or a bump. - Find sound to cut on: a clap, a bang, a hit, the music starting or stopping. HOW IT WORKS. FlexSED, an open-vocabulary sound detection model (local, on the CPU; about 15 to 20 times faster than real time), listens to every 40 ms of the sound and gives each description the probability that it can be heard there. Describe the sound itself, briefly, as you would caption it ("laughter", "a crowd cheering", "glass breaking"), not the scene or a judgment; it is asked as "The sound of <your words>". Short, common sound names work best; put each sound you want in its own entry, up to 16 a call, all listened for at once. LIMITS. Inside music it hears "music", not drums, instruments or single hits (for hits in music, media.analyze beats). A short sound can score higher over a short from_seconds to until_seconds around it. READING THE RESULT. matches gives, per sound, each run of frames at or above min_probability (default 0.5) with its start, end, peak_seconds and frame (for render.frames; media frames for video, timeline frames for an edit). peaks gives the highest probability each sound reaches, and scores every probability (step_seconds apart), for your own cut-off. A sound whose peak stays well under your cut-off is most likely not there; one hovering near it is worth a listen or a lower

输入参数sounds必填media_idtimeline_idfrom_secondsstep_secondsuntil_secondsidempotency_keymin_probability

judge.ask

Ask questions about text or pictures

Answer your questions about text and pictures you give (yes or no, a choice, a score, or where something is in a picture), as typed answers in about a second. It asks TypeSafe Jev, a fast judgment model (preview). Jev sees exactly the state: each entry under its name, and your questions refer to entries by name in backticks ("in `passage`"). An entry is text (a string, or a JSON object or array of related facts) or a picture: {media_id} for an imported image, {media_id, at_seconds} for the frame of a video at that time, {timeline_id, at_seconds} for a frame of an edit as it renders (to judge a grade or a layout you made). Mix them freely. Each call stands alone, so put everything a judgment needs into its state. Choose the type by the answer you need. noul: yes or no, answered as noul, the probability of yes from 0 to 1 (0.5 or more reads as yes). choice: one of options you name, answered as choice plus probabilities and confidence. score: a degree on levels you order, answered as score (0 is the first level) plus confidence. box: where one thing is in a picture, answered as box {x, y, w, h} in fractions of that picture plus confidence. Write each question as one thing, worded so yes means it is there. Open with what the state is ("`passage` is a transcript of someone speaking off the cuff"), and give a noul criteria {true, false} with an example of each: Jev answers most accurately from examples. To locate, name the one thing so only it fits ("the yellow headline 'Get started' at the top of `shot`") and ask a noul whether it is there; trust a box with high confidence. One call answers many questions about one state at once, so judge many items together: put the shared text in state once, and give each item its own question carrying its own marked copy. Filler words: state {passage: "So basically the way this works is"}, and per word a noul "`passage` is a transcript of someone speaking off the cuff. With one word marked: "So [[basically]] the way this works is". Is

输入参数state必填questions必填

create.motion

Create a motion graphic

Render animated HTML to a video with alpha, frame-exactly: lower thirds, animated titles, callouts, logo stings, kinetic type, generated graphics. Place the media_id with clip.add on a track above the video. Up to 60 s, and width × height × fps × seconds up to 30 s of 1080p30. Runs in the sandbox: no network (inline everything, load libraries from lib/; assets are for imported files the page must show as they are, like the user's logo or a font), fixed memory and time limits. To match a reference you were shown, rebuild it in HTML/SVG; it does not need importing. The result's warnings list what went wrong in the page: uncaught errors, console errors, files blocked or not found. Long-running: returns a task, or {job_id, media_id} for job.get. The same recipe returns the same media.

输入参数fpshtml必填namewidthassetsheighttransparentidempotency_keyduration_seconds必填

create.still

Create a still

Render an HTML page to a PNG: title and end cards, thumbnails, overlays, designed text. Transparent where nothing is painted. Capture waits for fonts, and for window.__ready if the page sets it to a promise (up to 10 s). Runs in the sandbox: no network (inline everything, load libraries from lib/; assets are for imported files the page must show as they are, like the user's logo or a font), fixed memory and time limits. To match a reference you were shown, rebuild it in HTML/SVG; it does not need importing. The result's warnings list what went wrong in the page: uncaught errors, console errors, files blocked or not found. Long-running: returns a task, or {job_id, media_id} for job.get.

输入参数html必填namewidthassetsheighttransparentidempotency_key

create.matte

Create a matte

A solid or gradient picture (PNG, any length on a timeline): backgrounds, slugs, colour washes with clip.set_blend. Gradients work like CSS: angle 180 runs top to bottom; radial reaches the corners; colours may carry alpha (#RRGGBBAA). Long-running like every create.* tool, but quick.

输入参数namecolorwidthheightgradientidempotency_key

create.voiceover

Create a voiceover

English text spoken by a natural voice (Kokoro, local; the model downloads once) as WAV media. words (default) times each word into the media transcript (media.get include transcript). Long-running: a task, or {job_id, media_id} for job.get.

输入参数nametext必填speedvoicewordsidempotency_key

create.cutout

Cut out a subject

A subject without its background, local: ProRes 4444 with alpha and the sound, or a PNG, to lay over a new background. subject any (BiRefNet) cuts out products, animals or objects; people (MODNet) is fast enough for long video. region: one item by its bounds, followed; also a clip.set_mask matte. Long-running: a task, or {job_id, media_id} for job.get.

输入参数nameregionsmoothsubjectmedia_id必填idempotency_key

create.stabilized

Steady shaky video

A steadied copy of shaky video, local (vid.stab): one pass measures the camera shake over the whole media, a second moves each frame against a smoothed camera path. New media, ProRes with the sound, to put on the timeline in place of the shaky clip (clip.replace keeps its place and timing). Long-running: a task, or {job_id, media_id} for job.get.

输入参数nameedgestripodmedia_id必填shakinesssmoothingidempotency_key

create.upscaled

Add resolution

A larger copy of low-resolution video or an image with detail drawn in, local: Real-ESRGAN (realesr-general-x4v3, on the CPU) makes each frame four times the size, then it is resized to scale. Slow: on 8 cores about 1 s a frame for 320x180, 2.5 s for 640x360. Sources up to 1280x720, results up to 3840 px on the long edge. New media (ProRes with the sound, or a PNG) to put in place of the original (clip.replace keeps its place and timing). Long-running: a task, or {job_id, media_id} for job.get.

输入参数namescaledenoisemedia_id必填idempotency_key

create.stems

Separate voice and music

The sound of a video or audio file pulled apart into stems, each new audio media for clip.add: vocals (voices, spoken or sung), drums, bass, other (everything else: guitars, keys, effects, room noise) and no_vocals (all but the voice, in one file). Laid together at the same time, the four stems make the original sound again. Use it to keep only the voice (lose the music under an interview: vocals), keep only the music (take the voice out of a clip: no_vocals), turn the music down under speech (vocals and no_vocals on their own tracks, with their own gain), or take a beat or a bass line on its own. Demucs v4 (htdemucs), local, on the CPU: about a fifth of the media's length on 8 cores (a minute of sound in about 15 s). Built for music; on speech with background noise, vocals keeps the voice and other takes most of the noise. Media up to 3 hours. Each stem is a 32-bit float WAV, 44.1 kHz stereo, as long as the original; the same media and stems give the same media again while they last. Long-running: a task, or a job_id for job.get.

输入参数namestemsmedia_id必填idempotency_key

create.lipsync

Lip-sync a video to new speech

Make a person on camera say different words: their mouth is redrawn to match the speech you give (a re-recorded line, a create.voiceover, a word taken from elsewhere in the take). Runs at the user's lip-sync provider on their own key (sync. labs), and the provider bills them for each second sent. Only for the user's own footage, or people who agreed to it (cuttingfloor.ai/acceptable-use). To replace a line or swap a word, give range, the span of the video where it is said, and audio (with audio_range) holding just the new words. The result is that span alone, re-synced and carrying the new speech, as long as the speech with sync_mode remap; place it over the original span (clip.add on a track above, or clip.replace) and mute the old words. Send only the span: it costs less and finishes sooner. Lip sync is for when the face stays on screen while the words change. When the speaker is off screen at that moment, or a cutaway (b-roll, the screen being talked about, a reaction) can cover the splice, the cutaway hides the edit without it. Takes minutes. Long-running: a task, or {job_id, media_id} for job.get. The same recipe returns the same media. Provider limits (plan length, credits, file size) come back as limit_exceeded with the provider's error_code.

输入参数nameaudio必填modelrangevideo必填providersync_modeaudio_rangeidempotency_key

render.frames

Render frames

Look at a timeline (or a media file): up to 16 frames as one contact-sheet image (layout grid) or one image each (single). Media frames are numbered at the media frame rate; a picture that can be see-through (alpha or a palette) is shown over a light checkerboard, so transparency shows as checks and a background baked into the file as itself. size full: up to 4 frames at the sequence (or media) size from the original media, for thumbnails and stills to keep. format webp (default), png or jpeg, with quality for webp and jpeg. Each image comes inline and with a signed download url.

输入参数sizeformatframes必填layoutqualitymedia_idlong_edgetimeline_id

export.video

Export video

Render the timeline to a file. Presets: web_1080p_h264 (MP4, fits 1920x1080), master_prores_422hq (MOV, sequence size), social_9x16_h264 (9:16 sequences, 1080x1920), web_1080p_av1 (MP4, AV1/Opus), gif (640 px, 15 fps), review_h264 (MP4, fits 854x854 with sound: small and quick, to watch a cut), audio_wav_48k, audio_mp3. overrides changes size, fps, bitrate or crf (video://catalog/presets). Long-running: returns a task, or {job_id} for job.get. The result links the file (a resource_link to video://jobs/{job_id}/output, which reads as the file, or its signed URL when large), has a signed download URL and a page_url that plays it in any browser (the link to give a person to watch or share), both working for 24 h (job.get gives fresh ones) . The server keeps the file 7 days: to keep it longer, save it from the url, and media.import it to use it again. qa.check measures a render (gaps, frames, loudness) before you export. sha256 and fingerprint tell two renders apart without downloading them (fingerprint matches media.get of the file once imported).

输入参数rangepreset必填filenameoverridesoverwritetimeline_id必填idempotency_key

qa.check

QA check

Measure the rendered timeline: gaps in the picture, offline media, rendered against expected frame count, integrated loudness (LUFS) and true peak (dBTP), plus black and silent stretches when you give their settings. With speech {min_probability}, every cut is listed with speech facts: the speech probability of the mix just before and after it (Silero VAD), whether it lands while someone is speaking, the seconds without speech each side, and, per clip edge, the transcript word it cuts through and how much of that word is lost (from the media's transcript, when it has one). Facts only, no verdicts. A timeline up to 20 s is checked within the call (which waits its turn for a render when the server is busy); longer ones return a task or job.

输入参数blackrangespeechsilencetimeline_id必填

job.get

Get job

Status, progress and, once completed, the result of long-running calls (media.import, media.analyze, create.*, export.video, qa.check). Same record as tasks/get. status_message says what it is doing, or where it stands in the queue; for names the media or timeline. wait_seconds (up to 50) answers when any job asked for finishes, fails or is cancelled, or when the wait runs out (then with its progress), so one call waits instead of many polls. seconds_left and starts_in_seconds come only when progress so far allows. job_ids reads many and answers {jobs, not_found}, each result in brief (result_summary: lists cut to their first items, with what was cut) unless result is full; result summary does the same for one job. A job whose progress stops for minutes ends with a stalled error, freeing its slot.

输入参数job_idresultjob_idswait_seconds

job.list

List jobs

Your recent jobs, newest first, each with its status, progress and for (the media or timeline it is for), filtered by status, tool or media_id. Results are left out unless you ask (result summary or full); job.get reads one.

输入参数toollimitresultstatusmedia_id

job.cancel

Cancel job

Stop a job, queued or running, within seconds: its engines are killed and its slot goes to the next job. Finished jobs are left as they are.

输入参数job_id必填

export.timeline

Export timeline

Write the edit for another editor: fcpxml (Final Cut Pro, DaVinci Resolve), otio (Premiere, Resolve, OpenTimelineIO apps), edl (CMX 3600, one video track), or srt/vtt (the captions). Best effort: warnings lists what the format could not carry (masks, blend modes, effects, animated transforms, ramps, text styling). timeline.get is the lossless copy. media reference (default) points at the media where this server keeps it, which another machine cannot open and which goes 7 days after last use (the result warns); media collect makes a .zip with the media files next to the timeline file, to hand the edit on. Long-running: a task, or {job_id} for job.get; the result has a signed download URL.

输入参数mediaformat必填filenameoverwritetimeline_id必填idempotency_key

skills.get

Read a skill

The whole skill as Markdown: when to use it, what it needs, numbered Steps naming the tools to call, a decision table and the rules to keep. Follow the Steps in order.

输入参数slug必填

版本历史

11
  1. v0.36.1最新Nov 7, 2026
  2. v0.34.8Nov 6, 2026
  3. v0.34.4Nov 6, 2026
  4. v0.34.0Nov 5, 2026
  5. v0.32.1Nov 5, 2026
  6. v0.31.0Nov 4, 2026
  7. v0.30.0Nov 3, 2026
  8. v0.27.6Nov 1, 2026
  9. v0.27.4Oct 30, 2026
  10. v0.27.3Oct 30, 2026
  11. v0.19.2Oct 19, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分