- 人工智能
- AI 应用
- 语音
- 音频
- 本地部署
- 桌面应用
【免费下载链接】auto-subs
On-device subtitle generation that connects directly to DaVinci Resolve, Premiere, and After Effects.
本文以 AutoSubs 项目 Agent 工作区内的 Fusion 脚本手册类参考 glview.md 为骨架,辅以仓库中真实调用 Fusion 的 Rust 桥接与 Lua 服务源码,系统讲解 Fusion 中 GLView 类的全部成员与方法。读者将掌握如何通过 Lua / Python 脚本获取 Fusion 的预览视图(View)句柄,切换 A/B 缓冲区与四宫格视图、控制 2D/3D 显示位置旋转缩放、管理 Monitor LUT、配置立体(Stereo)显示,以及读写视图偏好配置,从而在 AutoSubs 这类直接驱动 DaVinci Resolve / Fusion 的自动化工作流中精确操纵预览界面。
背景:这份手册在 AutoSubs 项目中的定位
AutoSubs 是一款设备端字幕生成应用,通过桥接直接连接 DaVinci Resolve、Premiere 与 After Effects。在 Resolve 侧,AutoSubs 会把一个 Lua 服务安装进 Resolve 的Fusion/Scripts目录,并用fusion:Execute()驱动 Fusion 合成与 "AutoSubs Caption" 宏。为帮助开发者和 AI Agent 编写这类 Lua/Python 脚本,仓库的 Agent 技能(Skill)davinci-resolve-fusion内置了一份从官方 PDF 转换的Fusion 8 Scripting Guide & Reference Manual快照,本文讲解的GLView类即来自其中:
- 手册索引:00-index.md
- 类参考文档:classes/glview.md
- Skill 总览:SKILL.md
注意手册首页横幅的限定条件:这是 Fusion 8 时期快照,可能过时或不准确。对于 DaVinci Resolve 脚本 API,应以 resolve-api.txt 及本地安装的官方README.txt为准;对于真实可用写法,优先参考经过测试的代码(如 AutoSubs 的 Lua 服务)。
GLView 是什么:类层次与职责
GLView表示 Fusion 合成中一个基于 OpenGL 的视图窗口(View),例如"预览"页面上分割出的 Left / Right 两个子预览窗口。它继承自FuView(后者又继承自Object):
GLView(父类FuView)—— 视图窗口本身,负责缓冲区切换、显示变换、LUT、立体显示、四宫格/SubView 布局与偏好保存;FuView—— 极简基类,仅提供只读成员ID()与Refresh()重绘方法(见 fuview.md);GLViewer(父类Object)—— 2D 与 3D 查看器的父类,是真正显示图像内容的"查看器"对象,提供SetChannel、Redraw、LoadFile、SaveFile、ShowControls等(见 glviewer.md);GL3DViewer(继承GLViewer)—— 3D 查看器,额外提供CenterSelected、FitAll、FitSelected(见 gl3dviewer.md);GLImageViewer(继承GLViewer)—— 2D 图像查看器,可设置与显示 DoD、RoI、LUT。
简言之:GLView管"窗口",GLViewer管"画面"。GLView暴露的CurrentViewer成员正是两者的衔接点。
获取 GLView 实例:GetPreviewList 双语法
要操作 GLView,第一步是拿到它的句柄。手册在glview.md与 composition.md 中给出了标准取法:用Composition.GetPreviewList([include_globals])获取合成内所有可用视图的表格(浮动窗口视图则改用fusion:GetPreviewList())。随后按视图名(如"Left"、"Right")取到该视图下的View对象,即 GLView。
Python 用法:
# Reach Left GLView of Fusion instance left = comp.GetPreviewList()["Left"][View] left.SetBuffer(0)Lua 用法:
-- Reach Left GLView of Fusion instance left = comp:GetPreviewList().Left.View left:SetBuffer(0)要点:
GetPreviewList返回的是View对象表格,可继续传给影响视图的各种函数;include_globals为布尔参数,用于决定是否包含全局视图;- 注意 Python 与 Lua 的成员访问差异:Python 用
["Left"]["View"]下标与点号混合,Lua 用().Left.View链式访问;两种语言的对象模型一致(详见 02-scripting-languages.md)。
成员:CurrentViewer
GLView.CurrentViewer返回当前正在使用的查看器对象(类型为GLViewer,实际运行时多为GL3DViewer/GLImageViewer实例)。
获取方式(Python):
viewer = GLView.CurrentViewer典型配合用法来自 glviewer.md——先取 Left 视图,再取其查看器设置通道并重绘:
left = comp.GetPreviewList()["Left"][View] left_viewer = left.CurrentViewer if left_viewer != None: left_viewer.SetChannel(0) left_viewer.Redraw()需要强调:GLViewer 的多数Set*方法在调用后需要再调用Redraw()才会生效,GLView侧对显示状态的修改则常配合ResetView()或依赖后续重绘。这个"设置 → 重绘"的模式是编写视图控制脚本最常见的坑。
缓冲区控制:GetBuffer 与 SetBuffer
GLView.GetBuffer()返回当前显示的是哪个缓冲区(number);GLView.SetBuffer(buffer)用于显示三个候选视图中的特定一个。
缓冲区整数值的语义如下(手册原文经 PDF 转换有乱码,此处还原为规范含义):
| 值 | 含义 |
|---|---|
0 | 当前正在执行该函数的那个缓冲区视图(即本 GLView 所在的 Buffer 视图) |
1 | 当前不是函数所在的那个缓冲区视图 |
2 | A/B 分割视图 |
例如:若预览窗口是 Left B 视图,向它传0就会把显示切到 B。
配合SetSplit将缓冲区设为 A/B 并做 45 度居中分割(Python):
# Set the buffer to A/B with a 45 degree split at the center left = comp.GetPreviewList()["Left"][View] left.SetBuffer(2) left.SetSplit(0.5, 0.5, 45)对应 Lua:
-- Set the buffer to A/B with a 45 degree split at the center left = comp:GetPreviewList().Left.View left:SetBuffer(2) left:SetSplit(.5, .5, 45)显示变换:位置、旋转、缩放与复位
GLView 可以在 2D/3D 空间内精确控制预览画面的变换状态:
SetPos(x, y[, z])/GetPos():设置/获取显示位置,相对中心点(0, 0)。X、Y 坐标在 2D 下以像素为单位,在 3D 下以归一化(unity)为单位;Z 坐标仅在 3D 下有效,单位为归一化值。Python 中用GetPosTable()以表格形式获取。返回布尔值表示是否成功。SetRot(x, y, z)/GetRot():设置/获取显示绕 X、Y、Z 轴的旋转角度(度)。Python 中用GetRotTable()。SetScale(scale)/GetScale():设置/获取视图缩放百分比对应的数值,0表示视图的 "Fit"(适配)选项,50% = 0.5,200% = 2.0。SetSplit(x, y, angle)/GetSplit():设置/获取 A/B 分割视图的分割中心坐标(x、y)与分割线角度(angle,度)。Python 中用GetSplitTable()。ResetView():把显示重置为默认位置等状态。
"Fit 视图"示例(Python):
# Fit the Left view left = comp.GetPreviewList()["Left"][View] left.SetScale(0)Lua 等价写法:
-- Fit the Left view left = comp:GetPreviewList().Left.View left:SetScale(0)Monitor LUT 控制
GLView 提供对当前 Monitor LUT(监视器查找表)的完整控制:
| 方法 | 说明 |
|---|---|
EnableLUT(enable) | 启用/禁用当前 Monitor LUT(enable为布尔值) |
IsLUTEnabled() | 返回当前 Monitor LUT 是否启用(布尔值) |
LoadLUTFile(pathname) | 把 LUT 文件或设置(或 LUT 插件 ID)加载进 Monitor LUT;pathname为字符串,返回是否成功 |
ShowLUTEditor() | 弹出当前 Monitor LUT 的编辑器窗口 |
注意:手册中该方法标题写作GLViewEnableLUT/GLViewEnableStereo(PDF 转换时类名与方法名之间的点号丢失),实际调用应按GLView.EnableLUT(enable)、GLView.EnableStereo(enable)处理。这是阅读这份转换手册时需要留意的一类 OCR 瑕疵。
立体显示(Stereo)控制
面向立体工作流的系列方法:
EnableStereo(enable):启用/禁用 3D 立体显示;IsStereoEnabled():当前立体显示是否启用;IsStereoSwapped():左右立体眼是否被交换;SwapStereo([enable]):交换左右立体眼视图(可传布尔参数);GetStereoMethod():返回当前立体显示使用的方法与选项(字符串);SetStereoMethod(method[, option1][, option2]):设置立体显示方法,method为字符串,option1/option2为可选的附加选项;GetStereoSource():返回立体显示当前使用的源(ABsource,布尔值);SetStereoSource(ABSource, stacked[, stackmethod]):设置左右立体图像的源,ABSource、stacked为布尔值,stackmethod为字符串(堆叠方式)。
这类 API 在自动搭建立体预览环境、批量对比左右眼素材时非常实用。
布局控制:QuadView 与 SubView
GLView 支持两种特殊布局:
| 方法 | 说明 |
|---|---|
ShowQuadView(enable) | 将视图分割为四个子视图(四宫格) |
ShowingQuadView() | 返回视图当前是否被分割为四个(布尔值) |
ShowSubView(enable) | 启用内嵌的 SubView(小窗)显示 |
ShowingSubView() | 返回内嵌 SubView 当前是否显示(布尔值) |
SwapSubView() | 交换 SubView 与主视图(返回布尔值) |
工具透传、锁定与偏好设置
DisableCurrentTools()/DisableSelectedTools():透传(pass-through)当前选中的工具 / 当前选择的工具,常用于脚本化地让选定节点进入旁通状态。GetLocked()/SetLocked(enable):查询/设置显示是否被锁定(布尔值)。GetPrefs():取回该视图的偏好设置表(table)。SavePrefs()/SavePrefs(configname):把当前视图偏好保存到命名配置;LoadPrefs()/LoadPrefs(configname)则从命名配置载入。两者均有无参与带configname(字符串)两个重载版本。GetPreview([buffer]):返回指定缓冲区(number)的 Preview 对象。GetViewerList():返回可用查看器列表(table)。
SavePrefs/LoadPrefs并非孤立概念——AutoSubs 的 Resolve 桥接正是利用 Resolve 写入Fusion.prefs文件这一机制与 Fusion 侧 Lua 服务通信:Rust 桥接代码在 resolve_bridge.rs 中注释"writesFusion.prefsto disk immediately. We poll that file",前端侧 resolve-api.ts 也写明"Lua server answers by writing toFusion.prefsviaSavePrefs()"。这从一个侧面印证了:视图/合成偏好持久化(SavePrefs这类 API 写入的偏好文件)在真实 Resolve 自动化中是可观测、可轮询的状态通道。
在 AutoSubs 中的落地路径
AutoSubs 通过 Rust 侧把 Lua 服务安装进 Resolve 的Fusion/Scripts目录来驱动合成与字幕宏。相关源码可作为理解 GLView 使用场景的工程背景:
- 脚本安装逻辑:resolve_scripts.rs —— 定位
Fusion/Scripts根目录、安装/清理启动脚本库; - 桥接与偏好文件轮询:resolve_bridge.rs —— 按平台定位
Fusion/Profiles/*/Fusion.prefs(Windows%APPDATA%、macOS~/Library/Application Support、Linux~/.local/share/DaVinciResolve),读取/轮询最新修改的偏好文件; - 前端 Fusion 宏编辑器:fusion-preset-editor.tsx —— 字幕外观在 Resolve 中编辑,最终以宏的 Inspector 控件呈现。
当需要编写这类与预览/视图相关的脚本时,GLView 提供的就是"窗口侧"的完整控制面:切换 A/B 缓冲、Fit/缩放、旋转复位、LUT 开关、立体交换、四宫格与 SubView 布局、视图锁定与命名偏好配置,配合CurrentViewer取到的 GLViewer 对象再完成通道选择与Redraw重绘。
使用注意与正确性边界
- 时效性:手册来自 Fusion 8 快照,可能不反映新版本行为;Resolve 侧 API 以官方
README.txt(仓库快照为 resolve-api.txt)为最权威来源,冲突时优先相信经过测试的真实代码。 - 运行方式:脚本既可放入 Resolve 的
Fusion/Scripts目录经Workspace → Scripts菜单运行(免费版与 Studio 均可用),也可用仓库scripts/run-script.sh/run-script.bat调用fuscript外部运行(仅 Studio 版)。 - 重绘依赖:GLViewer 的多数
Set*方法需配合Redraw();GLView 的显示变换类方法在 3D 下注意坐标单位为归一化而非像素。 - OCR 瑕疵:
GLViewEnableLUT、GLViewEnableStereo等标题中的点号在转换中丢失,应按GLView.EnableLUT/GLView.EnableStereo理解。
至此,从取句柄、切缓冲、调变换,到 LUT、立体、布局与偏好持久化,GLView 类的完整脚本化能力已经闭环。
- 人工智能
- AI 应用
- 语音
- 音频
- 本地部署
- 桌面应用
【免费下载链接】auto-subs
On-device subtitle generation that connects directly to DaVinci Resolve, Premiere, and After Effects.
相关推荐
Instatic 如何实现多语言支持:站点语言配置到切换器的完整指南
Instatic 如何实现多语言支持:站点语言配置到切换器的完整指南 产品要出海,官网却只有一种语言,怎么办?Instatic 的多语言支持就是为这种场景准备的
人工智能AI 应用语音音频本地部署桌面应用AutoSubs 中的 Fusion 脚本类参考:FloatViewFrame 帧窗口激活与视图控制实战
AutoSubs 中的 Fusion 脚本类参考:FloatViewFrame 帧窗口激活与视图控制实战 本篇文章以仓库内 .agents/skills/dav
人工智能AI 应用语音音频本地部署桌面应用Magit状态缓冲区深度解析:掌握Git仓库的完整视图
Magit状态缓冲区深度解析:掌握Git仓库的完整视图 想要彻底掌握Git仓库的状态?Magit状态缓冲区就是你的终极解决方案!作为Emacs中功能最强大的Gi
开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考