π SBS Video Uploader by SamSeen
The front door of the SamSeen 3D video pipeline β turn any video into stereo frames
- images
- frame_count
- audio
- source_fps
- target_fps
Want to watch your own 2D video in a Quest? Then this is where the whole thing starts. SBS Video Uploader is the intake valve of the SamSeen stereoscope pack: it loads a video, chops it into a batch of frames, and hands you everything you need - the frames, the audio, and the frame rate - to run the frames through a stereo node and stitch them back into 3D.
The pipeline it feeds is simple once you see it: Uploader β SBS V2 by SamSeen (which builds the left/right view from each frame) β SBS Video Combiner (which merges them back into a file). People use it for exactly what you'd guess - turning existing footage, animation, or even game captures into side-by-side 3D for VR headsets and 3D displays.
How it works
The node scans your ComfyUI input folder for video files (.mp4, .webm, .mkv, .gif, .mov) and lists them in the video dropdown. A small web extension adds an "Upload video" button right on the node, so you don't have to drop files into the folder by hand - click it, pick a file, and it lands in input and appears in the dropdown.
Behind the scenes it uses OpenCV to read frames, then converts each one to an RGB tensor and stacks them into a single batched IMAGE. Crucially, it also extracts the audio track and reports the source FPS - that's what makes the round-trip possible without a separate A/V pipeline. If you only want a taste before committing to the full video, the frame-limiting controls let you process a short slice.
The inputs that matter
Only a couple deserve your attention on a first pass:
video- the dropdown of files in yourinputfolder. Pick your file.max_width(default 512) andmax_height(default 0 = auto) - the target size, scaled to keep aspect ratio. Set one and the other follows; 512 is a safe default because depth processing gets slow at full 4K.frame_load_cap(default 0 = all, max 1000) - test on a handful of frames before you commit to a full render.select_every_nth(default 1) - keep every Nth frame. Great for previewing; remember it halves your output FPS at 2.skip_first_frames- trims the start, and the audio is trimmed to match so you stay in sync.
The outputs
The useful ones:
images(IMAGE) β wire intoSBS V2 by SamSeen'sbase_image.frame_count(INT) β handy for a counter or conditioning.audio(AUDIO) β wire straight intoSBS Video Combiner's audio input for pass-through.source_fpsandtarget_fps(FLOAT) βtarget_fpsaccounts forselect_every_nth, so feed it to the combiner'sframe_rateand your output won't play in fast-forward.
Install
It's part of the ComfyUI_SSStereoscope pack, so installing the pack gets you this node. Easiest path is ComfyUI Manager - search for "ComfyUI_SSStereoscope". Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/MrSamSeen/ComfyUI_SSStereoscope
cd ComfyUI_SSStereoscope
pip install -r requirements.txt
Restart ComfyUI, then refresh the node list. FFmpeg matters here. The pack tries your system FFmpeg first and falls back to the bundled imageio-ffmpeg binary, but on Windows you'll get the best (and least surprising) results installing FFmpeg yourself and adding it to PATH - audio extraction and reliable video reading depend on it.
Where people get burned
The classic mistake is forgetting that the whole pack runs frame-by-frame: every frame gets its own depth pass, so a 30-second clip at 30fps is 900 individual depth estimations. Keep max_width modest and preview with frame_load_cap before rendering. Also, if your frames come out upside-down or the 3D looks reversed, don't panic - that's the invert_depth toggle on the stereo node, not this one. And if the node shows "none" in the dropdown, the file you uploaded isn't in the input folder or the node hasn't been refreshed.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| video | COMBO | 1 options: none | |
| max_width | INT | 51264β4096 | β |
| max_height | INT | 00β4096 | β |
| frame_load_cap | INT | 00β1000 | β |
| skip_first_frames | INT | 00β1000 | β |
| select_every_nth | INT | 11β100 | β |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |
| frame_count | INT | β |
| audio | AUDIO | β |
| source_fps | FLOAT | β |
| target_fps | FLOAT | β |