diff --git a/README.md b/README.md index 501cbb5..ab0a102 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ A collection of ComfyUI custom nodes to handle diverse camera projections (pinho | `ZDepthToRayDepthNode` | Converts Z-depth (output of metric-depth-anything) to ray depth to compensate lens curvature. | | `TransformPointCloud` | Applies 4×4 rotation matrix to point cloud | | `ProjectPointCloud` | Z-buffer–based projection of point cloud into image + mask. | -| `CameraMotionNode` | Generates image sequences by moving camera along a trajectory. | +| `CameraMotionNode` | Generates image and mask sequences along a camera trajectory with optional mask dilation/inversion. | | `CameraInterpolationNode` | Builds a trajectory tensor from two poses. | | `CameraTrajectoryNode` | Interactive Open3D GUI for recording camera waypoints. | | `PointCloudCleaner` | Removes isolated points via voxel filtering. | @@ -201,6 +201,12 @@ Take a wide-angle (fisheye or equirectangular) high-resolution (e.g., 4096×4096 Interactive Open3D-based GUI for walking and setting camera trajectory inside pointcloud. +### 11. `wan-vace_ref_to_video.json` + +Integrate the [wan2.1-vace] video generation model to inpaint empty or newly revealed regions during camera movement or view synthesis. This workflow demonstrates how to use the camera-comfyUI nodes to generate camera trajectories and masks, then fill missing areas with the video inpainting model for smooth, high-quality results. + +wan2.1-vace Camera Inpainting Demo + --- ## Contributing @@ -217,4 +223,4 @@ Contributions welcome! Please open issues or PRs to add features, improve docs, * [x] Add more examples and documentation for each node. * [x] Add pointcloud union * [ ] Fix imports for renamed folders (e.g., inpainting_flux) -* [ ] Integrate camera movement pipeline with video models (e.g., wan2.1) for smooth, high-quality inpainting along camera trajectories. +* [x] Integrate camera movement pipeline with video models (e.g., wan2.1) for smooth, high-quality inpainting along camera trajectories. diff --git a/demo_images/wan-vace-camera.gif b/demo_images/wan-vace-camera.gif new file mode 100644 index 0000000..7a19b6a Binary files /dev/null and b/demo_images/wan-vace-camera.gif differ diff --git a/install.sh b/install.sh index 71607f3..33d17b9 100644 --- a/install.sh +++ b/install.sh @@ -1,49 +1,123 @@ #!/usr/bin/env bash set -euo pipefail -# 1. Install PyTorch with CUDA 12.8 wheels -echo "Installing PyTorch, TorchVision, TorchAudio..." -pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 +# ---------------------------------------- +# Functions +# ---------------------------------------- +install_pytorch() { + echo "Installing PyTorch, TorchVision, TorchAudio..." + pip3 install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 +} -# 2. Update apt repositories and install system dependencies -echo "Updating apt and installing build-essential, ffmpeg, libsm6, libxext6..." -sudo apt-get update -sudo apt-get install -y build-essential ffmpeg libsm6 libxext6 +install_system_deps() { + echo "Updating apt and installing system dependencies..." + sudo apt-get update + sudo apt-get install -y build-essential ffmpeg libsm6 libxext6 +} -# 3. Clone ComfyUI and install its Python requirements -echo "Cloning ComfyUI..." -git clone https://github.com/comfyanonymous/ComfyUI.git -echo "Installing ComfyUI requirements..." -pip3 install -r ComfyUI/requirements.txt +clone_and_install_comfyui() { + echo "Cloning ComfyUI..." + git clone https://github.com/comfyanonymous/ComfyUI.git + echo "Installing ComfyUI requirements..." + pip3 install -r ComfyUI/requirements.txt +} -# 4. Enter the custom_nodes folder -cd ComfyUI/custom_nodes +install_camera_node() { + echo "Cloning camera‑ComfyUI..." + git clone https://github.com/Alexankharin/camera-comfyUI.git \ + ComfyUI/custom_nodes/camera-comfyUI + echo "Installing camera‑ComfyUI requirements..." + pip3 install -r ComfyUI/custom_nodes/camera-comfyUI/requirements.txt +} -# 5. camera-comfyUI -echo "Cloning camera-comfyUI..." -git clone https://github.com/Alexankharin/camera-comfyUI.git -echo "Installing camera-comfyUI requirements..." -pip3 install camera-comfyUI/requirements.txt +install_image_filters() { + echo "Cloning Image‑Filters node..." + git clone https://github.com/spacepxl/ComfyUI-Image-Filters.git \ + ComfyUI/custom_nodes/ComfyUI-Image-Filters + echo "Installing Image‑Filters requirements..." + pip3 install -r ComfyUI/custom_nodes/ComfyUI-Image-Filters/requirements.txt +} -# 6. ComfyUI-Flux-Inpainting -echo "Cloning ComfyUI-Flux-Inpainting..." -git clone https://github.com/rubi-du/ComfyUI-Flux-Inpainting.git -echo "Installing ComfyUI-Flux-Inpainting requirements..." -pip3 install ComfyUI-Flux-Inpainting/requirements.txt +clone_flux_inpainting() { + echo "Cloning ComfyUI‑Flux‑Inpainting..." + git clone https://github.com/rubi-du/ComfyUI-Flux-Inpainting.git \ + ComfyUI/custom_nodes/Flux-Inpainting + echo "Renaming Flux‑Inpainting folder..." + mv ComfyUI/custom_nodes/Flux-Inpainting \ + ComfyUI/custom_nodes/inpainting_flux +} -# 7. ComfyUI-Image-Filters -echo "Cloning ComfyUI-Image-Filters..." -git clone https://github.com/spacepxl/ComfyUI-Image-Filters.git -echo "Installing ComfyUI-Image-Filters requirements..." -pip3 install ComfyUI-Image-Filters/requirements.txt +install_hf_hub() { + echo "Installing huggingface_hub..." + pip3 install huggingface_hub +} -# 8. Tidy up Flux Inpainting folder name -echo "Renaming Flux Inpainting folder..." -cd .. -mv custom_nodes/ComfyUI-Flux-Inpainting-main custom_nodes/inpainting_flux +download_vae_models() { + echo "Downloading WAN‑VACE models via wget..." + wget -O models/vae/wan_2.1_vae.safetensors \ + "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors?download=true" -# 9. Install Hugging Face Hub Python package -echo "Installing huggingface_hub..." -pip3 install huggingface_hub + wget -O models/text_encoders/umt5_xxl_fp16.safetensors \ + "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp16.safetensors?download=true" -echo "All done! 🎉" + wget -O models/diffusion_models/wan2.1_vace_1.3B_fp16.safetensors \ + "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/diffusion_models/wan2.1_vace_14B_fp16.safetensors?download=true" +} + +login_hf_hub() { + echo "Logging in to Hugging Face Hub..." + huggingface-cli login +} + +# ---------------------------------------- +# Main CLI +# ---------------------------------------- +# default to "install" if no arg given +MODE="${1:-install}" + +case "$MODE" in + modules) + install_pytorch + install_system_deps + clone_and_install_comfyui + install_camera_node + install_image_filters + install_hf_hub + ;; + + flux) + clone_flux_inpainting + ;; + + vae) + download_vae_models + ;; + + install) + install_pytorch + install_system_deps + clone_and_install_comfyui + install_camera_node + clone_flux_inpainting + install_image_filters + install_hf_hub + ;; + + all) + install_pytorch + install_system_deps + clone_and_install_comfyui + install_camera_node + clone_flux_inpainting + install_image_filters + install_hf_hub + download_vae_models + login_hf_hub + echo "All done! 🎉" + ;; + + *) + echo "Usage: $0 {install|modules|flux|vae|all}" + exit 1 + ;; +esac diff --git a/workflows/wan_vace_ref_to_video.json b/workflows/wan_vace_ref_to_video.json new file mode 100644 index 0000000..04403e3 --- /dev/null +++ b/workflows/wan_vace_ref_to_video.json @@ -0,0 +1,1340 @@ +{ + "id": "0898f6a6-2814-4ccd-968a-a2405ee177e7", + "revision": 0, + "last_node_id": 85, + "last_link_id": 152, + "nodes": [ + { + "id": 39, + "type": "VAELoader", + "pos": [ + 866.3932495117188, + 499.18597412109375 + ], + "size": [ + 306.36004638671875, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "slot_index": 0, + "links": [ + 76, + 114 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "wan_2.1_vae.safetensors" + ] + }, + { + "id": 54, + "type": "ModelSamplingSD3", + "pos": [ + 449.82794189453125, + 34.52389907836914 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 110 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "slot_index": 0, + "links": [ + 127 + ] + } + ], + "properties": { + "Node name for S&R": "ModelSamplingSD3", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 8 + ] + }, + { + "id": 3, + "type": "KSampler", + "pos": [ + 863, + 187 + ], + "size": [ + 315, + 262 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 127 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 115 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 116 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 117 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "slot_index": 0, + "links": [ + 119 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 359341936730965, + "fixed", + 20, + 6, + "uni_pc", + "simple", + 1 + ] + }, + { + "id": 7, + "type": "CLIPTextEncode", + "pos": [ + 413, + 389 + ], + "size": [ + 425.27801513671875, + 180.6060791015625 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 75 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "slot_index": 0, + "links": [ + 113 + ] + } + ], + "title": "CLIP Text Encode (Negative Prompt)", + "properties": { + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 77, + "type": "LoadTrajectory", + "pos": [ + -8.916632652282715, + 1223.8968505859375 + ], + "size": [ + 278.79998779296875, + 58 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "loaded_trajectory", + "type": "TENSOR", + "links": [ + 141 + ] + } + ], + "properties": { + "Node name for S&R": "LoadTrajectory", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "c6ab9e2cbb247e8817ada327dc100b9a7ad19e2e" + }, + "widgets_values": [ + "ComfyUITrajectory_00001.npy" + ] + }, + { + "id": 82, + "type": "DepthToImageNode", + "pos": [ + 58.86013412475586, + 760.6212768554688 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "depth", + "type": "TENSOR", + "link": 148 + } + ], + "outputs": [ + { + "name": "depth image", + "type": "IMAGE", + "links": [ + 144 + ] + } + ], + "properties": { + "Node name for S&R": "DepthToImageNode", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "c6ab9e2cbb247e8817ada327dc100b9a7ad19e2e" + }, + "widgets_values": [ + false + ] + }, + { + "id": 83, + "type": "ZDepthToRayDepthNode", + "pos": [ + 162.0160369873047, + 641.4620361328125 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "depth", + "type": "TENSOR", + "link": 146 + } + ], + "outputs": [ + { + "name": "ray depth", + "type": "TENSOR", + "links": [ + 147, + 148 + ] + } + ], + "properties": { + "Node name for S&R": "ZDepthToRayDepthNode", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "c6ab9e2cbb247e8817ada327dc100b9a7ad19e2e" + }, + "widgets_values": [ + 120 + ] + }, + { + "id": 62, + "type": "FisheyeDepthEstimator", + "pos": [ + -191.07432556152344, + 417.1524963378906 + ], + "size": [ + 270, + 246 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 129 + } + ], + "outputs": [ + { + "name": "depthmap", + "type": "TENSOR", + "links": [ + 146 + ] + }, + { + "name": "mask", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "FisheyeDepthEstimator", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "38d18f19b2c556e2f7a757e8a9bc48f3a1aa7675" + }, + "widgets_values": [ + "Depth-Anything-V2-Metric-Indoor-Base-hf", + 1, + 90, + 1024, + 4096, + "DISTANCE_AWARE", + 25, + 11 + ] + }, + { + "id": 80, + "type": "PreviewImage", + "pos": [ + 1045.3646240234375, + 1030.2586669921875 + ], + "size": [ + 140, + 246 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 143 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage", + "cnr_id": "comfy-core", + "ver": "0.3.40" + }, + "widgets_values": [] + }, + { + "id": 58, + "type": "Note", + "pos": [ + 1381.3507080078125, + 720.0184326171875 + ], + "size": [ + 263.95501708984375, + 155.10342407226562 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": { + "widget_ue_connectable": {} + }, + "widgets_values": [ + "crf 0 means a lossless webm, if you want a lossy once with smaller filesize increase the crf." + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 55, + "type": "WanVaceToVideo", + "pos": [ + 730.3499145507812, + 669.31396484375 + ], + "size": [ + 270, + 254 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 112 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 113 + }, + { + "name": "vae", + "type": "VAE", + "link": 114 + }, + { + "name": "control_video", + "shape": 7, + "type": "IMAGE", + "link": 139 + }, + { + "name": "control_masks", + "shape": 7, + "type": "MASK", + "link": 140 + }, + { + "name": "reference_image", + "shape": 7, + "type": "IMAGE", + "link": 149 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 115 + ] + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 116 + ] + }, + { + "name": "latent", + "type": "LATENT", + "links": [ + 117 + ] + }, + { + "name": "trim_latent", + "type": "INT", + "links": [ + 121 + ] + } + ], + "properties": { + "Node name for S&R": "WanVaceToVideo", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + 1024, + 1024, + 81, + 1, + 1 + ] + }, + { + "id": 63, + "type": "DepthToPointCloud", + "pos": [ + -145.52676391601562, + 928.0172119140625 + ], + "size": [ + 271.408203125, + 170 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 131 + }, + { + "name": "depthmap", + "shape": 7, + "type": "TENSOR", + "link": 147 + }, + { + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + } + ], + "outputs": [ + { + "name": "pointcloud", + "type": "TENSOR", + "links": [ + 150 + ] + } + ], + "properties": { + "Node name for S&R": "DepthToPointCloud", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "38d18f19b2c556e2f7a757e8a9bc48f3a1aa7675" + }, + "widgets_values": [ + "FISHEYE", + 180, + 1, + false + ] + }, + { + "id": 81, + "type": "PreviewImage", + "pos": [ + 507.861572265625, + 829.2660522460938 + ], + "size": [ + 140, + 246 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 144 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage", + "cnr_id": "comfy-core", + "ver": "0.3.40" + }, + "widgets_values": [] + }, + { + "id": 84, + "type": "PointCloudCleaner", + "pos": [ + 143.30438232421875, + 928.3477172851562 + ], + "size": [ + 329.20001220703125, + 130 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "pointcloud", + "type": "TENSOR", + "link": 150 + } + ], + "outputs": [ + { + "name": "cleaned_pointcloud", + "type": "TENSOR", + "links": [ + 151 + ] + } + ], + "properties": { + "Node name for S&R": "PointCloudCleaner", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "c6ab9e2cbb247e8817ada327dc100b9a7ad19e2e" + }, + "widgets_values": [ + 1024, + 1024, + 1, + 9 + ] + }, + { + "id": 6, + "type": "CLIPTextEncode", + "pos": [ + 409.3579406738281, + 166.25271606445312 + ], + "size": [ + 422.84503173828125, + 164.31304931640625 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 74 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "slot_index": 0, + "links": [ + 112 + ] + } + ], + "title": "CLIP Text Encode (Positive Prompt)", + "properties": { + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "Anime style victorian kitchen with foxgirl in fisheye projection, dynamic camera movements" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 52, + "type": "LoadImage", + "pos": [ + -525.614501953125, + 659.7692260742188 + ], + "size": [ + 315, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 129, + 131, + 149 + ] + }, + { + "name": "MASK", + "type": "MASK", + "slot_index": 1, + "links": [] + } + ], + "properties": { + "Node name for S&R": "LoadImage", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "Fisheye_outpainted_flux_dev.png", + "image" + ] + }, + { + "id": 38, + "type": "CLIPLoader", + "pos": [ + -15.783010482788086, + 218.16552734375 + ], + "size": [ + 390, + 106 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "slot_index": 0, + "links": [ + 74, + 75 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "umt5_xxl_fp16.safetensors", + "wan", + "default" + ] + }, + { + "id": 37, + "type": "UNETLoader", + "pos": [ + 20, + 70 + ], + "size": [ + 346.7470703125, + 82 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "slot_index": 0, + "links": [ + 110 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [ + "wan2,1_vace14B_fp16.safetensors", + "default" + ] + }, + { + "id": 56, + "type": "TrimVideoLatent", + "pos": [ + 1071.01611328125, + 630.7037353515625 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 119 + }, + { + "name": "trim_amount", + "type": "INT", + "widget": { + "name": "trim_amount" + }, + "link": 121 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 120 + ] + } + ], + "properties": { + "Node name for S&R": "TrimVideoLatent", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": { + "trim_amount": true + } + }, + "widgets_values": [ + 0 + ] + }, + { + "id": 8, + "type": "VAEDecode", + "pos": [ + 1410.783935546875, + 369.41815185546875 + ], + "size": [ + 210, + 256.0000305175781 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 120 + }, + { + "name": "vae", + "type": "VAE", + "link": 76 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "slot_index": 0, + "links": [ + 152 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode", + "cnr_id": "comfy-core", + "ver": "0.3.35", + "widget_ue_connectable": {} + }, + "widgets_values": [] + }, + { + "id": 60, + "type": "VHS_VideoCombine", + "pos": [ + 1804.013916015625, + 167.86778259277344 + ], + "size": [ + 535.460693359375, + 334 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": null + }, + { + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "name": "meta_batch", + "shape": 7, + "type": "VHS_BatchManager", + "link": null + }, + { + "name": "vae", + "shape": 7, + "type": "VAE", + "link": null + } + ], + "outputs": [ + { + "name": "Filenames", + "type": "VHS_FILENAMES", + "links": null + } + ], + "properties": { + "Node name for S&R": "VHS_VideoCombine", + "cnr_id": "comfyui-videohelpersuite", + "ver": "a7ce59e381934733bfae03b1be029756d6ce936d", + "widget_ue_connectable": {} + }, + "widgets_values": { + "frame_rate": 24, + "loop_count": 0, + "filename_prefix": "vace", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "trim_to_audio": false, + "pingpong": false, + "save_output": true, + "videopreview": { + "hidden": false, + "paused": false, + "params": { + "filename": "vace_00005.mp4", + "subfolder": "", + "type": "output", + "format": "video/h264-mp4", + "frame_rate": 24, + "workflow": "vace_00005.png", + "fullpath": "/root/ComfyUI/output/vace_00005.mp4" + } + } + } + }, + { + "id": 78, + "type": "MaskToImage", + "pos": [ + 816.998779296875, + 1061.0892333984375 + ], + "size": [ + 184.62362670898438, + 26 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 142 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 143 + ] + } + ], + "properties": { + "Node name for S&R": "MaskToImage", + "cnr_id": "comfy-core", + "ver": "0.3.40" + }, + "widgets_values": [] + }, + { + "id": 70, + "type": "CameraMotionNode", + "pos": [ + 435.6319885253906, + 1137.2432861328125 + ], + "size": [ + 295.6000061035156, + 270 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "pointcloud", + "type": "TENSOR", + "link": 151 + }, + { + "name": "trajectory", + "type": "TENSOR", + "link": 141 + } + ], + "outputs": [ + { + "name": "motion_frames", + "type": "IMAGE", + "links": [ + 139 + ] + }, + { + "name": "mask_frames", + "type": "MASK", + "links": [ + 140, + 142 + ] + } + ], + "properties": { + "Node name for S&R": "CameraMotionNode", + "aux_id": "Alexankharin/camera-comfyUI", + "ver": "c6ab9e2cbb247e8817ada327dc100b9a7ad19e2e" + }, + "widgets_values": [ + 2, + "FISHEYE", + 180, + 1024, + 1024, + 1, + 0, + true, + false + ] + }, + { + "id": 85, + "type": "SaveWEBM", + "pos": [ + 1803.9105224609375, + 610.2356567382812 + ], + "size": [ + 270, + 392 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 152 + } + ], + "outputs": [], + "properties": {}, + "widgets_values": [ + "ComfyUI", + "vp9", + 24, + 32 + ] + } + ], + "links": [ + [ + 74, + 38, + 0, + 6, + 0, + "CLIP" + ], + [ + 75, + 38, + 0, + 7, + 0, + "CLIP" + ], + [ + 76, + 39, + 0, + 8, + 1, + "VAE" + ], + [ + 110, + 37, + 0, + 54, + 0, + "MODEL" + ], + [ + 112, + 6, + 0, + 55, + 0, + "CONDITIONING" + ], + [ + 113, + 7, + 0, + 55, + 1, + "CONDITIONING" + ], + [ + 114, + 39, + 0, + 55, + 2, + "VAE" + ], + [ + 115, + 55, + 0, + 3, + 1, + "CONDITIONING" + ], + [ + 116, + 55, + 1, + 3, + 2, + "CONDITIONING" + ], + [ + 117, + 55, + 2, + 3, + 3, + "LATENT" + ], + [ + 119, + 3, + 0, + 56, + 0, + "LATENT" + ], + [ + 120, + 56, + 0, + 8, + 0, + "LATENT" + ], + [ + 121, + 55, + 3, + 56, + 1, + "INT" + ], + [ + 127, + 54, + 0, + 3, + 0, + "MODEL" + ], + [ + 129, + 52, + 0, + 62, + 0, + "IMAGE" + ], + [ + 131, + 52, + 0, + 63, + 0, + "IMAGE" + ], + [ + 139, + 70, + 0, + 55, + 3, + "IMAGE" + ], + [ + 140, + 70, + 1, + 55, + 4, + "MASK" + ], + [ + 141, + 77, + 0, + 70, + 1, + "TENSOR" + ], + [ + 142, + 70, + 1, + 78, + 0, + "MASK" + ], + [ + 143, + 78, + 0, + 80, + 0, + "IMAGE" + ], + [ + 144, + 82, + 0, + 81, + 0, + "IMAGE" + ], + [ + 146, + 62, + 0, + 83, + 0, + "TENSOR" + ], + [ + 147, + 83, + 0, + 63, + 1, + "TENSOR" + ], + [ + 148, + 83, + 0, + 82, + 0, + "TENSOR" + ], + [ + 149, + 52, + 0, + 55, + 5, + "IMAGE" + ], + [ + 150, + 63, + 0, + 84, + 0, + "TENSOR" + ], + [ + 151, + 84, + 0, + 70, + 0, + "TENSOR" + ], + [ + 152, + 8, + 0, + 85, + 0, + "IMAGE" + ] + ], + "groups": [], + "config": {}, + "extra": { + "ds": { + "scale": 2.1762913579014893, + "offset": [ + -1639.9078785011613, + -763.9045759158322 + ] + }, + "frontendVersion": "1.21.7", + "ue_links": [], + "links_added_by_ue": [], + "VHS_latentpreview": false, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true + }, + "version": 0.4 +} \ No newline at end of file