This page is for version 26.09 · v1.4.0.
For other versions, use one of these documentation indexes:
- Latest · v1.4.0 (26.09) (default): https://docs.nvidia.com/nemo/curator/latest/llms.txt
- Main · preview: https://docs.nvidia.com/nemo/curator/main/llms.txt
- 26.09 · v1.4.0: https://docs.nvidia.com/nemo/curator/v26.09/llms.txt
- 26.07 · v1.3.0: https://docs.nvidia.com/nemo/curator/v26.07/llms.txt
- 26.04 · v1.2.0: https://docs.nvidia.com/nemo/curator/v26.04/llms.txt
- 26.02 · v1.1.0: https://docs.nvidia.com/nemo/curator/v26.02/llms.txt
- 25.09 · v1.0.0: https://docs.nvidia.com/nemo/curator/v25.09/llms.txt
VideoTask is the task type for video processing in NeMo Curator.
Import
from nemo_curator.tasks import VideoTask
Class Definition
from dataclasses import dataclassfrom nemo_curator.tasks.video import Video@dataclassclass VideoTask(Task[Video]):"""Task containing a single video for processing.Attributes:task_id: Framework-managed deterministic lineage identifier.dataset_name: Name of the source dataset.data: Video object with path and metadata."""dataset_name: strdata: Video# task_id is inherited from Task with init=False.
Video Class
The video data is represented by a Video object:
@dataclassclass Video:"""Represents a video file with metadata.Attributes:path: Path to the video file.start_time: Start time in seconds (for clips).end_time: End time in seconds (for clips).metadata: Additional metadata dictionary.embeddings: Optional embedding vector."""path: strstart_time: float | None = Noneend_time: float | None = Nonemetadata: dict[str, Any] = field(default_factory=dict)embeddings: np.ndarray | None = None
Properties
num_items
Get the number of items (always 1 for VideoTask).
@propertydef num_items(self) -> int:"""Returns 1 (VideoTask represents a single video)."""
Creating VideoTask
from nemo_curator.tasks import VideoTaskfrom nemo_curator.tasks.video import Video# Create a video objectvideo = Video(path="/data/videos/video1.mp4",start_time=0.0,end_time=30.0,metadata={"duration": 120.5,"fps": 30,"resolution": "1920x1080",},)# Create tasktask = VideoTask(dataset_name="video_dataset",data=video,)
Do not pass task_id to the constructor. The framework assigns it after the task crosses a stage boundary.
Usage in Stages
from dataclasses import dataclassfrom nemo_curator.stages.base import ProcessingStagefrom nemo_curator.tasks import VideoTask@dataclassclass VideoFilterStage(ProcessingStage[VideoTask, VideoTask]):"""Filter videos based on duration."""name: str = "VideoFilter"min_duration: float = 5.0max_duration: float = 300.0def inputs(self) -> tuple[list[str], list[str]]:return ["data"], []def outputs(self) -> tuple[list[str], list[str]]:return ["data"], []def process(self, task: VideoTask) -> VideoTask | None:video = task.dataduration = video.metadata.get("duration", 0)if not (self.min_duration <= duration <= self.max_duration):return Nonereturn VideoTask(dataset_name=task.dataset_name,data=video,_metadata=task._metadata,_stage_perf=task._stage_perf,)
Common Operations
Splitting Videos into Clips
The video splitting stages return multiple VideoTask objects:
def process(self, task: VideoTask) -> list[VideoTask]:clips = []video = task.datafor i, (start, end) in enumerate(self._compute_splits(video)):clip_video = Video(path=video.path,start_time=start,end_time=end,metadata=video.metadata.copy(),)clips.append(VideoTask(dataset_name=task.dataset_name,data=clip_video,_metadata=task._metadata,_stage_perf=task._stage_perf,))return clips
Adding Embeddings
def process(self, task: VideoTask) -> VideoTask:video = task.datavideo.embeddings = self.encoder.encode(video.path)return VideoTask(dataset_name=task.dataset_name,data=video,_metadata=task._metadata,_stage_perf=task._stage_perf,)