在ComfyUI中进行视频合成时,多视频层叠加与混合模式并不是通过传统非线性编辑软件里的图层窗口完成的,而是依靠节点图把每一个视频当作图像序列来处理。每一层视频先被拆成连续帧,再以图像张量的形式进入混合节点,通过不同的运算逻辑决定像素之间如何相互作用。理解这一点,是搭建稳定合成工作流的前提。

视频层的加载与帧序列预处理
要把多个视频叠在一起,第一步是把它们分别读进ComfyUI。最常用的是VHS(Video Helper Suite)里的Load Video节点,它可以把本地 mp4 或 mov 文件转成带有 batch 维度的图像帧序列。如果你的两个视频分辨率不同,必须先用ImageScale或Resize类节点统一到同一尺寸,否则后续混合节点会直接报错或产生错位黑边。
帧率也需要对齐。假设视频 A 是 30fps、视频 B 是 24fps,直接混合会让动作出现跳动。可以在加载时用 VHS 的force_rate参数强制重采样,或者先在外部分离音频再用 ffmpeg 统一帧率。下面是一段在 ComfyUI 外部用命令行统一参数的示例,虽然不属于节点本身,但能大幅降低工作流复杂度:
# 将 input_b.mov 重采样为 30fps 且分辨率 1920x1080 ffmpeg -i input_b.mov -vf "scale=1920:1080,fps=30" b_30fps.mp4
预处理完成后,每个视频都变成形状为 [帧数, 高, 宽, 3] 的 RGB 张量。此时可以把它们分别接入不同的图像批次节点,为后续逐层混合做好准备。注意显存占用会随着层数和分辨率线性增长,建议在测试阶段先用 480p 草稿确认节点逻辑。
混合模式的节点实现与数学原理
ComfyUI 原生并没有叫“混合模式”的单一节点,但ImageBlend节点提供了 normal、multiply、screen、overlay 等基础模式。以 screen(滤色)为例,其数学定义为结果色 = 1 - (1 - 底色) * (1 - 混合色),这在节点内部通过逐通道减法与乘法实现。当你把上层视频接进 blend 的 foreground,下层接 background,选择 screen 就能得到提亮叠加效果。
如果内置模式不够用,可以用ImageMath或自定义 Python 节点写公式。比如要做“柔光(soft light)”混合,可以用如下伪代码逻辑封装成节点:
import torch
def soft_light(base, blend):
# base, blend 为 [N,H,W,3] 的 torch.Tensor,范围 0~1
low = 2 * base * blend + base * base * (1 - 2 * blend)
high = 2 * base * (1 - blend) + torch.sqrt(base) * (2 * blend - 1)
return torch.where(blend <= 0.5, low, high)
这段代码展示了混合模式本质上是像素级张量运算。在实践中,把多个ImageBlend串联,就能实现三层以上的嵌套合成。例如底层放实拍背景,中间层放动态遮罩视频,顶层放调色过的粒子动画,每一层单独选不同模式,最终画面层次会非常丰富。
合成输出与常见避坑策略
所有层混合完后,要用 VHS 的VideoCombine节点把张量序列写回视频文件。这里最容易忽略的是音频处理:如果底层视频带原声,而上层视频也有声轨,节点默认只保留被设为 output 的那一路音频。需要手动用AudioMerge或外部 ffmpeg 混音,否则成片会静音或只有单层声音。
另一个坑是帧数不一致导致的循环错位。当上层视频比下层短,未勾选 loop 时,超出部分会变成黑帧。可以在Load Video里开启 loop 并确保总帧数取两者最大值,或者用ImageBatch重复填充短层。下面给出一个简单的节点参数对照表,帮助快速排查:
| 现象 | 可能原因 | 解决节点/参数 |
|---|---|---|
| 画面黑边 | 分辨率未统一 | ImageScale 强制尺寸 |
| 动作跳动 | 帧率不一致 | force_rate 重采样 |
| 顶层消失 | 混合模式误选 multiply 且底色黑 | 改 normal 或 screen |
| 成片无声 | 音频未合并 | AudioMerge 或 ffmpeg |
只要把控好预处理、混合数学和输出三个环节,ComfyUI 完全能替代部分轻量级视频合成软件。随着节点组保存和复用习惯的养成,这类多视频层叠加工作流会越来越顺手,也能更灵活地实验各种混合模式带来的视觉风格。