Files
CavinHuang-comfyui-nodes-docs/docs/VHS_LoadVideo.md
2024-05-26 20:35:16 +08:00

5.3 KiB

Documentation

LoadVideoUpload节点旨在高效管理和处理视频文件。它能够从多种来源加载视频,包括本地文件和URL,并提供上采样和操作视频帧的功能。该节点确保视频数据被正确格式化并准备好用于后续处理阶段。

Input types

Required

  • video
    • 'video'参数至关重要,因为它指定了要处理的视频文件的来源。它可以是指向本地文件的路径,也可以是指向在线视频的URL。此参数直接影响节点加载和访问视频内容的能力。
    • Comfy dtype: STRING
    • Python dtype: str

Optional

  • force_rate
    • 'force_rate'参数允许调整视频的帧率。这是一个可选设置,可用于确保不同视频之间的帧率一致,这对于某些视频处理任务很重要。
    • Comfy dtype: INT
    • Python dtype: int
  • force_size
    • 'force_size'参数用于指定视频帧的期望分辨率。它提供几种预设选项,并允许设置自定义尺寸,这对于保持纵横比或适应特定的显示要求可能是必要的。
    • Comfy dtype: STRING
    • Python dtype: str
  • custom_width
    • 当需要自定义视频尺寸时,'custom_width'设置视频帧的宽度。这是一个重要的参数,用于视频尺寸调整操作,确保视频适应所需的宽度限制。
    • Comfy dtype: INT
    • Python dtype: int
  • custom_height
    • 'custom_height'参数通过设置视频帧的高度来补充'custom_width'。它在视频尺寸调整中扮演重要角色,特别是当视频内容需要特定的高度要求时。
    • Comfy dtype: INT
    • Python dtype: int
  • frame_load_cap
    • 'frame_load_cap'参数决定了从视频中加载的最大帧数。它有助于控制内存使用和处理时间,特别是处理长视频时。
    • Comfy dtype: INT
    • Python dtype: int
  • skip_first_frames
    • 'skip_first_frames'参数使节点能够跳过视频开头指定数量的帧。这对于从视频处理工作流程中省略不需要的内容或片头很有用。
    • Comfy dtype: INT
    • Python dtype: int
  • select_every_nth
    • 'select_every_nth'参数用于从视频中以规律间隔选择帧。它有助于降低帧率或创建视频内容的摘要。
    • Comfy dtype: INT
    • Python dtype: int

Output types

  • IMAGE
    • 'IMAGE'输出以张量的形式提供视频帧,这是一个多维数组,适用于进一步的视频分析和处理。
    • Comfy dtype: TENSOR
    • Python dtype: torch.Tensor
  • frame_count
    • 'frame_count'输出指示从视频中加载的总帧数,这对于了解视频数据的范围至关重要。
    • Comfy dtype: INT
    • Python dtype: int
  • audio
    • 'audio'输出是一个函数,当被调用时,提供对视频的音频流的访问。这可以用于音频分析或与视频帧一起用于进一步处理。
    • Comfy dtype: FUNCTION
    • Python dtype: Callable[[], Any]
  • video_info
    • 'video_info'输出包含有关视频的元数据,如帧率、时长和尺寸。这些信息对于需要了解视频特性的各种视频处理任务非常有价值。
    • Comfy dtype: DICT
    • Python dtype: Dict[str, Union[int, float, str]]

Usage tips

  • Infra type: CPU

Source code

class LoadVideoUpload:

    @classmethod
    def INPUT_TYPES(s):
        input_dir = folder_paths.get_input_directory()
        files = []
        for f in os.listdir(input_dir):
            if os.path.isfile(os.path.join(input_dir, f)):
                file_parts = f.split('.')
                if len(file_parts) > 1 and file_parts[-1] in video_extensions:
                    files.append(f)
        return {'required': {'video': (sorted(files),), 'force_rate': ('INT', {'default': 0, 'min': 0, 'max': 60, 'step': 1}), 'force_size': (['Disabled', 'Custom Height', 'Custom Width', 'Custom', '256x?', '?x256', '256x256', '512x?', '?x512', '512x512'],), 'custom_width': ('INT', {'default': 512, 'min': 0, 'max': DIMMAX, 'step': 8}), 'custom_height': ('INT', {'default': 512, 'min': 0, 'max': DIMMAX, 'step': 8}), 'frame_load_cap': ('INT', {'default': 0, 'min': 0, 'max': BIGMAX, 'step': 1}), 'skip_first_frames': ('INT', {'default': 0, 'min': 0, 'max': BIGMAX, 'step': 1}), 'select_every_nth': ('INT', {'default': 1, 'min': 1, 'max': BIGMAX, 'step': 1})}, 'optional': {'meta_batch': ('VHS_BatchManager',)}, 'hidden': {'unique_id': 'UNIQUE_ID'}}
    CATEGORY = 'Video Helper Suite 🎥🅥🅗🅢'
    RETURN_TYPES = ('IMAGE', 'INT', 'VHS_AUDIO', 'VHS_VIDEOINFO')
    RETURN_NAMES = ('IMAGE', 'frame_count', 'audio', 'video_info')
    FUNCTION = 'load_video'

    def load_video(self, **kwargs):
        return load_video_cv(**kwargs)

    @classmethod
    def IS_CHANGED(s, video, **kwargs):
        image_path = folder_paths.get_annotated_filepath(video)
        return calculate_file_hash(image_path)

    @classmethod
    def VALIDATE_INPUTS(s, video, force_size, **kwargs):
        import requests
        if video.startswith('http'):
            resp = requests.head(video)
            if resp.status_code != 200:
                return 'Invalid video file: {}'.format(video)
        elif not folder_paths.exists_annotated_filepath(video):
            return 'Invalid video file: {}'.format(video)
        return True