视频补帧在动画、实拍和AI生成视频中都是常见需求。ComfyUI通过RIFE节点提供了轻量高效的解决方案,它可以在原始帧序列中插入中间帧,把24fps提升到48fps甚至更高。RIFE的核心不是简单叠化,而是结合运动估计与残差融合来生成新的时序信息。

RIFE节点的工作原理与模型准备
RIFE全称Real-Time Intermediate Flow Estimation,它使用IFNet网络同时估计两帧之间的光流和中间帧。与传统先算光流再做插值的方法不同,RIFE把运动估计、扭曲和融合放在同一个可训练流程中,因此推理速度快,对1080p视频也能在消费级显卡上实时运行。在ComfyUI中,RIFE节点通常来自VideoHelperSuite或ComfyUI-Frame-Interpolation扩展,节点类型常见为VFI_RIFE。
该节点接收一批图像帧作为输入,输出插值后的新序列。核心输入包括frames、multiplier、fast_mode和ensemble。模型文件需要提前放入ComfyUI的models/rife目录,常见文件名如rife49.pth、flownet.pkl。如果目录不存在,可以手动创建,或者由扩展首次运行时自动下载。模型加载失败很大概率是因为路径错误或文件不完整。
# ComfyUI目录结构示例
ComfyUI/
├── models/
│ └── rife/
│ ├── rife49.pth
│ └── flownet.pkl
└── custom_nodes/
└── ComfyUI-Frame-Interpolation/
需要注意的是,不同扩展对模型目录的识别规则可能略有差异。VideoHelperSuite的RIFE节点通常会扫描models/rife下的.pth文件,而某些分支版本还支持rife47.pth等旧模型。安装扩展后,如果节点列表中看不到VFI_RIFE,可以先确认扩展是否正确克隆到custom_nodes目录,并执行依赖安装脚本。
在ComfyUI中搭建帧插值工作流
搭建完整工作流时,至少需要三个部分:视频或图像序列加载节点、RIFE插值节点和输出保存节点。对于视频输入,可以使用VHS_LoadVideo节点将视频转为帧序列;如果已经有图片目录,可以用Load Image Sequence节点读取。RIFE节点放置在中间,最后连接VHS_SaveVideo或SaveImage。
一个常见错误是把multiplier理解成最终帧率。实际上它是插入倍率,比如原始视频30fps,multiplier=2会得到60fps;multiplier=4会得到120fps。输出帧数约等于原始帧数乘倍率再减去首尾部分。若原始素材不是固定帧率,建议先在加载节点中统一帧率,避免插值后时长大幅偏移。下面用ComfyUI API提交一个简化工作流,展示节点连接方式。
import json
import random
import urllib.request
server = "127.0.0.1:8188"
workflow = {
"1": {
"class_type": "VHS_LoadVideo",
"inputs": {
"video": "input.mp4",
"force_rate": 24,
"frame_load_cap": 0
}
},
"2": {
"class_type": "VFI_RIFE",
"inputs": {
"frames": ["1", 0],
"multiplier": 2,
"fast_mode": True,
"ensemble": False,
"model": "rife49.pth"
}
},
"3": {
"class_type": "VHS_SaveVideo",
"inputs": {
"filename_prefix": "interpolated",
"fps": 48,
"images": ["2", 0]
}
}
}
data = json.dumps({"prompt": workflow, "client_id": str(random.randint(1000, 9999))}).encode()
req = urllib.request.Request(f"http://{server}/prompt", data=data, headers={"Content-Type": "application/json"})
urllib.request.urlopen(req)
上述代码只是流程示意,实际节点ID和参数名需根据扩展版本调整。提交后可以在ComfyUI的网页端观察进度,也可以调用/history接口查询任务状态。对于大批量视频,建议将frame_load_cap设为一个较小值进行测试,确认输出效果满意后再处理全部帧。
RIFE节点关键参数与调优策略
fast_mode启用后会使用半分辨率估计光流,速度明显提升,但快速运动场景可能出现伪影。如果主要处理静态镜头或慢速运镜,可以开启;如果涉及高速奔跑、大幅度转身等画面,建议关闭并配合ensemble=True。ensemble会进行多次估计并融合,质量更稳,但显存和推理时间都会增加。
显存不足是移动显卡和低显存卡常见问题。RIFE节点对1080p视频单帧约占用1到2GB显存,批处理时如果一次加载整段视频,峰值显存可能超过8GB。可以通过降低输入分辨率、使用VHS_VideoInfo节点限制帧尺寸,或在加载节点中设置force_rate和frame_load_cap来控制。另一个技巧是分批插入中间帧,而不是一次把视频全部传给节点。
| 节点 | 速度 | 大运动表现 | 显存占用 |
|---|---|---|---|
| RIFE | 快 | 中 | 较低 |
| FILM | 中 | 强 | 较高 |
| AMT | 慢 | 强 | 高 |
从实际测试看,RIFE适合以效率优先的任务,例如草稿预览、短视频补帧和实时化处理。FILM在遮挡和大幅度运动上更干净,但速度慢很多。ComfyUI中同时安装多个插值节点后,可以用同一份素材横向对比,选择适合自己场景的模型。
常见报错与排查思路
模型加载错误通常会提示RIFE model not found或类似信息。首先检查models/rife目录下是否真的有对应文件,并且文件名与节点下拉菜单中的名称完全一致。某些扩展还会校验文件哈希,下载不完整时虽然文件存在也会报错,重新下载即可。
输出帧数不符合预期时,先确认multiplier是整数倍率而非目标帧率。若原始视频VFR变化帧率,插值后音频会不同步,可以在加载节点强制使用固定帧率,并在输出节点中设置匹配的新帧率。颜色或亮度发生轻微变化通常与模型无关,而是视频解码和编码色彩范围不一致,先在加载和保存节点中统一像素格式和色彩矩阵。
如果出现CUDA out of memory,不要直接从4倍倍率开始测试。把multiplier设为2,关闭ensemble,并缩小输入分辨率。处理完成后可以配合Upscale节点把画面放大回来。对于长时间视频,建议按片段处理,避免一次性将数百帧全部载入显存。
总的来看,RIFE节点在ComfyUI中提供了一个兼顾速度与质量的帧插值方案。只要理清模型路径、节点连接和倍率参数,就能稳定地将低帧率视频提升到高帧率。