Style Transfer Vid2Vid - GPT Image 2 + Seedance 2.0
Create up to 4 style transfer video to video generations using state of the art models. This workflow creates a depth map from your input video to guide the Seedance 2.0 generation. The first frame of the video is extracted and used as reference with your style prompts using GPT-Image-2.
简介
This depth-aware, reference-guided video-to-video workflow applies consistent style transfer to your footage while preserving motion and scene geometry. It starts by ingesting your clip with LoadVideo, then computes a per-frame depth map to anchor structure and camera movement (handled by the custom processing node c3b10638-32f0-4101-9b21-21fcda8712d8). The very first frame is extracted and saved (via SaveImage and helper utilities like 8dbec705-cae4-4197-9594-85b48cc18483), then passed to OpenAIGPTImageNodeV2 together with your text prompt from PrimitiveStringMultiline.
GPT-Image-2 generates a style-matched reference image from that initial frame, which the workflow uses to steer the overall look.
The core stylization is driven by Seedance 2.0 through ByteDance2ReferenceNode, which fuses three signals: the depth map (structure), the first-frame style reference (appearance), and your prompt (semantic guidance). You can queue up to four style variations in one run using the batch fan-out/collector nodes (a3edb32a-4533-45e3-8eb2-84399225da2e), then reassemble the generated frames into final videos with CreateVideo and SaveVideo. The result is a set of stable, on-style clips that maintain the original timing and motion while reflecting your chosen aesthetic.
你需要提供
- 正在读取工作流
在 ComfyUI 中运行。 此工作流无法在本页面运行。你可以在 Comfy Cloud 中打开(已预先加载所需内容),或下载后在自己的 ComfyUI 中使用。
在 Cloud 中试用查看工作流内部
节点图的只读预览。在 Comfy Cloud 中打开或下载后即可编辑节点。
Loading the graph
Open full-size workflow preview- 作者
- Rob
需要自定义节点
- 正在读取工作流
通过代码使用此工作流
尽可能根据工作流图和输入自动生成代码,否则显示已保存的示例。运行代码可能产生费用,请先核对凭据和端点。
What you need
- Runs on
- Comfy Cloud
- 密钥
- COMFY_API_KEY
需要付费的 Cloud 方案和额度。
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"5001": {
"class_type": "LoadVideo",
"inputs": {
"file": "4d3c0f63a57ce34ca0b50ac4800b8000c60773c7c135779fb153ff7b3e54980d.mp4"
},
"_meta": {
"title": "Load Video"
}
},
"5312": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 24,
"images": [
"5337:5326",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"5313": {
"class_type": "SaveVideo",
"inputs": {
"codec": "auto",
"filename_prefix": "2x2_stack_final",
"format": "auto",
"format.codec": "auto",
"video": [
"5312",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"5340": {
"class_type": "ByteDance2ReferenceNode",
"inputs": {
"model": "Seedance 2.0",
"model.auto_downscale": False,
"model.auto_upscale": False,
"model.duration": 6,
"model.generate_audio": True,
"model.prompt": [
"5391:5394",
0
],
"model.ratio": "adaptive",
"model.reference_images.image_1": [
"5346",
0
],
"model.reference_videos.video_1": [
"5405:5359",
0
],
"model.resolution": "480p",
"seed": 111,
"watermark": False
},
"_meta": {
"title": "ByteDance Seedance 2.5 Reference to Video (Legacy)"
}
},
"5341": {
"class_type": "SaveVideo",
"inputs": {
"codec": "auto",
"filename_prefix": "2x2_stack_1_video",
"format": "auto",
"format.codec": "auto",
"video": [
"5340",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"5346": {
"class_type": "OpenAIGPTImageNodeV2",
"inputs": {
"model": "gpt-image-2",
"model.background": "auto",
"model.custom_height": 1024,
"model.custom_width": 1024,
"model.images.image_1": [
"5405:5406",
0
],
"model.quality": "medium",
"model.size": "auto",
"n": 1,
"prompt": [
"5391:5384",
0
],
"seed": 111
},
"_meta": {
"title": "OpenAI GPT Image 2.5"
}
},
"5347": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "2x2_stack_2_image",
"images": [
"5362",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"5349": {
"class_type": "ByteDance2ReferenceNode",
"inputs": {
"model": "Seedance 2.0",
"model.auto_downscale": False,
"model.auto_upscale": False,
"model.duration": 6,
"model.generate_audio": True,
"model.prompt": [
"5391:5395",
0
],
"model.ratio": "adaptive",
"model.reference_images.image_1": [
"5362",
0
],
"model.reference_videos.video_1": [
"5405:5359",
0
],
"model.resolution": "480p",
"seed": 22,
"watermark": False
},
"_meta": {
"title": "ByteDance Seedance 2.5 Reference to Video (Legacy)"
}
},
"5350": {
"class_type": "SaveVideo",
"inputs": {
"codec": "auto",
"filename_prefix": "2x2_stack_2_video",
"format": "auto",
"format.codec": "auto",
"video": [
"5349",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"5351": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "2x2_stack_3_image",
"images": [
"5363",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"5353": {
"class_type": "ByteDance2ReferenceNode",
"inputs": {
"model": "Seedance 2.0",
"model.auto_downscale": False,
"model.auto_upscale": False,
"model.duration": 6,
"model.generate_audio": True,
"model.prompt": [
"5391:5396",
0
],
"model.ratio": "adaptive",
"model.reference_images.image_1": [
"5363",
0
],
"model.reference_videos.video_1": [
"5405:5359",
0
],
"model.resolution": "480p",
"seed": 333,
"watermark": False
},
"_meta": {
"title": "ByteDance Seedance 2.5 Reference to Video (Legacy)"
}
},
"5354": {
"class_type": "SaveVideo",
"inputs": {
"codec": "auto",
"filename_prefix": "2x2_stack_3_video",
"format": "auto",
"format.codec": "auto",
"video": [
"5353",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"5355": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "2x2_stack_4_image",
"images": [
"5364",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"5357": {
"class_type": "ByteDance2ReferenceNode",
"inputs": {
"model": "Seedance 2.0",
"model.auto_downscale": False,
"model.auto_upscale": False,
"model.duration": 6,
"model.generate_audio": True,
"model.prompt": [
"5391:5397",
0
],
"model.ratio": "adaptive",
"model.reference_images.image_1": [
"5364",
0
],
"model.reference_videos.video_1": [
"5405:5359",
0
],
"model.resolution": "480p",
"seed": 4,
"watermark": False
},
"_meta": {
"title": "ByteDance Seedance 2.5 Reference to Video (Legacy)"
}
},
"5358": {
"class_type": "SaveVideo",
"inputs": {
"codec": "auto",
"filename_prefix": "2x2_stack_4_video",
"format": "auto",
"format.codec": "auto",
"video": [
"5357",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"5360": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "2x2_stack_1_image",
"images": [
"5346",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"5362": {
"class_type": "OpenAIGPTImageNodeV2",
"inputs": {
"model": "gpt-image-2",
"model.background": "auto",
"model.custom_height": 1024,
"model.custom_width": 1024,
"model.images.image_1": [
"5405:5406",
0
],
"model.quality": "medium",
"model.size": "auto",
"n": 1,
"prompt": [
"5391:5386",
0
],
"seed": 222
},
"_meta": {
"title": "OpenAI GPT Image 2.5"
}
},
"5363": {
"class_type": "OpenAIGPTImageNodeV2",
"inputs": {
"model": "gpt-image-2",
"model.background": "auto",
"model.custom_height": 1024,
"model.custom_width": 1024,
"model.images.image_1": [
"5405:5406",
0
],
"model.quality": "medium",
"model.size": "auto",
"n": 1,
"prompt": [
"5391:5388",
0
],
"seed": 333
},
"_meta": {
"title": "OpenAI GPT Image 2.5"
}
},
"5364": {
"class_type": "OpenAIGPTImageNodeV2",
"inputs": {
"model": "gpt-image-2",
"model.background": "auto",
"model.custom_height": 1024,
"model.custom_width": 1024,
"model.images.image_1": [
"5405:5406",
0
],
"model.quality": "medium",
"model.size": "auto",
"n": 1,
"prompt": [
"5391:5390",
0
],
"seed": 444
},
"_meta": {
"title": "OpenAI GPT Image 2.5"
}
},
"5401": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": "apply a post-apocalyptic orange and teal desert grade"
},
"_meta": {
"title": "Prompt - Style 1"
}
},
"5402": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": "apply a surreal dreamlike bloom grade with glowing highlights, soft halation around light sources, lifted blacks, and a hazy ethereal pastel wash across the midtones"
},
"_meta": {
"title": "Prompt - Style 2"
}
},
"5403": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": "apply a olive and amber grade with deep shadows"
},
"_meta": {
"title": "Prompt - Style 3"
}
},
"5404": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": "apply a symmetrical pastel grade with mustard yellows and dusty pinks"
},
"_meta": {
"title": "Prompt - Style 4"
}
},
"5337:5326": {
"class_type": "ImageStitch",
"inputs": {
"direction": "down",
"image1": [
"5337:5327",
0
],
"image2": [
"5337:5334",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"5337:5327": {
"class_type": "ImageStitch",
"inputs": {
"direction": "right",
"image1": [
"5337:5330",
0
],
"image2": [
"5337:5328",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"5337:5328": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5349",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5337:5330": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5340",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5337:5332": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5353",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5337:5334": {
"class_type": "ImageStitch",
"inputs": {
"direction": "right",
"image1": [
"5337:5332",
0
],
"image2": [
"5337:5335",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"5337:5335": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5357",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5391:5384": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Change the style of @image_1 to",
"string_b": [
"5401",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5386": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Change the style of @image_1 to",
"string_b": [
"5402",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5388": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Change the style of @image_1 to",
"string_b": [
"5403",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5390": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Change the style of @image_1 to",
"string_b": [
"5404",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5394": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Use @image_1 from the reference images as a start frame and visual style. Use the motion from the depth map from @video_1. Ensure that the style of the video is",
"string_b": [
"5401",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5395": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Use @image_1 from the reference images as a start frame and visual style. Use the motion from the depth map from @video_1. Ensure that the style of the video is",
"string_b": [
"5402",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5396": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Use @image_1 from the reference images as a start frame and visual style. Use the motion from the depth map from @video_1. Ensure that the style of the video is",
"string_b": [
"5403",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5391:5397": {
"class_type": "StringConcatenate",
"inputs": {
"delimiter": " ",
"string_a": "Use @image_1 from the reference images as a start frame and visual style. Use the motion from the depth map from @video_1. Ensure that the style of the video is",
"string_b": [
"5404",
0
]
},
"_meta": {
"title": "Concatenate Text"
}
},
"5405:5342": {
"class_type": "DepthAnything_V3",
"inputs": {
"da3_model": [
"5405:5343",
0
],
"images": [
"5405:5344",
0
],
"invert_depth": False,
"keep_model_size": False,
"normalization_mode": "V2-Style",
"resize_method": "resize"
},
"_meta": {
"title": "Depth Anything V3"
}
},
"5405:5343": {
"class_type": "DownloadAndLoadDepthAnythingV3Model",
"inputs": {
"attention": "auto",
"model": "da3_large.safetensors",
"precision": "auto"
},
"_meta": {
"title": "Load Depth Anything V3 Model"
}
},
"5405:5344": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5001",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5405:5359": {
"class_type": "CreateVideo",
"inputs": {
"audio": [
"5405:5344",
1
],
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": [
"5405:5344",
2
],
"images": [
"5405:5342",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"5405:5406": {
"class_type": "ImageFromBatch",
"inputs": {
"batch_index": 0,
"image": [
"5405:5344",
0
],
"length": 1
},
"_meta": {
"title": "Get Image from Batch"
}
}
})
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)常见问答
It computes a per-frame depth map from your input video to preserve scene structure, then uses ByteDance2ReferenceNode (Seedance 2.0) to blend that structure with a style reference created from the first frame by GPT-Image-2. Increasing depth/consistency settings (if exposed) typically reduces flicker and warping.
Yes. OpenAIGPTImageNodeV2 calls GPT-Image-2 to create a style-matched reference from the first frame. Add your API key in that node’s settings and adjust any available parameters to control the reference output.
Yes. Enter up to four prompts (one per line) in PrimitiveStringMultiline. The batch nodes (a3edb32a-4533-45e3-8eb2-84399225da2e) fan out the inputs so the pipeline produces up to four videos in one run.
Try increasing the depth influence or temporal consistency in ByteDance2ReferenceNode, lowering the style strength, and using a fixed seed. Also ensure the input fps and resolution are sensible for your GPU; excessively high settings can cause instability.
No. SaveVideo writes silent video files. If you need audio, export it from the original clip and remux it onto the styled output in your video editor.