Native Stereo Video Viewer (PyOpenXR)
Watch Your Stereo Video Inside the Headset, Not a Browser
The finish line of the whole ComfyStereo pipeline. You've converted a video to side-by-side stereo; now you want to actually see it in 3D, and this node puts it inside your headset through the OpenXR runtime - no browser, no media player, no side-loading a file to the Quest. Run the node and a persistent PyOpenXR viewer launches and starts playing the file at the path you give it.
This is a terminal node: no outputs, nothing downstream. It's the point where the workflow stops producing and starts showing.
How it works
Under the hood it checks whether PyOpenXR and an OpenXR runtime are available, then hands the video file off to the pack's native viewer, which renders it as a textured quad (or sphere/dome) in the VR scene. The viewer is persistent - re-run the workflow and it updates what's playing rather than spawning a second window. Keyboard controls handle play, pause, and seek. If you want audio, note the catch: ffmpeg must be installed separately, because the audio extraction uses it. The README calls that out explicitly, and it's easy to miss until you have a silent video.
The inputs that matter
- video_path - an absolute path to a real file on disk. This is a plain string, not a ComfyUI media loader, so there's no file browser; drag the file's path in or type it.
- stereo_format -
Side-by-Side,Over-Under, orMono. Set it to how the video was encoded. Get this wrong and you'll see a ghostly doubled image instead of depth. - projection_type -
Flat Screen,Curved Screen,180° Dome, or360° Sphere. Flat is the sensible default for regular stereo; dome and sphere are for equirectangular VR content. - screen_size and screen_distance (both 1.0–10.0) - how big the virtual screen is and how far it floats from you.
- swap_eyes - flips left/right. Reach for this when the depth feels inverted; it happens more than it should with oddball encoders.
- loop_video (default on) and auto_launch (default on) - self-explanatory. Turn
auto_launchoff if you don't want the viewer popping every run.
Install
ComfyUI Manager → search "ComfyStereo" → install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Dobidop/ComfyStereo.git
cd ComfyStereo
pip install -r requirements.txt
The VR extras - pyopenxr, PyOpenGL, PyOpenGL_accelerate, glfw, pygame - are in that same requirements file, so one install covers them. You still need an OpenXR runtime on the machine: SteamVR (recommended, covers most headsets), the Oculus runtime for Meta Quest, or Windows Mixed Reality. And the headset has to be on and the runtime running before the node will do anything.
Troubleshooting
- "NATIVE VR VIEWER NOT AVAILABLE" in the console - the node degrades gracefully but uselessly: it prints a banner and returns. Run NativeVRStatus from the same pack to find out which layer is missing - the pyopenxr package or the runtime itself.
- Node missing from the menu entirely - the pack hides the native nodes at import time when
pyopenxrisn't installed. Install the requirements and restart. - "ERROR: Video file not found" - the path string points nowhere. Use an absolute path and double-check the slashes on Windows.
- No audio - install ffmpeg (the viewer shells out to it for audio extraction).
- Stereo looks wrong - check
stereo_formatfirst, thenswap_eyes.
It's a niche node for a niche pipeline, and it has zero search presence today - but if you're building 3D content for a headset, it's the piece that makes the loop feel finished.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| video_path | STRING | — | |
| stereo_format | COMBO | 3 options: Side-by-Side, Over-Under, Mono | |
| projection_type | COMBO | 4 options: Flat Screen, Curved Screen, 180° Dome, 360° Sphere | |
| screen_size | FLOAT | 3.01–10 | — |
| screen_distance | FLOAT | 3.01–10 | — |
| swap_eyes | BOOLEAN | false | — |
| loop_video | BOOLEAN | true | — |
| auto_launch | BOOLEAN | true | — |
| background_color | COMBO | 4 options: Black, Dark Gray, Gray, White |
Outputs (0)
No outputs