AI 原生的视频编排工作台:在 Electron 中融合 LangGraph 智能体、工程级持久化 与 C++/OpenGL/Skia 实时渲染管线,让自然语言驱动时间轴、图层与素材——所见即所得,所聊即所改。
- 对话即操作:内嵌基于 LangGraph 的编排代理,理解工程上下文,将意图拆解为对图层、文案与素材的可执行变更。
- 流式认知输出:支持带推理链路的模型;流式响应按 思考 → 工具调用 → 总结 分段呈现,避免信息混叠,可读性与可调试性兼备。
- 结构化工具调用 UI:每一次
function calling以独立卡片展示(工具名、参数、执行状态与结果),人机协作过程全程可观测,而非黑盒文本。 - 动态工程上下文:会话与工程状态联动,代理可读取当前合成树、素材库等结构化信息,减少「幻觉式」编辑建议。
技术栈要点:LangChain / LangGraph、可插拔 LLM(含思考/推理模式)、N-API 桥接原生渲染与前端 UI。
用自然语言创作 GLSL Shader 特效与转场——无需手写一行 OpenGL 代码,在对话中描述意图,AI 实时生成并预览。
- 新建对话:点击首页「新建对话」,进入资源聊天室(零文件足迹,无需手动命名工程)。
- 描述意图:用中文描述想要的特效,例如 "创建一个基于 sin 函数的波浪扭曲画面特效"。
- AI 自动创作:Agent 调用
list_dir→write_file工具,生成完整的资源工程结构:warp_effect/ ├── config.json # 资源描述:名称、格式、参数声明 └── shaders/ └── pass0.frag # GLSL 片段着色器 - 自动挂载预览:
config.json写入后触发自动挂载,左栏出现资源卡片,预览区实时呈现效果。 - 参数调节:右侧参数面板根据
config.json中uniform[]声明动态生成滑块 / 开关,通过 N-API 实时调用 C++ 侧setMaterialFloatParam更新渲染。
| 区域 | 说明 |
|---|---|
| 左栏 资源列表 | 扫描沙箱目录,展示特效 / 转场资源;点击卡片切换挂载状态 |
| 中栏 实时预览 | 基于 C++ OpenGL 渲染管线,支持时间轴播放与拖动 |
| 右栏 聊天 + 参数 | LangGraph 对话历史 + 已挂载资源的 uniform 参数面板 |
| 底栏 日志 | 挂载状态、渲染耗时、工具调用实时输出 |
Agent 生成的着色器可直接使用以下内置变量,无需在 config.json 中声明:
| 变量 | 类型 | 说明 |
|---|---|---|
uTime |
float |
当前播放时间(秒) |
uProgress |
float |
段内进度 [0, 1] |
inputTexture0 |
sampler2D |
主输入纹理(特效 / 转场均有) |
inputTexture1 |
sampler2D |
转场第二输入纹理 |
- 聊天历史通过 LangGraph SqliteSaver 按
resource:<uuid>线程隔离存储,无直接 SQL 操作。 - 首页「最近对话」从 Checkpointer 实时读取,以第一条用户消息作为标题。
- 退出未对话的聊天室,系统自动删除空线程,不留历史记录。
- SQLite Checkpointer:对话与代理状态落盘至应用数据库(SqliteSaver),按 工程 / 线程 ID(thread_id) 隔离。
- 跨次打开可续聊:切换项目即加载对应会话历史;新建工程自动初始化线程,删除工程可同步清理会话图谱。
- 历史与 UI 同源:Checkpoint 中的
HumanMessage/AIMessage/ToolMessage经统一序列化层映射为聊天时间线,持久化记录与界面展示顺序一致(含思考内容与工具轨迹)。
设计目标:Never break userspace——状态可恢复、可审计,适合长周期协作与复盘。
| 维度 | 说明 |
|---|---|
| 合成一帧 | 典型负载下,多图层 OpenGL 离屏合成 约 0.4 ms/帧,为实时预览与批处理留出余量。 |
| GPU 硬件解码 | H.264 / HEVC 在 macOS 上优先走 VideoToolbox 硬解,帧数据以 CVPixelBuffer 路径上传纹理,减少 CPU 色彩转换与 memcpy 压力。 |
| GPU 文字 | Skia 与 OpenGL 共享上下文,富文本直接绘制至 FBO,与视频纹理同一合成管线。 |
| 异步预取 | 后台预渲染下一帧,顺序播放缓存命中率高,交互拖拽时首帧可接受、后续快速跟上。 |
- 多轨道时间轴:类 After Effects 的非线性编排,视频 / 文本 / 音频分层管理。
- 富文本引擎:基于 Skia skparagraph,字间距、行高、多重描边、逐 run 阴影。
- 离屏 OpenGL:FBO + 纹理混合,无需依赖可见窗口即可完成成片帧输出。
- OOP N-API:
ObjectWrap映射Root/Layer,多实例、generation 校验,杜绝野指针泄漏到 JS。 - 零拷贝倾向:渲染结果写入
ArrayBuffer直出 JS,降低冗余拷贝。
┌─────────────────────────────────────────────────────────────┐
│ Electron 前端 · 时间轴 / 预览 / 聊天 │
│ AI:流式消息 · 工具卡片 · 会话历史 │
└───────────────────────────┬─────────────────────────────────┘
│ IPC / N-API
┌───────────────────────────▼─────────────────────────────────┐
│ Agent 层(LangGraph + SqliteSaver) │
│ thread 隔离 · checkpoint 持久化 · 工具调用闭环 │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────┐
│ C++ 渲染引擎 │
│ RootNode 合成 → VideoLayer(Texture+HW 解码) + TextLayer(Skia) │
│ → FBO → 像素回传 JS │
└─────────────────────────────────────────────────────────────┘
# macOS 依赖示例
brew install cmake ffmpeg pkg-config
npm install
npm run build
npm start配置 LLM(如 OPENAI_API_KEY、方舟/兼容端点等)于项目环境变量后,即可使用内置智能助手;数据库与 checkpoint 由应用自动维护。
const { createRoot, getVideoInfo } = require('./build/Release/video_player');
const root = createRoot();
root.init();
root.load(JSON.stringify(config));
const layers = root.getLayers();
root.setCurrentTime(5000);
const pixels = root.draw();
root.cleanup();| 领域 | 实现 |
|---|---|
| AI 编排 | LangGraph、流式 messages、工具绑定与结构化回调 |
| 持久化 | SqliteSaver、thread 级 checkpoint、历史序列化 |
| Shader 创作 | GLSL 特效 / 转场 Agent、config.json 声明式资源协议、uniform 参数面板 |
| 视频解码 | FFmpeg;H.264/HEVC → VideoToolbox(macOS) |
| 合成 | OpenGL FBO、纹理混合、硬件帧直传纹理 |
| 文字 | Skia skparagraph、GPU 直绘 |
| JS 绑定 | N-API ObjectWrap、generation 安全 |
欢迎加入 QQ 交流群,群号:523219063。在 QQ 中搜索该群号即可加入,交流渲染管线、AI 编排与工程实践。
MIT

