Communitygithub.com

e1dred/filmcraft

用于剪辑或修剪视频、添加标题和图形、调色、混合音频、导出 MP4/GIF 或静态帧,以及运行 filmcraft-cli 或连接本机上 FilmCraft 应用(storytold)时使用。

filmcraft 是什么?

FilmCraft 是一个早期 Alpha 阶段的类 Premiere 视频编辑器,完全用 Rust 编写。它的核心创新在于:每个菜单项和按钮都对应一个引擎命令,CLI、MCP 服务器和应用程序的控制通道运行完全相同的命令,这使得 AI 代理能够以编程方式精确控制整个视频编辑流程。该技能支持三种工作模式:完全无头模式(通过 `filmcraft-cli` 和 JSONL 脚本)、实时应用模式(通过 `--control` 端口和 `--bridge` 桥接),以及 MCP 集成模式。用户可以利用它完成从项目管理、媒体导入、序列编辑、剪裁修剪、添加标题和图形、音频混合、关键帧动画,到最终导出 MP4/GIF 或静态帧的完整工作流。技能文档包含了详细的使用指南、常见陷阱(如时间单位是 tick 而非帧、文本溢出、波纹编辑失败等)以及验证方法,是 AI 代理与 FilmCraft 交互的权威参考。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/e1dred/agent-skills/tree/HEAD/filmcraft

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

filmcraft 是做什么的?

更新: 如果此文件夹包含一个 .installed-from 文件(在从仓库复制时写入),请在每个会话期间运行一次 git ls-remote https://gitlab.com/e1dred/agent-skills.git HEAD。取输出行中以 HEAD 结尾的哈希值;如果它与文件中的哈希值不同,请告知用户存在较新版本并提供更新选项(请参阅 https://gitlab.com/e1dred/agent-skills/-/blob/main/INSTALL.md 中的“更新”部分,该部分可合并本地编辑);未经询问切勿更新。比较哈希值前请先去除空白。如果没有文件、是克隆或符号链接、或者无网络连接(git ls-remote 输出为空或报错):则静默跳过。

来自首次无头任务的田野笔记,最后测试于 FilmCraft 0.17.1(Linux AppImage)。FilmCraft 是一个 早期 Alpha 阶段的 Rust 编写类 Premiere 视频编辑器。每个菜单项和按钮都是一个引擎 命令;CLI、 MCP 服务器和应用程序的控制通道运行相同的命令。如果 filmcraft-cli --version 更新,请在使用前重新 检查此处任何内容。

设置

  • CLI: 从 AppImage 中提取它(filmcraft.appimage --appimage-extract,将 usr/bin/filmcraft-cli 复制到稳定位置);自包含,无窗口。切勿对 AppImage 本身运行 --version。
  • 无头模式: filmcraft-cli --project p.fcproj exec <id> key=value …;脚本为 JSON 行格式并保持单个会话: filmcraft-cli --project p.fcproj run script.jsonl [--save],其中行格式为 {"id":"…","params":{…}}, 或在使用 file.newProject 后使用独立的 filmcraft-cli run。子命令:commands、describe、inspect、 import、export、render、probe。
  • 实时应用: filmcraft --control 9876(或使用 FILMCRAFT_CONTROL_PORT);监听器需要在环境中设置 FILMCRAFT_CONTROL_TOKEN(64 个十六进制字符)——没有它,监听器将保持关闭。通过以下方式桥接: filmcraft-cli mcp --bridge 127.0.0.1:9876。
  • MCP: filmcraft-cli mcp(无头模式)或 --bridge(实时模式)。

文件内容索引

读取与任务匹配的文件;每个文件列出了其所包含的章节。使用 reference/ 中的 grep -n 查找命令 ID。

reference/ 中的文件阅读目的章节
projects-and-timeline.md项目、导入媒体、序列、播放头、剃刀和修剪、标记、保存、转场、视频效果和关键帧、帧保持、项目备注项目和媒体;序列;裁剪和修剪;标记和保存;转场;视频效果和关键帧;帧保持、选择和项目备注;其他编辑工具
titles-and-graphics.md文本和形状图层、小型帧上的尺寸/适配、回读图层、垂直文本和导入的图像标题;尺寸和适配;图层属性;其他图层工具
audio-mixer.md混音器条、值、子混音、插入和发送;剪辑增益和基本声音混音器;剪辑音频
captions.md字幕轨道、添加/编辑/移动字幕、SRT 导入和导出字幕轨道和 SRT
export.md导出预设和格式、导出队列、MP4/GIF 导出、静态帧、互换格式导出、探测预设;导出;预设和导出队列;静态帧;探测
command-catalogue.md所有其他按族分类的命令 ID(剪辑、时间线、序列、修剪、图形、编辑、文件、项目、多机位、源、偏好设置、快捷键等),每个都标记为已验证(JSON 路径 旧→新)、返回了结果、已运行、或被拒绝并说明原因;使依赖于选择的命令可用的设置每个族一个章节
live-app.md通过 --bridge 驱动正在运行的应用:ui_* 工具、仅限实时应用的功能、在隐藏显示器上运行连接;实时应用的附加功能
newer-commands.md每个版本添加或更改的内容0.17.0;0.17.1
log.md带有日期的测试记录日志

CLI 要点(已验证)

filmcraft-cli commands --json                    # 716 个命令:id、标签、菜单、参数、启用状态
filmcraft-cli describe file.import               # 单个命令的参数文档
filmcraft-cli --project p.fcproj inspect         # 输出 {project:{…}, sequence:{…}} 的 JSON
filmcraft-cli import clip.mp4 --project p.fcproj
filmcraft-cli --project p.fcproj export out.mp4 --scale 0.5 --quality 70
filmcraft-cli --project p.fcproj render --seconds 2 --out frame.png
filmcraft-cli probe clip.mp4                     # 种类、时长(ticks)、视频/音频流详情
  • 一个 JSONL 脚本维护状态:file.newProject → file.import {"paths":["clip.mp4"]} → {"items":[1]} → file.newSequenceFromClip {"items":[1]} → {"clips":[6,7],"sequence":4} → … → file.saveAs {"path":"p.fcproj"}。
  • 在后续每次 CLI 调用时传递 --project:没有它,每次调用都是全新的会话。

陷阱

  • 时间是 ticks,而非帧: 序列报告 3 秒为 762,048,000,000(每秒 254,016,000,000 ticks); playhead.set 接受 seconds、frame、time 或 timecode 并 吸附到最近的帧(1.5 秒 → 第 37 帧)。
  • 默认大小的文本图层会溢出小尺寸帧。 graphics.newText 默认为 100px:在 320×180 的序列上, "Hello FilmCraft" 在 size:48 时从 x=40 绘制出 334.7px 宽,并在右边缘被截断。通过设置 size(约 32 → 223px 宽;已在渲染中检查)来适配。带 box:[w,h] 的段落文本会换行,但该框 会裁剪不适合其高度的行:box:[240,60] 在 size 40 时仅显示 "Hello"(第二行被截断), 因此请确保框的高度足以容纳每一行(每行约 1.3 × size)。
  • 波纹编辑在同步锁定轨道上失败: 当 V2 轨道上有一个标题时,timeline.trim 在 mode:"ripple" 时回复 “此编辑会破坏同步:V2 已同步锁定且中间有一个剪辑”。首先锁定/解锁其他轨道,或者在不使用波纹的情况下 进行修剪。
  • probe --image-sequence 仅接受编号的静态图像;对影片使用会报错。
  • 在无头模式下使用原始 mediaTime 的 effects.addKeyframe 不生效({added:false, mediaTime:0};0.17.0),但在 实时应用中,{clip, effect:"opacity", param:"opacity", seconds:1.5, value:40} 成功添加了一个(关键帧 5 → 6;时间 吸附到帧:624699432000)。在无头模式下,移动播放头并使用 effects.toggleAnimation,或对标题属性使用 graphics.set {…,"keyframe":true}。
  • mixer.addInsert 需要一个真实的音频效果 ID(例如从 effects.list {"kind":"Audio"} 得到的 hard_limiter),而不是 诸如 volume 之类的标签;mixer.addSend 需要来自同一运行中 mixer.addSubmix 的子混音 ref。
  • graphics.* 命令在同一会话中需要有一个标题: 先在同一脚本中运行 graphics.newText,然后 graphics.alignFrame.*、nudge*、fontSize*、leading* 才能在无头模式下工作(读取 graphics.list {clip} → layers[0])。 如果没有标题,它们会回复“无图形剪辑”。graphics.deleteLayer 仅在实时应用中接受(无回读)。
  • 选择不会在保存/重新打开后保留: 将 project.select {items:[id]} / timeline.select 放在需要它的同一脚本中 (“在项目面板中选择一个项目”、“未选择剪辑”)。
  • FCPXML 导出可能会丢弃标题: file.exportInterchange {"format":"fcpxml"} 报告图形剪辑“不受支持”, 同时仍会写入文件;在信任互换格式导出之前,请阅读该报告。
  • --demo 打开内置演示项目:它会检查并渲染(1 秒时的一帧 1920×1080),经测试导出正常 仅止于此;除非 --allow-offline 接受,否则缺失的媒体将导出为占位帧。
  • file.exportMedia 会等待其文件完成,除非 "wait":false;CLI 的 export 始终等待。

报告前验证

inspect sequence(剪辑开始/结束帧、轨道、转场、效果)、probe 检查导出文件的时长和编解码器, 并在感兴趣的时间点 render 一帧以进行查看。帧计数:3 秒 @ 25 fps = 75 帧;一次 -10 帧的波纹修剪 得到 65 帧。

相关技能