{"full_name":"kajisho5/ffmpeg-skill","owner":"kajisho5","name":"ffmpeg-skill","url":"https://github.com/kajisho5/ffmpeg-skill","description":"Local video editor for coding agents: 42 FFmpeg tools with a machine-readable contract and an MCP server, for Claude Code, Cursor and Codex. Cut, captions, reframe, loudness, platform exports. No cloud, no API keys.","homepage":"https://www.npmjs.com/package/ffmpeg-skill","topics":[],"language":"Python","license":"MIT","avatar":"https://avatars.githubusercontent.com/u/20648875?u=84f861929de1c0a2393c783cda80041ca725f657&v=4","created_at":"2026-09-03T14:33:38Z","pushed_at":"2026-11-10T06:41:48Z","metrics":{"stars":4898,"forks":401,"watchers":7,"issues":84,"prs":348,"releases":160,"issues_open":null,"issues_closed":null,"prs_open":null,"prs_closed":null,"prs_merged":null,"discussions":1},"growth":{"day":{"stars":42,"forks":5,"base_day":"2026-11-09"}},"history":{"dates":["2026-11-09","2026-11-10"],"stars":[4856,4898],"forks":[396,401],"watchers":[7,7],"issues_open":[null,null],"prs_open":[null,null]},"boards":{"new":141},"same_owner":[],"issues":[{"number":143,"title":"Real-hands verification: Windows, Cursor and Codex installs on machines that are not the maintainer's, plus three editor reviews","comments":3,"created_at":"2026-09-11T03:43:28Z"},{"number":425,"title":"[from Velisa] Typed keyframes on overlay","comments":1,"created_at":"2026-11-05T20:07:04Z"},{"number":424,"title":"[from Velisa] Growing files and LTC","comments":1,"created_at":"2026-11-05T20:07:04Z"},{"number":420,"title":"[from Velisa] Multitrack audio","comments":1,"created_at":"2026-11-05T20:07:01Z"},{"number":357,"title":"render.py: encode a template render in one pass (roughly 2x faster, one generation)","comments":1,"created_at":"2026-10-24T20:44:39Z"},{"number":429,"title":"batch/render follow-ups deferred from the #428 review","comments":0,"created_at":"2026-11-06T03:31:55Z"},{"number":406,"title":"Create a codex plugin for it!","comments":0,"created_at":"2026-11-05T12:36:58Z"},{"number":404,"title":"Audit C: files in the wrong format are misread or refused with a misleading message","comments":0,"created_at":"2026-11-05T12:29:03Z"}],"discussions":[{"number":398,"title":"Companion for agent edits: checked caption sidecars and explicit audio selection","comments":0,"category":"Show and tell","created_at":"2026-11-05T01:16:26Z"}],"latest_release":{"name":"v3.2.3","tag":"v3.2.3","published_at":"2026-11-07T13:24:11Z","body":"\n_Automated release: version and notes generated from pull requests merged since 3.2.2._\n\n### Added\n\n- **An alpha-preserving path for grading and compositing.** `color.py --correct/--lut --keep-alpha` grades an alpha clip and keeps its alpha (split off before the grade, merged back unchanged, compared with the source's frame by frame); `graphics.py --keep-alpha` and `overlay.py --keep-alpha` draw on the input's alpha and write the element with it; `background.py --transparent` writes a fully transparent canvas to draw one element on. The line is ProRes 4444 by default (`--alpha-codec qtrle|png|vp9`), `--alpha-mode straight|premultiplied` says how the colour is stored, and the source's colour tags are kept as `--codec prores` keeps them. Every such run reads the alpha back as an `alpha` verification step (`alpha_codec`, `alpha_mode` in the result). Without the new flags the tools write what they wrote before.\n- **`check.py --levels bt709|ebu-r103`** measures the broadcast signal range: a `legal levels` row\n  with the share of luma and of chroma samples outside the standard's legal range, counted exactly\n  in every frame (lutyuv mask + signalstats), the worst frame and min/max Y/U/V; FAIL when one frame\n  has more than `--levels-tolerance` (1 %) out. The JSON `levels` document repeats it per clip and per\n  `--levels-window` seconds (10), with signalstats' BRNG beside it. Limits follow the bit depth\n  (bt709: 16-235 / 16-240 at 8 bits; ebu-r103: luma -1 %..103 %, 14-241). Without the flag the rows\n  and the document are unchanged.\n- **`color.py --legalize bt709|ebu-r103`** (with `--to-sdr`, `--lut` or `--correct`; `--correct`\n  alone clamps only) clamps luma and chroma into the same limits as the last filter, after the 8-bit\n  4:2:0 conversion, and measures the written file (`legalize`, verification step `legal_levels`,\n  `legalize_residual` warning when the encode left samples out of range). It writes the H.264 line, so\n  `--keep-alpha` and a `--codec` other than h264 are refused with it; `--drop-alpha` combines.\n- **`cut.py --smart`**: a keyframe-aware, frame-exact cut for H.264. Only the frames from each cut\n  point to the next keyframe (and from the last keyframe to the end point) are re-encoded, with\n  libx264 matched to the source's profile, level, pixel format, reorder depth, size, SAR and colour\n  tags. The whole GOPs between are the source's packets, joined through MPEG-TS parts (in-band\n  parameter sets) and kept on the source's time base.\n  - The result is checked before it is moved into place: the frame count and frame grid, the copied\n    packets against the source's, framemd5 of the re-encoded parts and of the first 300 frames\n    of each copied part, and the stream parameters (`smart.checks`, `smart_*` steps, `mode: smart`).\n  - A source it cannot match, or a failed check, falls back to the full re-encode. The result then\n    says why (`smart.reason`, `reason_code`, `reencode_reason` `smart_fallback`).\n  - Without `--smart`, every cut is unchanged.\n- **`probe.py --keyframes-near T[,T...]`** (`--keyframe-window`, 5 s): the keyframes around each\n  time, with the nearest before and after (`keyframes`).\n\n### Changed\n\n- **An output that loses a used alpha is no longer `verified`.** `color.py` (`--correct`, `--lut`, `--to-sdr`), `graphics.py` and `overlay.py` on a source whose alpha is used (ProRes 4444, QuickTime Animation, PNG, VP9 with alpha; a frame below opaque) wrote opaque H.264 and reported `verified: true`. The run still completes and writes the same file, but a failing `alpha` step (`reason: alpha_dropped`), `alpha_dropped: true` and an `alpha_dropped` warning now say the alpha was lost; `--drop-alpha` records that an opaque output is wanted. An opaque source runs and reports as before.\n- **`doctor` reads `ffmpeg -decoders`.** The capability names gain `decoder:<name>`, and the alpha tools' optional capabilities (`decoder:libvpx-vp9`, `encoder:qtrle`, `encoder:png`, `encoder:libopus`, ...) are resolved like eve"},"readme":true,"readme_zh":false,"news":[{"title":"panera on X: \"5. ffmpeg-skill, by kajisho5: 42 local FFmpeg tools and an MCP server for agents. MIT, v2.24.0 (Oct 31). Needs FFmpeg, no API key. Prompt (not run): trim the ...","url":"https://x.com/panera4/status/2116494169682444483","source":"x","lang":"en","date":"2026-10-31"},{"title":"I checked my local version of ffmpeg-skill after noticing it had grown to 42 tools","url":"https://note.com/micnote/n/n858b495fe378?hl=en","source":"note","lang":"en","date":"2026-10-31"},{"title":"Can I use it on my Intel Mac? Things I checked before installing AI video tools","url":"https://note.com/project100ai/n/ncf76d9e8bacb?hl=en","source":"note","lang":"en","date":"2026-10-27"},{"title":"ffmpeg-skill路线图前瞻：2.0稳定性承诺与本地AI视频制作生态的下一步","url":"https://blog.csdn.net/gitblog_00936/article/details/167482743","source":"blog.csdn","lang":"zh","date":"2026-10-10"},{"title":"GitHub Trending Today #48: reverify, keslr connect, anti-slop, boardui, ffmpeg-skill, chippytea","url":"https://www.ivoox.com/en/github-trending-today-48-reverify-keslr-connect-anti-slop-audios-mp3_rf_180094645_1.html","source":"ivoox","lang":"en","date":"2026-06-08"}],"stale":false,"snapshot_at":"2026-11-10T09:35:25Z","history_start":"2026-09-06"}