☰
Fusion GLView 类脚本化完全指南:预览视图的缓冲区、LUT、立体显示与视图状态控制
2026/10/4 9:12:57 网站建设 项目流程
  • 人工智能
  • AI 应用
  • 语音
  • 音频
  • 本地部署
  • 桌面应用

【免费下载链接】auto-subs

On-device subtitle generation that connects directly to DaVinci Resolve, Premiere, and After Effects.

项目地址:https://gitcode.com/gh_mirrors/au/auto-subs
点击查看免费下载

本文以 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当前不是函数所在的那个缓冲区视图
2A/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重绘。

使用注意与正确性边界

  1. 时效性:手册来自 Fusion 8 快照,可能不反映新版本行为;Resolve 侧 API 以官方README.txt(仓库快照为 resolve-api.txt)为最权威来源,冲突时优先相信经过测试的真实代码。
  2. 运行方式:脚本既可放入 Resolve 的Fusion/Scripts目录经Workspace → Scripts菜单运行(免费版与 Studio 均可用),也可用仓库scripts/run-script.sh/run-script.bat调用fuscript外部运行(仅 Studio 版)。
  3. 重绘依赖:GLViewer 的多数Set*方法需配合Redraw();GLView 的显示变换类方法在 3D 下注意坐标单位为归一化而非像素。
  4. 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.

项目地址:https://gitcode.com/gh_mirrors/au/auto-subs
点击查看免费下载

相关推荐

上一篇:Sanctuary.js 开源项目教程:JavaScript函数式编程的安全避风港
下一篇:开源项目 `poooi/poi` 使用教程

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询