├── __init__.py ├── pyproject.toml ├── .github └── workflows │ └── publish.yml ├── LICENSE ├── .gitignore ├── README.md ├── nodes.py └── example ├── Coherent Sampler Video.json └── Coherent Sampler Video example.json /__init__.py: -------------------------------------------------------------------------------- 1 | from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS 2 | 3 | __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "comfyui-cohernetvideo-sampler" 3 | version = "0.3.0" 4 | description = "A custom node for ComfyUI that enables coherent video generation while maintaining efficient memory usage, specifically optimized for heavy models like Flux" 5 | authors = [ 6 | { name = "Shmuel Ronen" } 7 | ] 8 | requires-python = ">=3.10" 9 | readme = "README.md" 10 | license = { text = "MIT" } 11 | dependencies = [ 12 | "torch", 13 | "numpy", 14 | "pillow" 15 | ] 16 | 17 | [project.optional-dependencies] 18 | dev = [ 19 | "pytest>=8.0.0", 20 | "pre-commit>=4.0.1" 21 | ] 22 | 23 | [tool.comfy-nodes] 24 | publisher = "@shmuel" -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to Comfy registry 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: 6 | - main 7 | - master 8 | paths: 9 | - "pyproject.toml" 10 | 11 | jobs: 12 | publish-node: 13 | name: Publish Custom Node to registry 14 | runs-on: ubuntu-latest 15 | # if this is a forked repository. Skipping the workflow. 16 | if: github.event.repository.fork == false 17 | steps: 18 | - name: Check out code 19 | uses: actions/checkout@v4 20 | - name: Publish Custom Node 21 | uses: Comfy-Org/publish-node-action@main 22 | with: 23 | ## Add your own personal access token to your Github Repository secrets and reference it here. 24 | personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Shmuel Ronen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | #.idea/ 163 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ComfyUI Coherent Video Sampler Node (V0.3) 2 | 3 | A custom node for ComfyUI that enables coherent video generation while maintaining efficient memory usage, specifically optimized for heavy models like Flux. 4 | 5 | ![image](https://github.com/user-attachments/assets/a690a69b-675c-4658-a1be-761017b0fabb) 6 | 7 | ## Features 8 | 9 | - 🎥 Frame-by-frame video processing with motion preservation 10 | - 🧠 Efficient memory management for heavy models 11 | - 🔄 Progressive denoising with coherence maintenance 12 | - 💫 Dynamic quality control and motion guidance 13 | - 🎨 Style preservation across frames 14 | - 🛠️ Advanced adjustment controls for fine-tuning 15 | 16 | ## Installation 17 | 18 | Install from ComfyUI manager 19 | 20 | or 21 | 22 | Navigate to your ComfyUI custom nodes directory: 23 | ```bash 24 | cd ComfyUI/custom_nodes 25 | ``` 26 | 27 | Clone this repository: 28 | ```bash 29 | git clone https://github.com/ShmuelRonen/ComfyUI-CohernetVideoSampler.git 30 | ``` 31 | 32 | Restart ComfyUI 33 | 34 | ## Usage 35 | 36 | #### For Deforum-like results please use 'shuttle-3-diffusion-fp8.safetensors' 4 steps flux model 37 | 38 | The node appears in the node menu as "Cohernet Video Sampler". 39 | 40 | ### Core Parameters Guide 41 | 42 | The sampler now includes four key adjustment parameters that work together to control different aspects of video generation: 43 | 44 | 1. **denoise** (0.0-1.0): 45 | - Primary denoising control for the sampling process 46 | - Controls overall deviation from input 47 | - Lower values (0.3-0.5): Subtle changes, closer to input 48 | - Higher values (0.7-0.9): More dramatic transformations 49 | - Recommended: 0.6 for balanced results 50 | 51 | 2. **motion_strength** (0.0-1.0): 52 | - Controls motion intensity between frames 53 | - Affects transition smoothness 54 | - Lower values (0.3-0.4): More static, stable output 55 | - Higher values (0.7-0.8): Pronounced motion, dynamic transitions 56 | - Recommended: 0.5 for natural movement 57 | 58 | 3. **consistency_strength** (0.0-1.0): 59 | - Maintains visual consistency across frames 60 | - Controls style preservation 61 | - Lower values (0.7-0.8): More variation allowed 62 | - Higher values (0.9-1.0): Strict consistency enforcement 63 | - Recommended: 0.9 for coherent results 64 | 65 | 4. **denoise_strength** (0.0-1.0): 66 | - Secondary denoising for artifact reduction 67 | - Fine-tunes final output quality 68 | - Lower values (0.5-0.7): Preserve more details 69 | - Higher values (0.8-0.9): Smoother, cleaner output 70 | - Recommended: 0.8 for balanced detail preservation 71 | 72 | ### Parameter Combinations for Different Effects 73 | 74 | #### High Quality Stable Video 75 | ``` 76 | denoise: 0.6 77 | motion_strength: 0.5 78 | consistency_strength: 0.9 79 | denoise_strength: 0.8 80 | ``` 81 | 82 | #### Dynamic Movement Priority 83 | ``` 84 | denoise: 0.5 85 | motion_strength: 0.7 86 | consistency_strength: 0.8 87 | denoise_strength: 0.7 88 | ``` 89 | 90 | #### Maximum Detail Preservation 91 | ``` 92 | denoise: 0.4 93 | motion_strength: 0.4 94 | consistency_strength: 0.85 95 | denoise_strength: 0.6 96 | ``` 97 | 98 | ### Other Inputs 99 | - `model`: Your diffusion model (tested extensively with Flux) 100 | - `positive`: Positive prompt conditioning 101 | - `negative`: Negative prompt conditioning 102 | - `video_latents`: Input video in latent space (from VAE Encode) 103 | - `seed`: Generation seed 104 | - `steps`: Number of sampling steps 105 | - `cfg`: Classifier free guidance scale 106 | - `sampler_name`: Choice of sampler 107 | - `scheduler`: Choice of scheduler 108 | 109 | ### Memory Management 110 | The node implements several memory optimization techniques: 111 | - Progressive batch processing 112 | - Automatic VRAM cleanup 113 | - Dynamic batch size adjustment 114 | - Efficient latent space operations 115 | 116 | This allows it to work smoothly even with memory-intensive models like Flux without OOM errors. 117 | 118 | ## Memory Usage Examples 119 | 120 | When using with Flux model: 121 | - 20 frame video @ 512x512: ~8GB VRAM 122 | - 40 frame video @ 512x512: ~10GB VRAM 123 | - Processing happens in windows of frames to maintain stable memory usage 124 | 125 | ## Optimization Tips 126 | 127 | 1. **For Smoother Videos:** 128 | - Increase consistency_strength 129 | - Decrease motion_strength slightly 130 | - Keep denoise moderate 131 | - Maintain high denoise_strength 132 | 133 | 2. **For More Dynamic Videos:** 134 | - Increase motion_strength 135 | - Decrease consistency_strength slightly 136 | - Lower denoise_strength for detail 137 | - Adjust denoise based on desired change level 138 | 139 | 3. **For Maximum Quality:** 140 | - Balance all parameters 141 | - Use higher consistency_strength 142 | - Moderate motion_strength 143 | - Higher denoise_strength 144 | 145 | ## Known Limitations 146 | 147 | - Very long videos might need to be processed in segments 148 | - Extreme motion can affect coherence 149 | - High denoise values might reduce motion preservation 150 | - Parameter interactions can be complex 151 | 152 | ## Future Plans 153 | 154 | - Additional motion control parameters 155 | - Custom denoising patterns 156 | - Advanced style preservation options 157 | - Multi-model support optimization 158 | - Parameter presets for common use cases 159 | 160 | ## Contributing 161 | 162 | Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. 163 | 164 | ## License 165 | 166 | [MIT License](LICENSE) 167 | 168 | ## Acknowledgments 169 | 170 | - ComfyUI team for the amazing framework 171 | - Flux model team for the inspiration in handling heavy models 172 | -------------------------------------------------------------------------------- /nodes.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | import comfy.sample 4 | import comfy.model_management 5 | import comfy.utils 6 | import gc 7 | import logging 8 | 9 | class MotionGuidedSampler(nn.Module): 10 | def __init__( 11 | self, 12 | motion_strength: float = 0.5, 13 | consistency_strength: float = 0.9, 14 | denoise_strength: float = 0.8 15 | ): 16 | super().__init__() 17 | self.motion_strength = motion_strength 18 | self.consistency_strength = consistency_strength 19 | self.denoise_strength = denoise_strength 20 | 21 | logging.basicConfig(level=logging.INFO) 22 | self.logger = logging.getLogger(__name__) 23 | 24 | def extract_motion_vector(self, current_latent: torch.Tensor, prev_latent: torch.Tensor) -> torch.Tensor: 25 | try: 26 | return current_latent - prev_latent 27 | except RuntimeError as e: 28 | self.logger.error(f"Motion extraction error: {e}") 29 | return torch.zeros_like(current_latent) 30 | 31 | def apply_motion_vector(self, content: torch.Tensor, motion_vector: torch.Tensor) -> torch.Tensor: 32 | try: 33 | motion_applied = content + (motion_vector * self.motion_strength) 34 | if torch.isnan(motion_applied).any(): 35 | self.logger.warning("NaN detected in motion application") 36 | return content 37 | return motion_applied 38 | except RuntimeError as e: 39 | self.logger.error(f"Motion application error: {e}") 40 | return content 41 | 42 | def process_frames(self, latent_frames, model, positive, negative, seed, steps, cfg, sampler_name, scheduler, denoise): 43 | batch_size = latent_frames.shape[0] 44 | processed_frames = [] 45 | device = comfy.model_management.get_torch_device() 46 | 47 | latent_frames = latent_frames.to(device) 48 | pbar = comfy.utils.ProgressBar(batch_size) 49 | 50 | # Initialize sampler 51 | sampler = comfy.samplers.KSampler( 52 | model, 53 | steps=steps, 54 | device=device, 55 | sampler=sampler_name, 56 | scheduler=scheduler, 57 | denoise=denoise 58 | ) 59 | 60 | # Process first frame 61 | noise = comfy.sample.prepare_noise(latent_frames[0:1], seed, None).to(device) 62 | first_frame = sampler.sample( 63 | noise, 64 | positive, 65 | negative, 66 | cfg=cfg, 67 | latent_image=latent_frames[0:1], 68 | force_full_denoise=True 69 | ) 70 | 71 | processed_frames.append(first_frame) 72 | prev_orig = latent_frames[0:1].to(device) 73 | prev_styled = first_frame 74 | 75 | pbar.update(1) 76 | 77 | # Process remaining frames 78 | for i in range(1, batch_size): 79 | current_orig = latent_frames[i:i+1].to(device) 80 | 81 | motion = self.extract_motion_vector(current_orig, prev_orig) 82 | motion_guided = self.apply_motion_vector(prev_styled, motion) 83 | 84 | current_noise = comfy.sample.prepare_noise(motion_guided, seed + i, None).to(device) 85 | current_frame = sampler.sample( 86 | current_noise, 87 | positive, 88 | negative, 89 | cfg=cfg, 90 | latent_image=motion_guided, 91 | force_full_denoise=True 92 | ) 93 | 94 | processed_frames.append(current_frame) 95 | prev_orig = current_orig 96 | prev_styled = current_frame 97 | 98 | pbar.update(1) 99 | 100 | if i % 5 == 0: 101 | if torch.cuda.is_available(): 102 | torch.cuda.empty_cache() 103 | gc.collect() 104 | self.logger.info(f"Processed {i}/{batch_size} frames") 105 | 106 | result = torch.cat(processed_frames, dim=0) 107 | return result.to(device) 108 | 109 | def forward(self, latent_frames, model, positive, negative, noise_seed, steps, cfg, sampler_name, scheduler, denoise): 110 | try: 111 | return self.process_frames( 112 | latent_frames=latent_frames, 113 | model=model, 114 | positive=positive, 115 | negative=negative, 116 | seed=noise_seed, 117 | steps=steps, 118 | cfg=cfg, 119 | sampler_name=sampler_name, 120 | scheduler=scheduler, 121 | denoise=denoise 122 | ) 123 | except Exception as e: 124 | self.logger.error(f"Processing error: {str(e)}") 125 | raise e 126 | 127 | class CohernetVideoSampler: 128 | @classmethod 129 | def INPUT_TYPES(s): 130 | return { 131 | "required": { 132 | "model": ("MODEL",), 133 | "positive": ("CONDITIONING",), 134 | "negative": ("CONDITIONING",), 135 | "video_latents": ("LATENT",), 136 | "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), 137 | "steps": ("INT", {"default": 20, "min": 1, "max": 10000}), 138 | "cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0}), 139 | "sampler_name": (["euler", "euler_ancestral", "heun", "dpm_2", 140 | "dpm_2_ancestral", "lms", "dpm_fast", "dpm_adaptive", 141 | "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_2m"],), 142 | "scheduler": (["simple", "karras", "exponential", "normal", "ddim_uniform"],), 143 | "denoise": ("FLOAT", {"default": 0.6, "min": 0.0, "max": 1.0, "step": 0.01}), 144 | "motion_strength": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.05}), 145 | "consistency_strength": ("FLOAT", {"default": 0.9, "min": 0.0, "max": 1.0, "step": 0.05}), 146 | "denoise_strength": ("FLOAT", {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.05}), 147 | } 148 | } 149 | 150 | RETURN_TYPES = ("LATENT",) 151 | FUNCTION = "sample" 152 | CATEGORY = "sampling" 153 | 154 | def sample(self, model, video_latents, positive, negative, seed, steps, 155 | cfg, sampler_name, scheduler, denoise, motion_strength, 156 | consistency_strength, denoise_strength): 157 | 158 | sampler = MotionGuidedSampler( 159 | motion_strength=motion_strength, 160 | consistency_strength=consistency_strength, 161 | denoise_strength=denoise_strength 162 | ) 163 | 164 | try: 165 | samples = sampler( 166 | latent_frames=video_latents['samples'], 167 | model=model, 168 | positive=positive, 169 | negative=negative, 170 | noise_seed=seed, 171 | steps=steps, 172 | cfg=cfg, 173 | sampler_name=sampler_name, 174 | scheduler=scheduler, 175 | denoise=denoise 176 | ) 177 | 178 | return ({"samples": samples},) 179 | 180 | except Exception as e: 181 | logging.error(f"Sampling error: {str(e)}") 182 | raise e 183 | 184 | # Node registration 185 | NODE_CLASS_MAPPINGS = { 186 | "CohernetVideoSampler": CohernetVideoSampler 187 | } 188 | 189 | NODE_DISPLAY_NAME_MAPPINGS = { 190 | "CohernetVideoSampler": "Cohernet Video Sampler" 191 | } -------------------------------------------------------------------------------- /example/Coherent Sampler Video.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 83, 3 | "last_link_id": 188, 4 | "nodes": [ 5 | { 6 | "id": 11, 7 | "type": "DualCLIPLoader", 8 | "pos": [ 9 | -50, 10 | 241 11 | ], 12 | "size": [ 13 | 315, 14 | 106 15 | ], 16 | "flags": {}, 17 | "order": 0, 18 | "mode": 0, 19 | "inputs": [], 20 | "outputs": [ 21 | { 22 | "name": "CLIP", 23 | "type": "CLIP", 24 | "links": [ 25 | 10, 26 | 98 27 | ], 28 | "slot_index": 0, 29 | "shape": 3 30 | } 31 | ], 32 | "properties": { 33 | "Node name for S&R": "DualCLIPLoader" 34 | }, 35 | "widgets_values": [ 36 | "google_t5-v1_1-xxl-fp8_e4m3fn.safetensors", 37 | "clip_l.safetensors", 38 | "flux" 39 | ] 40 | }, 41 | { 42 | "id": 10, 43 | "type": "VAELoader", 44 | "pos": [ 45 | 814.210693359375, 46 | 99.14796447753906 47 | ], 48 | "size": [ 49 | 315, 50 | 58 51 | ], 52 | "flags": {}, 53 | "order": 1, 54 | "mode": 0, 55 | "inputs": [], 56 | "outputs": [ 57 | { 58 | "name": "VAE", 59 | "type": "VAE", 60 | "links": [ 61 | 148, 62 | 151 63 | ], 64 | "slot_index": 0, 65 | "shape": 3 66 | } 67 | ], 68 | "properties": { 69 | "Node name for S&R": "VAELoader" 70 | }, 71 | "widgets_values": [ 72 | "FLUX1\\ae.safetensors" 73 | ] 74 | }, 75 | { 76 | "id": 56, 77 | "type": "FluxGuidance", 78 | "pos": [ 79 | 421, 80 | 89.07776641845703 81 | ], 82 | "size": [ 83 | 317.4000244140625, 84 | 58 85 | ], 86 | "flags": {}, 87 | "order": 7, 88 | "mode": 0, 89 | "inputs": [ 90 | { 91 | "name": "conditioning", 92 | "type": "CONDITIONING", 93 | "link": 102 94 | } 95 | ], 96 | "outputs": [ 97 | { 98 | "name": "CONDITIONING", 99 | "type": "CONDITIONING", 100 | "links": [ 101 | 182 102 | ], 103 | "slot_index": 0 104 | } 105 | ], 106 | "properties": { 107 | "Node name for S&R": "FluxGuidance" 108 | }, 109 | "widgets_values": [ 110 | 3.5 111 | ] 112 | }, 113 | { 114 | "id": 12, 115 | "type": "UNETLoader", 116 | "pos": [ 117 | -45, 118 | 91 119 | ], 120 | "size": [ 121 | 370.5085144042969, 122 | 85.46925354003906 123 | ], 124 | "flags": {}, 125 | "order": 2, 126 | "mode": 0, 127 | "inputs": [], 128 | "outputs": [ 129 | { 130 | "name": "MODEL", 131 | "type": "MODEL", 132 | "links": [ 133 | 187 134 | ], 135 | "slot_index": 0, 136 | "shape": 3 137 | } 138 | ], 139 | "properties": { 140 | "Node name for S&R": "UNETLoader" 141 | }, 142 | "widgets_values": [ 143 | "shuttle-3-diffusion-fp8.safetensors", 144 | "fp8_e4m3fn" 145 | ] 146 | }, 147 | { 148 | "id": 72, 149 | "type": "VAEDecode", 150 | "pos": [ 151 | 1122.2679443359375, 152 | 248.98814392089844 153 | ], 154 | "size": [ 155 | 210, 156 | 46 157 | ], 158 | "flags": {}, 159 | "order": 9, 160 | "mode": 0, 161 | "inputs": [ 162 | { 163 | "name": "samples", 164 | "type": "LATENT", 165 | "link": 176 166 | }, 167 | { 168 | "name": "vae", 169 | "type": "VAE", 170 | "link": 151 171 | } 172 | ], 173 | "outputs": [ 174 | { 175 | "name": "IMAGE", 176 | "type": "IMAGE", 177 | "links": [ 178 | 152 179 | ], 180 | "slot_index": 0 181 | } 182 | ], 183 | "properties": { 184 | "Node name for S&R": "VAEDecode" 185 | }, 186 | "widgets_values": [] 187 | }, 188 | { 189 | "id": 6, 190 | "type": "CLIPTextEncode", 191 | "pos": [ 192 | 416.11578369140625, 193 | 222.82479858398438 194 | ], 195 | "size": [ 196 | 422.84503173828125, 197 | 164.31304931640625 198 | ], 199 | "flags": { 200 | "collapsed": false 201 | }, 202 | "order": 4, 203 | "mode": 0, 204 | "inputs": [ 205 | { 206 | "name": "clip", 207 | "type": "CLIP", 208 | "link": 10 209 | } 210 | ], 211 | "outputs": [ 212 | { 213 | "name": "CONDITIONING", 214 | "type": "CONDITIONING", 215 | "links": [ 216 | 102 217 | ], 218 | "slot_index": 0 219 | } 220 | ], 221 | "properties": { 222 | "Node name for S&R": "CLIPTextEncode" 223 | }, 224 | "widgets_values": [ 225 | "raw photo of Witch elf in the woods of Angemar" 226 | ], 227 | "color": "#232", 228 | "bgcolor": "#353" 229 | }, 230 | { 231 | "id": 70, 232 | "type": "VAEEncode", 233 | "pos": [ 234 | 730.596923828125, 235 | 563.647705078125 236 | ], 237 | "size": [ 238 | 210, 239 | 46 240 | ], 241 | "flags": {}, 242 | "order": 6, 243 | "mode": 0, 244 | "inputs": [ 245 | { 246 | "name": "pixels", 247 | "type": "IMAGE", 248 | "link": 149 249 | }, 250 | { 251 | "name": "vae", 252 | "type": "VAE", 253 | "link": 148 254 | } 255 | ], 256 | "outputs": [ 257 | { 258 | "name": "LATENT", 259 | "type": "LATENT", 260 | "links": [ 261 | 184 262 | ], 263 | "slot_index": 0 264 | } 265 | ], 266 | "properties": { 267 | "Node name for S&R": "VAEEncode" 268 | }, 269 | "widgets_values": [] 270 | }, 271 | { 272 | "id": 55, 273 | "type": "CLIPTextEncode", 274 | "pos": [ 275 | 425.89520263671875, 276 | 456.3788757324219 277 | ], 278 | "size": [ 279 | 422.84503173828125, 280 | 164.31304931640625 281 | ], 282 | "flags": { 283 | "collapsed": true 284 | }, 285 | "order": 5, 286 | "mode": 0, 287 | "inputs": [ 288 | { 289 | "name": "clip", 290 | "type": "CLIP", 291 | "link": 98 292 | } 293 | ], 294 | "outputs": [ 295 | { 296 | "name": "CONDITIONING", 297 | "type": "CONDITIONING", 298 | "links": [ 299 | 183 300 | ], 301 | "slot_index": 0 302 | } 303 | ], 304 | "properties": { 305 | "Node name for S&R": "CLIPTextEncode" 306 | }, 307 | "widgets_values": [ 308 | "" 309 | ], 310 | "color": "#322", 311 | "bgcolor": "#533" 312 | }, 313 | { 314 | "id": 71, 315 | "type": "VHS_LoadVideo", 316 | "pos": [ 317 | -40.839900970458984, 318 | 566.0588989257812 319 | ], 320 | "size": [ 321 | 349.1050720214844, 322 | 924.0807495117188 323 | ], 324 | "flags": {}, 325 | "order": 3, 326 | "mode": 0, 327 | "inputs": [ 328 | { 329 | "name": "meta_batch", 330 | "type": "VHS_BatchManager", 331 | "link": null, 332 | "shape": 7 333 | }, 334 | { 335 | "name": "vae", 336 | "type": "VAE", 337 | "link": null, 338 | "shape": 7 339 | } 340 | ], 341 | "outputs": [ 342 | { 343 | "name": "IMAGE", 344 | "type": "IMAGE", 345 | "links": [ 346 | 149 347 | ], 348 | "slot_index": 0 349 | }, 350 | { 351 | "name": "frame_count", 352 | "type": "INT", 353 | "links": null 354 | }, 355 | { 356 | "name": "audio", 357 | "type": "AUDIO", 358 | "links": null 359 | }, 360 | { 361 | "name": "video_info", 362 | "type": "VHS_VIDEOINFO", 363 | "links": null 364 | } 365 | ], 366 | "properties": { 367 | "Node name for S&R": "VHS_LoadVideo" 368 | }, 369 | "widgets_values": { 370 | "video": "production ID_4962903.mp4", 371 | "force_rate": 0, 372 | "force_size": "Custom Width", 373 | "custom_width": 768, 374 | "custom_height": 512, 375 | "frame_load_cap": 56, 376 | "skip_first_frames": 0, 377 | "select_every_nth": 1, 378 | "choose video to upload": "image", 379 | "videopreview": { 380 | "hidden": false, 381 | "paused": false, 382 | "params": { 383 | "force_rate": 0, 384 | "frame_load_cap": 56, 385 | "skip_first_frames": 0, 386 | "select_every_nth": 1, 387 | "filename": "production ID_4962903.mp4", 388 | "type": "input", 389 | "format": "video/mp4" 390 | }, 391 | "muted": false 392 | } 393 | } 394 | }, 395 | { 396 | "id": 76, 397 | "type": "CohernetVideoSampler", 398 | "pos": [ 399 | 1010.0838623046875, 400 | 388.933349609375 401 | ], 402 | "size": [ 403 | 315, 404 | 286 405 | ], 406 | "flags": {}, 407 | "order": 8, 408 | "mode": 0, 409 | "inputs": [ 410 | { 411 | "name": "model", 412 | "type": "MODEL", 413 | "link": 187 414 | }, 415 | { 416 | "name": "positive", 417 | "type": "CONDITIONING", 418 | "link": 182 419 | }, 420 | { 421 | "name": "negative", 422 | "type": "CONDITIONING", 423 | "link": 183 424 | }, 425 | { 426 | "name": "video_latents", 427 | "type": "LATENT", 428 | "link": 184 429 | } 430 | ], 431 | "outputs": [ 432 | { 433 | "name": "LATENT", 434 | "type": "LATENT", 435 | "links": [ 436 | 176 437 | ], 438 | "slot_index": 0 439 | } 440 | ], 441 | "properties": { 442 | "Node name for S&R": "CohernetVideoSampler" 443 | }, 444 | "widgets_values": [ 445 | 514560233523873, 446 | "randomize", 447 | 4, 448 | 1, 449 | "euler", 450 | "simple", 451 | 0.63, 452 | 0.5 453 | ], 454 | "color": "#323", 455 | "bgcolor": "#535" 456 | }, 457 | { 458 | "id": 73, 459 | "type": "VHS_VideoCombine", 460 | "pos": [ 461 | 1403.9207763671875, 462 | 249.24537658691406 463 | ], 464 | "size": [ 465 | 489.2989501953125, 466 | 1213.712646484375 467 | ], 468 | "flags": {}, 469 | "order": 10, 470 | "mode": 0, 471 | "inputs": [ 472 | { 473 | "name": "images", 474 | "type": "IMAGE", 475 | "link": 152 476 | }, 477 | { 478 | "name": "audio", 479 | "type": "AUDIO", 480 | "link": null, 481 | "shape": 7 482 | }, 483 | { 484 | "name": "meta_batch", 485 | "type": "VHS_BatchManager", 486 | "link": null, 487 | "shape": 7 488 | }, 489 | { 490 | "name": "vae", 491 | "type": "VAE", 492 | "link": null, 493 | "shape": 7 494 | } 495 | ], 496 | "outputs": [ 497 | { 498 | "name": "Filenames", 499 | "type": "VHS_FILENAMES", 500 | "links": null 501 | } 502 | ], 503 | "properties": { 504 | "Node name for S&R": "VHS_VideoCombine" 505 | }, 506 | "widgets_values": { 507 | "frame_rate": 20, 508 | "loop_count": 0, 509 | "filename_prefix": "CG", 510 | "format": "video/h264-mp4", 511 | "pix_fmt": "yuv420p", 512 | "crf": 19, 513 | "save_metadata": true, 514 | "pingpong": false, 515 | "save_output": true, 516 | "videopreview": { 517 | "hidden": false, 518 | "paused": false, 519 | "params": { 520 | "filename": "CG_00043.mp4", 521 | "subfolder": "", 522 | "type": "output", 523 | "format": "video/h264-mp4", 524 | "frame_rate": 20 525 | }, 526 | "muted": false 527 | } 528 | } 529 | } 530 | ], 531 | "links": [ 532 | [ 533 | 10, 534 | 11, 535 | 0, 536 | 6, 537 | 0, 538 | "CLIP" 539 | ], 540 | [ 541 | 98, 542 | 11, 543 | 0, 544 | 55, 545 | 0, 546 | "CLIP" 547 | ], 548 | [ 549 | 102, 550 | 6, 551 | 0, 552 | 56, 553 | 0, 554 | "CONDITIONING" 555 | ], 556 | [ 557 | 148, 558 | 10, 559 | 0, 560 | 70, 561 | 1, 562 | "VAE" 563 | ], 564 | [ 565 | 149, 566 | 71, 567 | 0, 568 | 70, 569 | 0, 570 | "IMAGE" 571 | ], 572 | [ 573 | 151, 574 | 10, 575 | 0, 576 | 72, 577 | 1, 578 | "VAE" 579 | ], 580 | [ 581 | 152, 582 | 72, 583 | 0, 584 | 73, 585 | 0, 586 | "IMAGE" 587 | ], 588 | [ 589 | 176, 590 | 76, 591 | 0, 592 | 72, 593 | 0, 594 | "LATENT" 595 | ], 596 | [ 597 | 182, 598 | 56, 599 | 0, 600 | 76, 601 | 1, 602 | "CONDITIONING" 603 | ], 604 | [ 605 | 183, 606 | 55, 607 | 0, 608 | 76, 609 | 2, 610 | "CONDITIONING" 611 | ], 612 | [ 613 | 184, 614 | 70, 615 | 0, 616 | 76, 617 | 3, 618 | "LATENT" 619 | ], 620 | [ 621 | 187, 622 | 12, 623 | 0, 624 | 76, 625 | 0, 626 | "MODEL" 627 | ] 628 | ], 629 | "groups": [], 630 | "config": {}, 631 | "extra": { 632 | "ds": { 633 | "scale": 0.5989500000000004, 634 | "offset": [ 635 | 731.7550645577697, 636 | -17.426595479298076 637 | ] 638 | }, 639 | "info": { 640 | "name": "workflow", 641 | "author": "", 642 | "description": "", 643 | "version": "1", 644 | "created": "2024-08-01T19:08:07.203Z", 645 | "modified": "2024-08-02T03:55:48.387Z", 646 | "software": "ComfyUI" 647 | } 648 | }, 649 | "version": 0.4 650 | } -------------------------------------------------------------------------------- /example/Coherent Sampler Video example.json: -------------------------------------------------------------------------------- 1 | { 2 | "last_node_id": 85, 3 | "last_link_id": 191, 4 | "nodes": [ 5 | { 6 | "id": 10, 7 | "type": "VAELoader", 8 | "pos": [ 9 | 814.210693359375, 10 | 99.14796447753906 11 | ], 12 | "size": [ 13 | 315, 14 | 58 15 | ], 16 | "flags": {}, 17 | "order": 0, 18 | "mode": 0, 19 | "inputs": [], 20 | "outputs": [ 21 | { 22 | "name": "VAE", 23 | "type": "VAE", 24 | "links": [ 25 | 148, 26 | 151 27 | ], 28 | "slot_index": 0, 29 | "shape": 3 30 | } 31 | ], 32 | "properties": { 33 | "Node name for S&R": "VAELoader" 34 | }, 35 | "widgets_values": [ 36 | "FLUX1\\ae.safetensors" 37 | ] 38 | }, 39 | { 40 | "id": 56, 41 | "type": "FluxGuidance", 42 | "pos": [ 43 | 421, 44 | 89.07776641845703 45 | ], 46 | "size": [ 47 | 317.4000244140625, 48 | 58 49 | ], 50 | "flags": {}, 51 | "order": 7, 52 | "mode": 0, 53 | "inputs": [ 54 | { 55 | "name": "conditioning", 56 | "type": "CONDITIONING", 57 | "link": 102 58 | } 59 | ], 60 | "outputs": [ 61 | { 62 | "name": "CONDITIONING", 63 | "type": "CONDITIONING", 64 | "links": [ 65 | 182 66 | ], 67 | "slot_index": 0 68 | } 69 | ], 70 | "properties": { 71 | "Node name for S&R": "FluxGuidance" 72 | }, 73 | "widgets_values": [ 74 | 3.5 75 | ] 76 | }, 77 | { 78 | "id": 73, 79 | "type": "VHS_VideoCombine", 80 | "pos": [ 81 | 1735.7569580078125, 82 | 319.5849304199219 83 | ], 84 | "size": [ 85 | 879.50537109375, 86 | 807.4718017578125 87 | ], 88 | "flags": {}, 89 | "order": 11, 90 | "mode": 0, 91 | "inputs": [ 92 | { 93 | "name": "images", 94 | "type": "IMAGE", 95 | "link": 186 96 | }, 97 | { 98 | "name": "audio", 99 | "type": "AUDIO", 100 | "link": null, 101 | "shape": 7 102 | }, 103 | { 104 | "name": "meta_batch", 105 | "type": "VHS_BatchManager", 106 | "link": null, 107 | "shape": 7 108 | }, 109 | { 110 | "name": "vae", 111 | "type": "VAE", 112 | "link": null, 113 | "shape": 7 114 | } 115 | ], 116 | "outputs": [ 117 | { 118 | "name": "Filenames", 119 | "type": "VHS_FILENAMES", 120 | "links": null 121 | } 122 | ], 123 | "properties": { 124 | "Node name for S&R": "VHS_VideoCombine" 125 | }, 126 | "widgets_values": { 127 | "frame_rate": 20, 128 | "loop_count": 0, 129 | "filename_prefix": "CG", 130 | "format": "video/h264-mp4", 131 | "pix_fmt": "yuv420p", 132 | "crf": 19, 133 | "save_metadata": true, 134 | "pingpong": false, 135 | "save_output": true, 136 | "videopreview": { 137 | "hidden": false, 138 | "paused": false, 139 | "params": { 140 | "filename": "CG_00111.mp4", 141 | "subfolder": "", 142 | "type": "output", 143 | "format": "video/h264-mp4", 144 | "frame_rate": 20 145 | }, 146 | "muted": false 147 | } 148 | } 149 | }, 150 | { 151 | "id": 72, 152 | "type": "VAEDecode", 153 | "pos": [ 154 | 1443.17578125, 155 | 317.5063781738281 156 | ], 157 | "size": [ 158 | 210, 159 | 46 160 | ], 161 | "flags": {}, 162 | "order": 9, 163 | "mode": 0, 164 | "inputs": [ 165 | { 166 | "name": "samples", 167 | "type": "LATENT", 168 | "link": 176 169 | }, 170 | { 171 | "name": "vae", 172 | "type": "VAE", 173 | "link": 151 174 | } 175 | ], 176 | "outputs": [ 177 | { 178 | "name": "IMAGE", 179 | "type": "IMAGE", 180 | "links": [ 181 | 185 182 | ], 183 | "slot_index": 0 184 | } 185 | ], 186 | "properties": { 187 | "Node name for S&R": "VAEDecode" 188 | }, 189 | "widgets_values": [] 190 | }, 191 | { 192 | "id": 76, 193 | "type": "CohernetVideoSampler", 194 | "pos": [ 195 | 1005.3133544921875, 196 | 365.0821838378906 197 | ], 198 | "size": [ 199 | 315, 200 | 382 201 | ], 202 | "flags": {}, 203 | "order": 8, 204 | "mode": 0, 205 | "inputs": [ 206 | { 207 | "name": "model", 208 | "type": "MODEL", 209 | "link": 191 210 | }, 211 | { 212 | "name": "positive", 213 | "type": "CONDITIONING", 214 | "link": 182 215 | }, 216 | { 217 | "name": "negative", 218 | "type": "CONDITIONING", 219 | "link": 183 220 | }, 221 | { 222 | "name": "video_latents", 223 | "type": "LATENT", 224 | "link": 184 225 | } 226 | ], 227 | "outputs": [ 228 | { 229 | "name": "LATENT", 230 | "type": "LATENT", 231 | "links": [ 232 | 176 233 | ], 234 | "slot_index": 0 235 | } 236 | ], 237 | "properties": { 238 | "Node name for S&R": "CohernetVideoSampler" 239 | }, 240 | "widgets_values": [ 241 | 101748689922600, 242 | "randomize", 243 | 4, 244 | 1, 245 | "euler", 246 | "simple", 247 | 0.71, 248 | 0.45, 249 | 0.55, 250 | 0.5 251 | ] 252 | }, 253 | { 254 | "id": 12, 255 | "type": "UNETLoader", 256 | "pos": [ 257 | -45, 258 | 91 259 | ], 260 | "size": [ 261 | 363.4190979003906, 262 | 99.586181640625 263 | ], 264 | "flags": {}, 265 | "order": 1, 266 | "mode": 0, 267 | "inputs": [], 268 | "outputs": [ 269 | { 270 | "name": "MODEL", 271 | "type": "MODEL", 272 | "links": [ 273 | 191 274 | ], 275 | "slot_index": 0, 276 | "shape": 3 277 | } 278 | ], 279 | "properties": { 280 | "Node name for S&R": "UNETLoader" 281 | }, 282 | "widgets_values": [ 283 | "shuttle-3-diffusion-fp8.safetensors", 284 | "fp8_e4m3fn" 285 | ] 286 | }, 287 | { 288 | "id": 70, 289 | "type": "VAEEncode", 290 | "pos": [ 291 | 615.59033203125, 292 | 681.0827026367188 293 | ], 294 | "size": [ 295 | 210, 296 | 46 297 | ], 298 | "flags": {}, 299 | "order": 6, 300 | "mode": 0, 301 | "inputs": [ 302 | { 303 | "name": "pixels", 304 | "type": "IMAGE", 305 | "link": 149 306 | }, 307 | { 308 | "name": "vae", 309 | "type": "VAE", 310 | "link": 148 311 | } 312 | ], 313 | "outputs": [ 314 | { 315 | "name": "LATENT", 316 | "type": "LATENT", 317 | "links": [ 318 | 184 319 | ], 320 | "slot_index": 0 321 | } 322 | ], 323 | "properties": { 324 | "Node name for S&R": "VAEEncode" 325 | }, 326 | "widgets_values": [] 327 | }, 328 | { 329 | "id": 6, 330 | "type": "CLIPTextEncode", 331 | "pos": [ 332 | 411.5191650390625, 333 | 222.0442352294922 334 | ], 335 | "size": [ 336 | 431.5182189941406, 337 | 188.75559997558594 338 | ], 339 | "flags": { 340 | "collapsed": false 341 | }, 342 | "order": 4, 343 | "mode": 0, 344 | "inputs": [ 345 | { 346 | "name": "clip", 347 | "type": "CLIP", 348 | "link": 10 349 | } 350 | ], 351 | "outputs": [ 352 | { 353 | "name": "CONDITIONING", 354 | "type": "CONDITIONING", 355 | "links": [ 356 | 102 357 | ], 358 | "slot_index": 0 359 | } 360 | ], 361 | "properties": { 362 | "Node name for S&R": "CLIPTextEncode" 363 | }, 364 | "widgets_values": [ 365 | "\"a dark Witch elf woman make spells in the forest, wearing a red and yellow plaid headscarf and black leather jacket, with colorful accessories and eyes closed in concentration, standing among stone ruins.\"" 366 | ], 367 | "color": "#232", 368 | "bgcolor": "#353" 369 | }, 370 | { 371 | "id": 55, 372 | "type": "CLIPTextEncode", 373 | "pos": [ 374 | 464.3175964355469, 375 | 466.69989013671875 376 | ], 377 | "size": [ 378 | 422.84503173828125, 379 | 164.31304931640625 380 | ], 381 | "flags": { 382 | "collapsed": true 383 | }, 384 | "order": 5, 385 | "mode": 0, 386 | "inputs": [ 387 | { 388 | "name": "clip", 389 | "type": "CLIP", 390 | "link": 98 391 | } 392 | ], 393 | "outputs": [ 394 | { 395 | "name": "CONDITIONING", 396 | "type": "CONDITIONING", 397 | "links": [ 398 | 183 399 | ], 400 | "slot_index": 0 401 | } 402 | ], 403 | "properties": { 404 | "Node name for S&R": "CLIPTextEncode" 405 | }, 406 | "widgets_values": [ 407 | "" 408 | ], 409 | "color": "#322", 410 | "bgcolor": "#533" 411 | }, 412 | { 413 | "id": 11, 414 | "type": "DualCLIPLoader", 415 | "pos": [ 416 | -4.899360179901123, 417 | 282.63128662109375 418 | ], 419 | "size": [ 420 | 315, 421 | 106 422 | ], 423 | "flags": {}, 424 | "order": 2, 425 | "mode": 0, 426 | "inputs": [], 427 | "outputs": [ 428 | { 429 | "name": "CLIP", 430 | "type": "CLIP", 431 | "links": [ 432 | 10, 433 | 98 434 | ], 435 | "slot_index": 0, 436 | "shape": 3 437 | } 438 | ], 439 | "properties": { 440 | "Node name for S&R": "DualCLIPLoader" 441 | }, 442 | "widgets_values": [ 443 | "google_t5-v1_1-xxl-fp8_e4m3fn.safetensors", 444 | "clip_l.safetensors", 445 | "flux" 446 | ] 447 | }, 448 | { 449 | "id": 71, 450 | "type": "VHS_LoadVideo", 451 | "pos": [ 452 | -156.10658264160156, 453 | 529.9784545898438 454 | ], 455 | "size": [ 456 | 461.68292236328125, 457 | 548.4466552734375 458 | ], 459 | "flags": {}, 460 | "order": 3, 461 | "mode": 0, 462 | "inputs": [ 463 | { 464 | "name": "meta_batch", 465 | "type": "VHS_BatchManager", 466 | "link": null, 467 | "shape": 7 468 | }, 469 | { 470 | "name": "vae", 471 | "type": "VAE", 472 | "link": null, 473 | "shape": 7 474 | } 475 | ], 476 | "outputs": [ 477 | { 478 | "name": "IMAGE", 479 | "type": "IMAGE", 480 | "links": [ 481 | 149 482 | ], 483 | "slot_index": 0 484 | }, 485 | { 486 | "name": "frame_count", 487 | "type": "INT", 488 | "links": null 489 | }, 490 | { 491 | "name": "audio", 492 | "type": "AUDIO", 493 | "links": null 494 | }, 495 | { 496 | "name": "video_info", 497 | "type": "VHS_VIDEOINFO", 498 | "links": null 499 | } 500 | ], 501 | "properties": { 502 | "Node name for S&R": "VHS_LoadVideo" 503 | }, 504 | "widgets_values": { 505 | "video": "3044077-uhd_3840_2160_24fps.mp4", 506 | "force_rate": 0, 507 | "force_size": "Custom Width", 508 | "custom_width": 768, 509 | "custom_height": 1024, 510 | "frame_load_cap": 20, 511 | "skip_first_frames": 0, 512 | "select_every_nth": 1, 513 | "choose video to upload": "image", 514 | "videopreview": { 515 | "hidden": false, 516 | "paused": false, 517 | "params": { 518 | "force_rate": 0, 519 | "frame_load_cap": 20, 520 | "skip_first_frames": 0, 521 | "select_every_nth": 1, 522 | "filename": "3044077-uhd_3840_2160_24fps.mp4", 523 | "type": "input", 524 | "format": "video/mp4" 525 | }, 526 | "muted": false 527 | } 528 | } 529 | }, 530 | { 531 | "id": 83, 532 | "type": "FILM VFI", 533 | "pos": [ 534 | 1365.2254638671875, 535 | 469.2728271484375 536 | ], 537 | "size": [ 538 | 318.82177734375, 539 | 126 540 | ], 541 | "flags": {}, 542 | "order": 10, 543 | "mode": 0, 544 | "inputs": [ 545 | { 546 | "name": "frames", 547 | "type": "IMAGE", 548 | "link": 185 549 | }, 550 | { 551 | "name": "optional_interpolation_states", 552 | "type": "INTERPOLATION_STATES", 553 | "link": null, 554 | "shape": 7 555 | } 556 | ], 557 | "outputs": [ 558 | { 559 | "name": "IMAGE", 560 | "type": "IMAGE", 561 | "links": [ 562 | 186 563 | ], 564 | "slot_index": 0 565 | } 566 | ], 567 | "properties": { 568 | "Node name for S&R": "FILM VFI" 569 | }, 570 | "widgets_values": [ 571 | "film_net_fp32.pt", 572 | 10, 573 | 2 574 | ] 575 | } 576 | ], 577 | "links": [ 578 | [ 579 | 10, 580 | 11, 581 | 0, 582 | 6, 583 | 0, 584 | "CLIP" 585 | ], 586 | [ 587 | 98, 588 | 11, 589 | 0, 590 | 55, 591 | 0, 592 | "CLIP" 593 | ], 594 | [ 595 | 102, 596 | 6, 597 | 0, 598 | 56, 599 | 0, 600 | "CONDITIONING" 601 | ], 602 | [ 603 | 148, 604 | 10, 605 | 0, 606 | 70, 607 | 1, 608 | "VAE" 609 | ], 610 | [ 611 | 149, 612 | 71, 613 | 0, 614 | 70, 615 | 0, 616 | "IMAGE" 617 | ], 618 | [ 619 | 151, 620 | 10, 621 | 0, 622 | 72, 623 | 1, 624 | "VAE" 625 | ], 626 | [ 627 | 176, 628 | 76, 629 | 0, 630 | 72, 631 | 0, 632 | "LATENT" 633 | ], 634 | [ 635 | 182, 636 | 56, 637 | 0, 638 | 76, 639 | 1, 640 | "CONDITIONING" 641 | ], 642 | [ 643 | 183, 644 | 55, 645 | 0, 646 | 76, 647 | 2, 648 | "CONDITIONING" 649 | ], 650 | [ 651 | 184, 652 | 70, 653 | 0, 654 | 76, 655 | 3, 656 | "LATENT" 657 | ], 658 | [ 659 | 185, 660 | 72, 661 | 0, 662 | 83, 663 | 0, 664 | "IMAGE" 665 | ], 666 | [ 667 | 186, 668 | 83, 669 | 0, 670 | 73, 671 | 0, 672 | "IMAGE" 673 | ], 674 | [ 675 | 191, 676 | 12, 677 | 0, 678 | 76, 679 | 0, 680 | "MODEL" 681 | ] 682 | ], 683 | "groups": [], 684 | "config": {}, 685 | "extra": { 686 | "ds": { 687 | "scale": 0.5989500000000054, 688 | "offset": [ 689 | 458.4392355167249, 690 | 72.65077291574978 691 | ] 692 | }, 693 | "info": { 694 | "name": "workflow", 695 | "author": "", 696 | "description": "", 697 | "version": "1", 698 | "created": "2024-08-01T19:08:07.203Z", 699 | "modified": "2024-08-02T03:55:48.387Z", 700 | "software": "ComfyUI" 701 | } 702 | }, 703 | "version": 0.4 704 | } --------------------------------------------------------------------------------