- 音视频
- 视频处理
- 图形学
- 桌面应用
【免费下载链接】Natron
Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.
导读:Natron 是一款基于节点图(node-graph)的开源视频合成软件,其 Python API 由NatronEngine模块提供。本文聚焦该模块中的Natron类——一个承载全局枚举定义的命名空间容器,系统梳理其中 13 个枚举常量的完整取值、语义与典型使用场景,并结合 Global/Enums.h 源码与 Engine/typesystem_engine.xml 绑定文件,说明这些常量如何从 C++ 底层穿越到 Python 脚本层,帮助插件开发者正确引用这些常量编写可运行的合成脚本。
一、NatronEngine.Natron:Python 脚本中的全局枚举命名空间
在 Natron 的 Python 脚本体系中,NatronEngine是始终原生加载的模块,无需import即可使用其下所有类。这一点在模块索引文档 Documentation/source/devel/PythonReference/NatronEngine/index.rst 中有明确说明:
"This module is always loaded by Natron natively, meaning access is granted to these classes in your scripts without importing anything."
NatronEngine.Natron则对应 C++ 的Natron命名空间,其文档定位为:提供被 API 部分函数用于返回状态(status)的枚举,这些状态比简单的布尔值更为复杂。换言之,当脚本调用引擎 API 并获得一个"非布尔"的返回值或需要传递枚举参数时,往往就要引用NatronEngine.Natron下的常量。
从绑定机制看,Engine/typesystem_engine.xml的第 212–228 行(typesystem_engine.xml)用 Shiboken 类型系统将Natron命名空间下的 13 个枚举逐一导出为 Python 类型:
<namespace-type name="Natron"> <enum-type name="StatusEnum"/> <enum-type name="MergingFunctionEnum"/> <enum-type name="StandardButtonEnum" flags="StandardButtons"/> <enum-type name="KeyframeTypeEnum"/> <enum-type name="PixmapEnum"/> <enum-type name="ValueChangedReasonEnum"/> <enum-type name="AnimationLevelEnum"/> <enum-type name="ImageBitDepthEnum"/> <enum-type name="ImagePremultiplicationEnum"/> <enum-type name="ViewerCompositingOperatorEnum"/> <enum-type name="ViewerColorSpaceEnum"/> <enum-type name="OrientationEnum"/> <enum-type name="PlaybackModeEnum"/> <enum-type name="DisplayChannelsEnum"/> </namespace-type>因此,脚本中完整的引用形式是NatronEngine.Natron.枚举类型名.枚举值名,例如NatronEngine.Natron.KeyframeTypeEnum.eKeyframeTypeHorizontal。以下逐一解析这些枚举。
二、对话框交互与状态枚举
1. StandardButtonEnum:标准按钮位掩码
该枚举是QtQMessageBox::StandardButton的直接拷贝(源码注释明确标注/*Copy of QMessageBox::StandardButton*/,见 Global/Enums.h),用于描述标准对话框按钮。取值以十六进制位标志(bit flag)形式定义,可进行按位或(|)组合:
| 常量 | 值 | 说明 |
|---|---|---|
eStandardButtonNoButton | 0x00000000 | 无按钮 |
eStandardButtonEscape | 0x00000200 | 已废弃(obsolete) |
eStandardButtonOk | 0x00000400 | 确定 |
eStandardButtonSave | 0x00000800 | 保存 |
eStandardButtonSaveAll | 0x00001000 | 全部保存 |
eStandardButtonOpen | 0x00002000 | 打开 |
eStandardButtonYes | 0x00004000 | 是 |
eStandardButtonYesToAll | 0x00008000 | 全部是 |
eStandardButtonNo | 0x00010000 | 否 |
eStandardButtonNoToAll | 0x00020000 | 全部否 |
eStandardButtonAbort | 0x00040000 | 中止 |
eStandardButtonRetry | 0x00080000 | 重试 |
eStandardButtonIgnore | 0x00100000 | 忽略 |
eStandardButtonClose | 0x00200000 | 关闭 |
eStandardButtonCancel | 0x00400000 | 取消 |
eStandardButtonDiscard | 0x00800000 | 丢弃 |
eStandardButtonHelp | 0x01000000 | 帮助 |
eStandardButtonApply | 0x02000000 | 应用 |
eStandardButtonReset | 0x04000000 | 重置 |
eStandardButtonRestoreDefaults | 0x08000000 | 恢复默认 |
由于flags="StandardButtons"的属性声明,该枚举在 Python 中被导出为可组合的位标志集合。引擎内部典型用法可见 Engine/OutputEffectInstance.cpp,例如多视图支持询问弹窗:
StandardButtonEnum rep = Dialogs::questionDialog( tr("Multi-view support").toStdString(), message.toStdString(), false, StandardButtons(eStandardButtonOk | eStandardButtonCancel), eStandardButtonOk); if (rep != eStandardButtonOk) { /* 用户选择取消 */ }可以看到,按钮集合通过eStandardButtonOk | eStandardButtonCancel组合,默认按钮为eStandardButtonOk,返回值与eStandardButtonOk比较以判断用户选择。
2. StatusEnum:状态返回码
StatusEnum用于 API 函数返回比布尔值更细粒度的状态。参考文档仅列出 3 个值,而当前源码 Global/Enums.h 实际定义 4 个:
| 常量 | 值 | 含义 |
|---|---|---|
eStatusOK | 0 | 成功 |
eStatusFailed | 1 | 失败 |
eStatusOutOfMemory | 2 | 内存不足(源码新增,参考文档未列出) |
eStatusReplyDefault | 14 | 默认应答(对应 OpenFX 的kOfxStatReplyDefault) |
其中eStatusReplyDefault = 14并非连续编号,而是对齐 OpenFX 协议中的回复状态码约定。在绑定文件中,该枚举同样被用于 Python 层返回值转换(见 typesystem_engine.xml)。
三、图像数据格式枚举
1. ImagePlaneDescEnum:图像平面(通道)类型
用于描述图像平面的通道构成。参考文档列出 4 个值,源码 Global/Enums.h 实际包含 5 个值:
| 常量 | 值 | 含义 |
|---|---|---|
eImageComponentNone | 0 | 无通道(空平面) |
eImageComponentAlpha | 1 | 仅 Alpha 通道 |
eImageComponentRGB | 2 | RGB 三通道 |
eImageComponentRGBA | 3 | RGBA 四通道 |
eImageComponentXY | 4 | XY 坐标平面(源码新增,用于运动矢量等数据平面) |
该枚举与引擎的平面描述基础设施ImagePlaneDesc(见 Engine/ImagePlaneDesc.cpp)配合使用,脚本中在涉及多层图像处理(例如提取特定通道平面)时可能用到。
2. ImageBitDepthEnum:图像位深
描述图像的位深(每通道比特精度)。参考文档列出 4 个值,源码 Global/Enums.h 实际包含 5 个值:
| 常量 | 值 | 含义 |
|---|---|---|
eImageBitDepthNone | 0 | 无位深定义 |
eImageBitDepthByte | 1 | 8 位整数(Byte) |
eImageBitDepthShort | 2 | 16 位整数(Short) |
eImageBitDepthHalf | 3 | 16 位半精度浮点(Half float,源码新增) |
eImageBitDepthFloat | 4 | 32 位浮点(Float) |
需要特别说明:参考文档中eImageBitDepthFloat紧随eImageBitDepthShort(编号为 3),而当前源码在二者之间插入了eImageBitDepthHalf(编号 3),导致eImageBitDepthFloat的数值变为 4。脚本中应始终使用常量名而非硬编码数字,以兼容位深枚举的演进。
3. ImagePremultiplicationEnum:图像预乘状态
描述图像 Alpha 预乘(premultiplication)状态,取值连续编号:
| 常量 | 值 | 含义 |
|---|---|---|
eImagePremultiplicationOpaque | 0 | 不透明(无 Alpha 信息) |
eImagePremultiplicationPremultiplied | 1 | 已预乘 |
eImagePremultiplicationUnPremultiplied | 2 | 未预乘(straight/un-premultiplied) |
该枚举直接对应 OpenFX 图像效果协议中的预乘状态概念,是颜色管理管线中判断合成数学是否正确的前提。
四、动画与关键帧枚举
1. KeyframeTypeEnum:关键帧插值类型
描述动画曲线(Curve)上关键帧的插值方式,是脚本编写表达式与参数动画时最高频使用的枚举之一:
| 常量 | 值 | 含义 |
|---|---|---|
eKeyframeTypeConstant | 0 | 常量保持(阶梯状,前值持续到下一关键帧) |
eKeyframeTypeLinear | 1 | 线性插值 |
eKeyframeTypeSmooth | 2 | 平滑插值(自动平滑切线) |
eKeyframeTypeCatmullRom | 3 | Catmull-Rom 插值 |
eKeyframeTypeCubic | 4 | 三次(贝塞尔)插值 |
eKeyframeTypeHorizontal | 5 | 水平切线(进入方向为水平) |
eKeyframeTypeFree | 6 | 自由切线 |
eKeyframeTypeBroken | 7 | 断裂切线(左右切线独立) |
eKeyframeTypeNone | 8 | 无插值类型 |
在仓库自带的 Python 插件中,Gui/Resources/PyPlugs/Glow.py、Gui/Resources/PyPlugs/LightWrap.py、Gui/Resources/PyPlugs/ZMask.py都通过addControlPoint以水平切线插值方式构建参数化查找表曲线,例如 Glow.py:
param.addControlPoint(0, 0, 1, 0, 0, NatronEngine.Natron.KeyframeTypeEnum.eKeyframeTypeHorizontal) param.addControlPoint(1, 1, 1, 0, 0, NatronEngine.Natron.KeyframeTypeEnum.eKeyframeTypeHorizontal)这是"引擎枚举在真实脚本中直接使用"的典型范例:addControlPoint的第 6 个参数要求传入KeyframeTypeEnum值,脚本通过NatronEngine.Natron.KeyframeTypeEnum.eKeyframeTypeHorizontal精确指定关键帧切线方向。
2. AnimationLevelEnum:动画层级状态
描述某参数在当前时刻的动画状态,取值:
| 常量 | 值 | 含义 |
|---|---|---|
eAnimationLevelNone | 0 | 无动画(参数未被动画化) |
eAnimationLevelInterpolatedValue | 1 | 当前值由插值得到(位于两个关键帧之间) |
eAnimationLevelOnKeyframe | 2 | 当前时刻恰好在关键帧上 |
脚本中可用它判断"此刻参数值是否是插值结果",例如决定是否需要重新采样或缓存。
3. ValueChangedReasonEnum:参数值变更原因
该枚举是PythononParamChanged回调的语义核心——当参数值变化触发回调时,脚本通过它获知变更来源,从而决定是否需要刷新界面或执行后续逻辑。取值及语义如下:
| 常量 | 值 | 语义 |
|---|---|---|
eValueChangedReasonUserEdited | 0 | 用户直接编辑参数触发;GUI 不刷新,但onParamChanged会被调用 |
eValueChangedReasonPluginEdited | 1 | 插件(OpenFX)内部修改触发;GUI 会刷新,但onParamChanged不被调用 |
eValueChangedReasonNatronGuiEdited | 2 | Natron GUI 自身调用setValue;onParamChanged会以"用户编辑"原因被调用,且参数 GUI 刷新 |
eValueChangedReasonNatronInternalEdited | 3 | Natron 引擎内部调用setValue;onParamChanged会以"插件编辑"原因被调用,且参数 GUI 刷新 |
eValueChangedReasonTimeChanged | 4 | 时间线跳转(seek)触发,时间改变时调用 |
eValueChangedReasonSlaveRefresh | 5 | 主参数(master)命令从属参数(slave)刷新其值 |
eValueChangedReasonRestoreDefault | 6 | 参数值被恢复为默认值 |
底层引擎大量依赖该枚举区分处理路径。例如 Engine/EffectInstance.cpp 中:
if (reason == eValueChangedReasonSlaveRefresh) { // 从属参数刷新:跳过某些与用户意图相关的逻辑 }又见 Engine/EffectInstance.cpp:eValueChangedReasonNatronGuiEdited会被映射为eValueChangedReasonUserEdited后再派发,而userEdited标志则由eValueChangedReasonNatronGuiEdited || eValueChangedReasonUserEdited判定。在 Engine/Knob.cpp 中,引擎内部的动画值变更统一使用eValueChangedReasonNatronInternalEdited触发。理解这一枚举,才能正确解读onParamChanged中reason参数的含义。
五、查看器与播放相关枚举
1. ViewerCompositingOperatorEnum:查看器合成算子
描述查看器(Viewer)中多图层/通道混合的合成操作。注意:参考文档列出的 5 个值对应的是旧版枚举,当前源码 Global/Enums.h 已扩展为 9 个值,采用 "动作模式 + 层叠模式" 交叉命名:
| 当前源码常量 | 语义 |
|---|---|
eViewerCompositingOperatorNone | 无合成操作 |
eViewerCompositingOperatorWipeUnder | 擦拭(wipe)对比模式,下层 |
eViewerCompositingOperatorWipeOver | 擦拭对比模式,上层 |
eViewerCompositingOperatorWipeMinus | 擦拭对比模式,差值 |
eViewerCompositingOperatorWipeOnionSkin | 擦拭对比模式,洋葱皮 |
eViewerCompositingOperatorStackUnder | 堆叠(stack)对比模式,下层 |
eViewerCompositingOperatorStackOver | 堆叠对比模式,上层 |
eViewerCompositingOperatorStackMinus | 堆叠对比模式,差值 |
eViewerCompositingOperatorStackOnionSkin | 堆叠对比模式,洋葱皮 |
参考文档中的eViewerCompositingOperatorOver / Minus / Under / Wipe为早期简化命名,脚本若引用这些已不在源码中的常量将无法解析,应以当前源码枚举为准。
2. ViewerColorSpaceEnum:查看器色彩空间
描述查看器显示所采用的色彩空间。参考文档列出 3 个值,源码 Global/Enums.h 实际包含 4 个值:
| 常量 | 值 | 含义 |
|---|---|---|
eViewerColorSpaceSRGB | 0 | sRGB |
eViewerColorSpaceLinear | 1 | 线性(linear) |
eViewerColorSpaceRec709 | 2 | Rec.709 |
eViewerColorSpaceBT1886 | 3 | BT.1886(源码新增,现代显示标准) |
3. PlaybackModeEnum:播放模式
描述时间线播放循环方式,取值:
| 常量 | 值 | 含义 |
|---|---|---|
ePlaybackModeLoop | 0 | 循环播放(loop) |
ePlaybackModeBounce | 1 | 乒乓播放(bounce,正向结束后反向) |
ePlaybackModeOnce | 2 | 播放一次后停止 |
4. OrientationEnum:方向枚举
取值定义明确为位标志形式:
| 常量 | 值 | 含义 |
|---|---|---|
eOrientationHorizontal | 0x1 | 水平方向 |
eOrientationVertical | 0x2 | 垂直方向 |
该枚举常用于需要表达布局/拆分方向的 API(如面板切分、滑块方向等)。
六、PixmapEnum:图标资源枚举
PixmapEnum与前文枚举不同,参考文档没有展开列出取值,而是引导读者查看源码(原文档指向外部 GitHub 链接,此处转换为仓库内路径 Global/Enums.h)。
该枚举定义了一套以NATRON_PIXMAP_为前缀的内置图标资源标识,覆盖播放控制(NATRON_PIXMAP_PLAYER_PLAY_ENABLED、NATRON_PIXMAP_PLAYER_LOOP_MODE等)、窗口管理(NATRON_PIXMAP_MAXIMIZE_WIDGET、NATRON_PIXMAP_CLOSE_PANEL等)、查看器工具栏(NATRON_PIXMAP_VIEWER_CENTER、NATRON_PIXMAP_VIEWER_AUTOCONTRAST_ENABLED等)、节点分组图标(NATRON_PIXMAP_COLOR_GROUPING、NATRON_PIXMAP_FILTER_GROUPING等)以及曲线插值图标(NATRON_PIXMAP_INTERP_LINEAR、NATRON_PIXMAP_INTERP_BREAK等)。脚本或自定义 GUI 面板中如需以编程方式引用内置图标,应通过该枚举常量而不是硬编码资源路径。
七、参考文档与当前源码的差异对照与使用建议
| 枚举 | 参考文档值数 | 当前源码值数 | 差异说明 |
|---|---|---|---|
StatusEnum | 3 | 4 | 源码新增eStatusOutOfMemory |
ImagePlaneDescEnum | 4 | 5 | 源码新增eImageComponentXY |
ImageBitDepthEnum | 4 | 5 | 源码新增eImageBitDepthHalf,且eImageBitDepthFloat编号由 3 变为 4 |
ViewerCompositingOperatorEnum | 5 | 9 | 源码改为 "Wipe/Stack × Under/Over/Minus/OnionSkin" 交叉命名 |
ViewerColorSpaceEnum | 3 | 4 | 源码新增eViewerColorSpaceBT1886 |
StandardButtonEnum/KeyframeTypeEnum/AnimationLevelEnum/OrientationEnum/ImagePremultiplicationEnum/PlaybackModeEnum | — | 一致 | 取值与语义完全吻合 |
据此给出脚本编写建议:
- 始终使用常量名而非数字字面量。位深、合成算子等枚举的取值随版本演进发生变化,硬编码数字会随 Natron 升级静默失效;
- 以源码 Global/Enums.h 为最终权威。参考文档反映的是较早 API 快照,若脚本引用了文档中已不存在的旧常量(如
eViewerCompositingOperatorOver),运行时将报属性错误; - 借助
NatronEngine.Natron命名空间实现 IDE 补全与编译期检查。由于枚举经 Shiboken 显式导出(typesystem_engine.xml),脚本工具可以自动补全全部合法常量名,降低拼写错误风险。
八、实战:在 PyPlug 脚本中正确使用枚举
仓库自带 Python 插件(PyPlug)是学习枚举用法的现成教材。以 ZMask.py 为例,构建查找表曲线时:
param.addControlPoint(0, 0, 1, 0, 0, NatronEngine.Natron.KeyframeTypeEnum.eKeyframeTypeHorizontal) param.addControlPoint(1, 1, 1, 0, 0, NatronEngine.Natron.KeyframeTypeEnum.eKeyframeTypeHorizontal)而在需要感知参数变更来源的场景(例如仅在用户手动调整时才触发重计算),可读取onParamChanged回调的reason参数并与ValueChangedReasonEnum比较:
def onParamChanged(self, param, reason): # reason 即 ValueChangedReasonEnum 值 if reason == NatronEngine.Natron.ValueChangedReasonEnum.eValueChangedReasonUserEdited: # 用户编辑:执行需要刷新界面的逻辑 elif reason == NatronEngine.Natron.ValueChangedReasonEnum.eValueChangedReasonTimeChanged: # 时间线跳转:通常只需更新取值,避免重复触发 pass总结:NatronEngine.Natron是 Natron Python API 的"常量总闸",对话框按钮、图像格式、动画插值、参数变更语义与查看器显示行为等关键信息都以枚举形式暴露给脚本。掌握这些枚举的定义与演进差异,是编写健壮、可长期维护的 Natron 合成脚本与插件的基础;当文档与源码出现分歧时,务必以 Global/Enums.h 中当前实现为准。
- 音视频
- 视频处理
- 图形学
- 桌面应用
【免费下载链接】Natron
Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.
相关推荐
VCMI 战场障碍类型 ObstacleType 完全指南:从 Lua 枚举到引擎底层实现
VCMI 战场障碍类型 ObstacleType 完全指南:从 Lua 枚举到引擎底层实现 VCMI 的 Lua 脚本接口( luascript )为 modd
游戏开发python-docx 表格方向控制:WD_TABLE_DIRECTION 枚举的使用与底层实现解析
python docx 表格方向控制:WD_TABLE_DIRECTION 枚举的使用与底层实现解析 WD_TABLE_DIRECTION 是 python d
后端FanControl 完整风扇控制教程:10 分钟接管全部风扇,安静与低温兼得
FanControl 完整风扇控制教程:10 分钟接管全部风扇,安静与低温兼得 白天机箱风扇嗡嗡低转,一开游戏立刻拉满,而温度其实只升了两度——这不是硬件不行,
桌面应用智能硬件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考