作为一名长期从事AI内容生成与自动化流程开发的从业者,我最近在ComfyUI平台上实现了一套图生视频加密输出方案。这个需求源于实际项目中需要保护敏感视频内容的场景——当我们在高性能服务器上生成视频后,希望在不暴露内容的情况下传输到本地设备进行后期处理。
这套方案需要解决三个关键问题:
经过多次尝试,最终确定的方案架构包含三个核心组件:
这个自定义节点的核心功能是将图像张量序列加密存储为ZIP文件。以下是关键实现要点:
python复制class SaveFramesAsZIP:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"images": ("IMAGE",),
"filename_prefix": ("STRING", {"default": "frames"}),
"password": ("STRING", {"default": "", "multiline": False}),
"use_aes": ("BOOLEAN", {"default": True}),
"image_format": (["PNG", "JPEG"], {"default": "JPEG"}),
"jpeg_quality": ("INT", {"default": 85, "min": 1, "max": 100}),
"zip_compression": (["DEFLATE", "LZMA"], {"default": "DEFLATE"}),
}
}
参数设计考量:
image_format:提供PNG(无损)和JPEG(有损)选项,平衡质量与体积jpeg_quality:默认85是视觉无损与压缩率的理想平衡点zip_compression:DEFLATE通用性好,LZMA压缩率更高但耗内存use_aes:优先使用AES-256加密,回退到标准ZIP加密实际加密过程采用两种模式以适应不同环境:
python复制if password and use_aes and HAS_PYZIPPER:
with pyzipper.AESZipFile(zip_path, 'w', compression=pyzipper.ZIP_DEFLATED,
encryption=pyzipper.WZ_AES) as zf:
zf.setpassword(password.encode())
# 写入帧数据...
else:
with zipfile.ZipFile(zip_path, 'w', compression=compression) as zf:
if password:
zf.setpassword(password.encode())
# 写入帧数据...
安全注意事项:
pip install pyzipper)支持动态时间戳和子目录组织:
python复制timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
zip_filename = f"{base_name}_{timestamp}.zip"
# 支持形如"projectA/frames_%date:%Y%m%d%"的命名
norm_prefix = processed_prefix.replace('\\', '/').rstrip('/')
parts = norm_prefix.split('/')
if len(parts) > 1:
subdir = os.path.join(*parts[:-1])
os.makedirs(full_dir, exist_ok=True)
解密节点需要与加密节点形成对称设计:
python复制class LoadFramesFromZIP:
@classmethod
def INPUT_TYPES(cls):
input_dir = folder_paths.get_input_directory()
files = [f for f in os.listdir(input_dir) if f.lower().endswith('.zip')]
return {
"required": {
"zip_file": (sorted(files), {"zip_upload": True}),
"password": ("STRING", {"default": "", "multiline": False}),
}
}
RETURN_TYPES = ("IMAGE", "INT", "STRING")
RETURN_NAMES = ("images", "frame_count", "source_filename")
关键特性:
解密时需处理两种加密方式:
python复制if password and HAS_PYZIPPER:
try:
zf = pyzipper.AESZipFile(zip_path, 'r')
zf.setpassword(password.encode())
except Exception as e:
raise ValueError(f"解密失败: {e}")
else:
try:
zf = zipfile.ZipFile(zip_path, 'r')
if password:
zf.setpassword(password.encode())
except Exception as e:
raise ValueError(f"ZIP打开失败: {e}")
异常处理要点:
通过ComfyUI的API功能实现批量解密处理:
python复制{
"3": {
"inputs": {
"zip_file": "56.zip",
"password": "bbq"
},
"class_type": "LoadFramesFromZIP"
},
"1": {
"inputs": {
"frames": ["3", 0],
"ckpt_name": "rife47.pth"
},
"class_type": "RIFE VFI"
}
}
自动化脚本核心逻辑:
python复制# 读取模板
with open(TEMPLATE_JSON, 'r', encoding='utf-8') as f:
template = json.load(f)
# 批量提交ZIP文件
for zip_file in zip_files:
prompt = json.loads(json.dumps(template)) # 深拷贝
prompt[load_node_id]["inputs"]["zip_file"] = zip_file
prompt[load_node_id]["inputs"]["password"] = PASSWORD
response = requests.post(COMFYUI_API_URL, json={"prompt": prompt})
if response.status_code != 200:
print(f"失败: {zip_file} - {response.text}")
性能优化技巧:
在开发过程中测试了多种加密方案:
| 方案 | 安全性 | 性能影响 | 兼容性 | 实现难度 |
|---|---|---|---|---|
| ZIP标准加密 | 低 | 小 | 高 | 易 |
| AES-256 | 高 | 中 | 中 | 中 |
| 7z加密 | 高 | 大 | 低 | 难 |
| 自定义加密 | 可调 | 大 | 低 | 难 |
最终选择ZIP+AES的平衡方案,因为:
实际部署中遇到的典型问题:
问题1:解密时报"Bad password"错误
问题2:帧顺序错乱
问题3:内存不足
通过多次测试获得的优化参数:
python复制# 最佳实践配置
{
"image_format": "JPEG", # PNG体积大3-5倍
"jpeg_quality": 90, # 90以上质量提升不明显
"zip_compression": "DEFLATE", # LZMA压缩慢2倍
"use_aes": True # 安全优先
}
实测数据对比(100帧1080p视频):
| 配置 | 处理时间 | 文件大小 | 内存峰值 |
|---|---|---|---|
| PNG+DEFLATE | 12.3s | 1.2GB | 3.4GB |
| JPEG90+DEFLATE | 4.7s | 280MB | 1.8GB |
| JPEG85+LZMA | 9.1s | 240MB | 2.1GB |
在开发过程中,我深刻体会到AI辅助编程带来的版权困境。最初尝试让AI直接生成加密节点代码时,得到的方案要么存在安全漏洞,要么根本无法运行。直到参考了开源项目的基本架构后,才能指导AI生成可用的代码。
这反映了当前AI开发的典型问题:
我的实践原则是:
这套加密方案虽然代码量不大(约400行),但凝聚了对ComfyUI架构的理解和安全编码的经验。建议开发者在类似项目中: