【免费下载链接】filmcraftAn open-source, clean-room reimplementation of Adobe Premiere Pro built in pure Rust.项目地址https://gitcode.com/gh_mirrors/fi/filmcraft点击查看免费下载本文基于 FilmCraft 仓库的贡献文档 CONTRIBUTING.md 及其指认的配套文档 docs/contributing.md、AGENTS.md 编写。读完本文你将掌握在 macOS / Linux / Windows 上搭建 FilmCraft 开发环境的完整步骤、cargo xtask ci六道质量门禁的具体含义与执行方式、项目最高优先级的 “Never crash” 工程规则以及新增命令、特效、转场、编解码器 crate、面板和素材的标准流程。一、三条绝对规则开始写代码之前CONTRIBUTING.md 开宗明义在动手之前必须先读 AGENTS.md它的规则是绝对的absolute优先级高于一切其他文档。三条核心要求是遵守 AGENTS.md 的所有规则尤其是禁止使用任何形式的 Adobe 资产每个资产必须使用开放许可证并附带 attribution 边车文件sidecar禁止引入 GPL/LGPL 代码ffmpeg 只能作为外部测试 oracle 使用绝不能被链接、打包或分发。绝不允许崩溃Never crash。崩溃会丢失用户的工作因此这条规则的优先级高于一切功能开发生产代码中禁止unwrap()、expect()、panic!、unreachable!、todo!、unimplemented!和unsafe一律返回Result并把所有输入视为敌意输入见 AGENTS.md §0。遵循 docs/contributing.md各平台的安装步骤、构建运行命令、质量门禁cargo xtask ci、提交规范以及如何新增命令、特效、转场、编解码器、面板和素材。其他延伸阅读docs/architecture.md、docs/testing.md、docs/agents.md、ROADMAP.md。所有贡献以项目许可证MIT OR Apache-2.0授权。二、环境搭建Setupdocs/contributing.md §1 给出的工具矩阵如下项目要求Ruststable ≥ 1.95edition 2024egui 0.36 要求此版本通过 rustup 安装wasm 目标rustup target add wasm32-unknown-unknown供cargo xtask wasm使用组件rustup component add rustfmt clippyffmpeg ffprobe可选仅用作测试 oracle 与测试夹具生成器缺失时相关测试自动跳过各操作系统的额外依赖系统额外要求macOSXcode Command Line Toolsffmpeg 可用brew install ffmpeg自带 libx264/libx265LinuxC 工具链以及 cpal 与 rfd 所需系统头文件ALSAlibasound2-dev、GTK 3libgtk-3-dev外加 winit 所需的 X11/Wayland 开发包ffmpeg 需由发行版构建并包含 libx264 与 libx265WindowsMSVC 构建工具。注意oracle 测试只在/opt/homebrew/bin、/usr/local/bin、/usr/bin三个路径查找 ffmpeg因此在 Windows 上大部分 oracle 测试会被跳过从源码结构看这些版本约束是有依据的根 Cargo.toml 中rust-version 1.95、edition 2024egui/eframe 固定为 0.36而 ffmpeg 仅出现在测试夹具生成路径中xtask/src/main.rs 的fixtures子命令调用各 crate 被忽略的generate_fixtures测试这与 “ffmpeg 只做 oracle” 的规则完全一致。三、构建与运行文档给出的完整命令集可直接复制使用cargo run --release -p filmcraft # 带演示工程的桌面应用 cargo run --release -p filmcraft -- --empty # 不加载演示工程 cargo run --release -p filmcraft -- --control 9876 # 附带 JSON-lines 控制服务器 cargo run --release -p filmcraft -- a.mp4 b.wav # 导入媒体或打开 .fcproj cargo run --release -p filmcraft-cli -- commands # 列出引擎命令 cargo run --release -p filmcraft-cli -- render --demo --seconds 3 --out frame.png cargo run --release -p filmcraft-cli -- mcp --demo # 无头 MCP 服务器stdio cargo xtask web --serve 8765 # 在 http://127.0.0.1:8765/ 启动 web 应用关键行为与参数细节FILMCRAFT_CONTROL_PORT9876等价于--control 9876FILMCRAFT_CPU_COMPOSITE1可关闭 GPU 合成器改用 CPU 渲染。未知选项、或非数字的控制端口无论来自--control还是FILMCRAFT_CONTROL_PORT会以错误形式写到 stderr 并以退出码 2结束而不是弹出一个窗口——这正是 “Never crash” 规则在 CLI 层的体现。开发构建下依赖以opt-level 2、workspace crate 以opt-level 1编译追求播放与编解码速度请始终使用--release。使用 craft-fonts 构建可选字体输入字体资产存放在独立的 craft-fonts 仓库中永不提交进本仓库。它只是一个可选的构建输入不是 Cargo 依赖git clone craft-fonts 仓库 ../craft-fonts CRAFT_FONTS_DIR$PWD/../craft-fonts cargo run --release -p filmcraft需要注意的陷阱与机制必须用绝对路径build.rs运行在crates/text目录下相对路径CRAFT_FONTS_DIR会从那里解析。crates/text/build.rs 读取 craft-fonts 的fonts/manifest.txt将字体嵌入为filmcraft_text::fonts::CRAFT_FONTS原生构建嵌入全部web 构建只嵌入 BIZ UDPGothic Regular 以控制 wasm 体积。日文字体成为所有 UI 字体族crates/ui-egui/src/theme.rsBIZ UDPGothic 优先和文本引擎sans 用 Gothic、serif 用 Mincho的兜底字形来源。未设置CRAFT_FONTS_DIR时CRAFT_FONTS为空应用回退到内置与系统字体指向非 craft-fonts checkout 的路径会触发构建警告设置CRAFT_FONTS_REQUIRED1release 构建同时设置两者则升级为错误。依赖这些字体 glyph 的测试在CRAFT_FONTS为空时会跳过因此改动字体相关代码时必须分别在设置与不设置CRAFT_FONTS_DIR两种情况下跑质量门禁。四、质量门禁每个提交都必须全绿docs/contributing.md §3 规定每个提交必须通过全部门禁门禁命令格式化cargo fmt --checkrustfmt.tomlmax_width 160Lintcargo clippy --workspace --all-targets -- -D warnings测试cargo test --workspace分层检查cargo xtask layers资产检查cargo xtask assetswasm 兼容cargo xtask wasm对每个 L0–L4 crate、filmcraft-ui-egui与filmcraft-web做wasm32-unknown-unknown检查以上全部cargo xtask ci其中 clippy 与 tests 以--release运行cargo xtask是 .cargo/config.toml 中定义的别名run --quiet --package xtask --。从 xtask/src/main.rs 的ci()函数可以看到门禁的真实执行顺序fmt --check→clippy --release -D warnings→test --release→layers()→assets()→wasm()任何一步失败即整体失败。各门禁的强制内容均来自 xtask 源码可逐一验证layers依据 docs/architecture.md §1 的分层模型xtask/src/main.rs 中LAYERS常量将全部 crate 划入 L0–L6做四道检查依赖只能向下或指向白名单内的同层边SAME_LAYERL0 编解码/容器 crate 只能依赖filmcraft-bitstreamL5 以下的 crate 不得依赖 egui/eframe/winit/rfd/cpal/mudaUI_ONLY列表新 crate 必须登记进LAYERS与架构文档。assets遍历 git 跟踪的所有文件凡扩展名命中ASSET_EXT图片、字体、LUT、音频、视频、PDF、工程文件等即视为资产检查.attribution边车存在且asset/title/author/source/license/added字段非空许可证不得含-nc/-nd/adobe/proprietary路径必须出现在 ATTRIBUTION.md 中路径本身不得包含 Adobe 或 Premiere同时检查没有 “孤儿” sidecar边车指向不存在的文件。wasm对所有 L0–L4 crate 以及filmcraft-ui-egui、filmcraft-web执行cargo check --target wasm32-unknown-unknown保证核心逻辑包括 UI crate能编译到 Web。改动字体代码时同样要在设置CRAFT_FONTS_DIR的情况下补跑一遍门禁。五、Never crash高于一切功能的工程规则AGENTS.md §0 将 “绝不崩溃” 列为第一规则用户会把数小时的工作交给 FilmCraft损坏的文件、错误的命令/MCP 参数、坏预设或工程文件、异常键入、磁盘写满都必须产生用户或 Agent可以处理的错误而绝不是崩溃或丢失工作。具体条款用ResultT, E失败返回 crate 的错误类型并用?传播附加上下文map_err、错误变体而不是丢弃UI 层报告错误状态栏、错误对话框后继续运行。测试之外禁止 panic 捷径不许unwrap()/expect()/panic!/unreachable!/todo!/unimplemented!改用?、ok_or(..)?、let Some(x) .. else { return Err(..) }、if let或一个真正正确的回退绝不能静默损坏工程未完成的特性返回 “unsupported” 错误。唯一例外是本地代码可证明不会失败的调用如字面量必定解析成功且需带理由的单项#[allow(clippy::expect_used)]。禁止unsafeworkspace 级unsafe_code forbid见 Cargo.toml 的[workspace.lints.rust]。唯一例外是crates/platform——它需要unsafe调用操作系统媒体 APIVideoToolbox、Media Foundation/Direct3D 11 硬件解码后续还有编码与 Linux该 crate 用unsafe_code deny FFI 模块上的#[allow(unsafe_code)]每个unsafe块带// SAFETY:注释对外提供安全的ResultAPI并以纯 Rust 解码器作为受测回退见 docs/adr/0001-platform-ffi.md。一切输入派生的数字都是敌意的媒体文件、工程/交换文件、预设、字体、CLI/MCP/控制通道参数、UI 状态都不可信。用get()代替索引热循环可提前一次性校验边界字符串只在 char 边界切片长度/偏移/计数用checked_*/saturating_*绝不除以可能为零的值帧率、timebase、采样率、尺寸不把负数或 NaN 转成整数不用可能交叉的上下界调clamp对由输入决定大小的分配设上限。限制递归与循环工程可带环嵌套序列或深度嵌套遍历时用 seen-set 或深度上限。不要级联失败锁中毒不是致命的lock().unwrap_or_else(PoisonError::into_inner)所有线程/任务导出、预览、代理、解码 worker……都在catch_unwind下运行并把失败报告为错误——死掉的 worker 会让监视器黑屏或任务永远 “运行中”。最后防线panic hookcrates/ui-egui/src/crash.rs记录每个 panicUI 主循环在catch_unwind下运行逃逸的 panic 变成错误窗口会话与未保存工程得以存活。它是安全网不能替代规则 1–6保持panic unwind。证明它每个崩溃修复都附带一个修复前必 panic 的小型合成回归测试解析器与解码器做变异 fuzz截断、位翻转、损坏尺寸并在catch_unwind下运行新命令要过敌意参数测试fuzzer 发现一律变成测试。强制手段干净的 crate 自带#![cfg_attr(not(test), deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable))]。可以在 crates/engine/src/lib.rs、crates/edit/src/lib.rs、crates/bitstream/src/lib.rs 等文件中逐一确认clippy.toml 则通过allow-unwrap-in-tests true等四项配置允许测试中大声失败——“失败的测试应该大声失败”。一个体现规则 4 的真实示例crates/engine/src/commands.rs 处理sequence.moveTab时对参数做了usize::try_from(to).unwrap_or(usize::MAX).min(len.saturating_sub(1))式的防御把越界输入安全地收敛到 “末尾” 而不是 panic。六、提交规范与并行开发提交Commits一个提交只做一件事主题以任务 id 开头M3.2: trim mode engine — …、M9.9: Matroska/WebM import。里程碑M0–M16列在 ROADMAP.md。没有任务 id 的改动用领域词docs: …、README: …、ROADMAP: …。只提交全绿状态所有门禁通过。里程碑落地时更新 ROADMAP.md 中对应行状态、完成内容、估算。AI Agent 需在提交信息末尾加上其运行环境要求的署名行。并行工作多 Agent 或多 worktreegit worktree add ../filmcraft-hevc -b hevc-work cd ../filmcraft-hevc export CARGO_TARGET_DIRtarget/agent-hevc # 独立构建目录避免锁竞争配套约定每个 crate 同一时间只有一个负责人one owner per crate。workspace 用crates/*与apps/*通配符纳入成员见 Cargo.toml因此任何一个损坏的Cargo.toml都会破坏所有人的构建——包括半成品 cratemanifest 必须时刻保持合法。测试夹具无论CARGO_TARGET_DIR如何设置一律落在repo/target/fixtures/。.mcp.json 指向target/release/filmcraft-cli使用自定义 target 目录时要改用你自己的路径。七、如何新增东西How to add…7.1 新增一个命令在 crates/engine/src/commands.rs 的build()中加入一条cmd!动作或query!只读注册项。CommandSpec结构同文件头部定义包含 id、label、菜单路径、快捷键、参数描述、enabled谓词、run闭包与journal标记。文档中的示例cmd!(sequence.addEdit, Add Edit, [Sequence], Some(CmdK), r#{time:ticks?}#, has_seq, |s, p| { let t time_p(s, p, ).unwrap_or(s.playhead()); let tg s.targeting().targeted; let n s.edit_sequence(Add Edit, |q, ctx, _| Ok(edit::razor(q, tg, t, ctx)))?; Ok(json!({cuts: n.len()})) }),仓库中该命令的实际实现crates/engine/src/commands.rs在文档骨架之上还加了一层 Premiere 行为对齐播放头下的选中片段被剪开时只剪它们无选中时则剪目标轨道——细节以源码为准。编写约束id 用area.camelCase跟随其出现的菜单命名enabled复用谓词always、has_seq、has_selection、has_in_out…或自行写一个返回Err(human reason)的谓词用time_p读时间使time、frame、seconds、timecode四种写法都可用只通过s.edit(…)或s.edit_sequence(…)变更数据保证改动可撤销且经过校验纯时间线逻辑下沉为mut Sequence上的函数放入filmcraft-editcrates/edit并在那里写单测或属性测试。在 crates/engine/src/tests.rs 加测试执行、断言、撤销、重做并覆盖被禁用disabled的情形。纯前端动作工具、缩放、面板放在 crates/ui-egui/src/menus.rs 的UI_COMMANDS并在menus::invoke中加分支。之后该命令会自动出现在菜单按menu字段、快捷键、filmcraft-cli commands输出、控制通道engine.commands与 MCPcommand_list中无需额外接线。7.2 新增视频特效在 crates/project/src/effect.rs 的build_effects()中用video(id, name, CATEGORY, params)助手定义。参数助手覆盖带滑杆范围的 float、枚举选择、bool、角度、点、颜色、曲线与调色轮。Effects 面板、Effect Controls 与 Agent 参数文档全部由此生成。在 crates/render/src/effects.rs 的render::effects::apply中加一个 match 分支。它操作的是线性光、预乘 alpha 的 f32Image像素尺寸类参数要乘以cx.px_scale使降分辨率回放与全分辨率一致未知 id 是 no-op。在 crates/render/src/tests.rs 加测试。GPU 路径通常无需改动render::plan会用 CPU 预渲染标准特效图层。若要 GPU 也支持改为在 crates/render/src/gpufx.rs 中实现FxOp参数求值在FxOp::eval、CPU 参考实现在FxOp::apply、id 加入GPU_EFFECTS再将其 pass 加入 crates/gpu/src/fx.rs、数学部分加入fx.wgsl并在 crates/gpu/src/fx_tests.rs 加 CPU/GPU 一致性parity用例。音频特效在crates/audio-dsp中实现AudioEffect并注册进其effects()注册表然后在effect.rs加audio(…)定义并在 crates/render/src/audio_fx.rs 加从工程参数到 DSP 参数的Mapping。DSP 对任意分块方式必须输出一致仓库有专门测试验证这一点。7.3 新增转场视频转场在 crates/project/src/vtransition.rs 用tr(id, name, FOLDER, badges, params)定义文件夹沿用 Premiere 26十个Video Transitions/*文件夹外加Legacy/Video Transitions。参数不可动画化。永远不要改名已发布的 id——工程文件里存的是 id。音频转场是effect.rs中EffectKind::AudioTransition的定义。在 crates/render/src/transitions 对应模块wipe、motion、dissolve、lights、grunge、special实现用Tx读参数、用paint建像素、wipe::field_wipe造型擦除自带羽化/描边/抗锯齿、cards做 3D 运动音频交叉淡入淡出曲线放transitions::audio_gains。属性测试自动覆盖全部转场如画面变化需按 docs/testing.md 重新 blessgoldens.txt。完成后即可通过sequence.applyVideoTransition {effect: id or name, params: {...}, reverse: bool}应用、sequence.setTransition编辑effects.list {folder: Video Transitions/Wipe, detail: true}会带参数列出它。7.4 新增编解码器/容器 crate规格先行只依据公开规格实现ITU-T、ISO/IEC、IETF RFC、SMPTE、已发布的容器规格。绝不复制 GPL/LGPL 代码实现格式期间连参考实现/第三方解码器源码哪怕许可证宽松也不读——只允许规格文本与 conformance 向量AGENTS.md §2在 crate README 中写明所用规格版本。建crates/name作为 L0 crate只依赖filmcraft-bitstream外加thiserror与threadsfeature 后的可选rayon加[lints] workspace true登记进[workspace.dependencies]Cargo.toml与 xtask/src/main.rs 的LAYERS必须能构建到 wasm32。以 ffmpeg 为 oracle 测试见 docs/testing.md首次使用时由 ffmpeg 生成夹具到target/fixtures/crate/ffmpeg 缺失时跳过并给出说明永不提交媒体文件。接线解码器在 crates/codecs/src/video.rs 注册VideoDecoderFactory默认列表在lib.rs容器在codecs::openers()注册Opener编码器实现export::VideoEncoder/音频编码器并在 crates/export 中加Format。写 README特性、API、测试矩阵、精度与速度数字、局限。以 crates/h264/README.md 为范本。7.5 新增面板或控件面板放在 crates/ui-egui/src/panels并在 crates/ui-egui/src/dock.rs 的PanelKind中登记。每个交互元素每帧注册一个 automation idapp.auto.add(format!(effects.item.{}, d.id), rect, d.name);id 稳定、点分层、以面板名开头如timeline.track.V1.lock、tools.Razor。需要持久化或可脚本化的 UI 状态放进 crates/ui-egui/src/state.rsserde这样控制通道的ui.inspect与ui.set才能触达。工程变更一律走session.execute(…)绝不直接改工程对象。图标在 crates/ui-egui/src/icons.rs 中用代码从零绘制AGENTS.md §1。要亲眼看结果带--control启动用控制通道驱动界面用ui.screenshot取证见 docs/agents.md §3。7.6 新增素材资产规则规则全文在 AGENTS.md §1摘要禁止任何形式的 Adobe 图标、图像、字体、LUT、预设等资产包括描摹或 “参考之作” 的拷贝只接受开放许可MIT、Apache-2.0、BSD、ISC、zlib、OFL、CC0、CC BY、CC BY-SA或贡献者以 MIT OR Apache-2.0 授权的原创作品不接受 NC/ND许可证不清就放弃该素材截图只允许出现 FilmCraft或其他开源项目且媒体是自产或开放许可的字体永不提交进本仓库已有的拉丁 UI 字体除外新字体加到 craft-fonts 并通过filmcraft_text::fonts::CRAFT_FONTS使用。每个资产文件X需提交边车X.attribution真实示例assets/fonts/Inter-Regular.ttfasset: Inter-Regular.ttf title: Inter Regular (UI typeface) author: The Inter Project Authors (Rasmus Andersson et al.) source: https://github.com/rsms/inter license: OFL-1.1 license-file: assets/fonts/OFL-Inter.txt added: 2026-09-30 by Claude (agent) for Brandon Thomas notes: Unmodified font file, embedded in the UI via include_bytes! (crates/ui-egui/src/theme.rs).自己的作品用source: original work与项目许可证MIT OR Apache-2.0。然后在 ATTRIBUTION.md 中为该文件路径加反引号加一行。cargo xtask assets会检查每个带媒体扩展名的跟踪文件边车是否存在、六个字段是否填全、许可证是否非 NC/ND/Adobe/专有、路径是否在ATTRIBUTION.md中、路径是否提及 Adobe/Premiere、有无孤儿边车。八、延伸阅读与许可架构与依赖分层docs/architecture.mdcargo xtask layers的执行依据oracle 测试、goldens 与基准docs/testing.md通过控制通道/MCP 驱动应用与 Agent 工作循环docs/agents.md、docs/control-protocol.md里程碑与任务 id 来源ROADMAP.md资产总索引ATTRIBUTION.md贡献代码以项目许可证MIT OR Apache-2.0授权见 LICENSE-MIT、LICENSE-APACHE。总结成一句话FilmCraft 的贡献流程以 “全绿提交” 为纪律——cargo xtask ci通过之前不算完成而所有设计取舍的最终裁决者是 AGENTS.md 里那些 “never 被破坏” 的规则。赞分享【免费下载链接】filmcraftAn open-source, clean-room reimplementation of Adobe Premiere Pro built in pure Rust.项目地址https://gitcode.com/gh_mirrors/fi/filmcraft点击查看免费下载相关推荐RustFS 贡献指南开发环境搭建、代码质量门禁与 Pull Request 提交规范RustFS 贡献指南开发环境搭建、代码质量门禁与 Pull Request 提交规范 RustFS 是一个开源、兼容 S3 的高性能对象存储系统其代码库横后端对象存储分布式存储Bear 贡献指南Cargo 工作区开发环境搭建、质量门禁与 Pull Request 全流程Bear 贡献指南Cargo 工作区开发环境搭建、质量门禁与 Pull Request 全流程 本文面向希望参与 Bear为 Clang 工具链生成 com开发工具CLIGeoLibre 贡献者指南实战从本地环境搭建到质量门禁的 Monorepo 开发全流程GeoLibre 贡献者指南实战从本地环境搭建到质量门禁的 Monorepo 开发全流程 本篇基于仓库根目录的 CONTRIBUTING.md https:/数据可视化数据分析桌面应用前端后端上一篇EMQX MQTT 入站桥接的 $queue 队列订阅基于 MQTT 5 Subscription Identifiers 的实现与容错机制下一篇Esprima 解析器与 ESTree 测试语料Hermes 仓库中 ECMAScript 前端解析的参考实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考