AllInOnePlayer
Playing a Real Video Inside Your Node Graph
- STRING
AllInOnePlayer is the flagship of this pack, and the name isn't a lie. Point it at a video file, drive it with an incrementing frame number, and it plays the whole movie as a scrolling wall of black-and-white emoji in your node graph. It's the README's tagline - "1 step closer to replacing all software with comfy" - made literal. Is it useful? Not really. Is it the best demo you've got for "I play videos in ComfyUI now"? Absolutely.
How it works
On the first frame, the node opens the video with OpenCV, extracts every frame, shrinks each one to your chosen width, converts each to a ⬜/⬛ emoji grid, and caches them as .txt files in a temp_frames folder inside the node's own directory. You get a ComfyUI progress bar while it churns through the whole video - this first run is the slow part. Every subsequent frame just reads its cached text file back and returns it as a STRING, sleeping 1/framerate seconds to keep playback at roughly the right pace.
The caching is smart enough to be keyed by the video's filename, so re-running the same movie doesn't re-extract. Change the video, or delete the temp_frames folder, and it rebuilds.
The workflow the README wants you to use
Install ComfyUI-Custom-Scripts (pythongosssss) alongside this pack - the example graph needs it. Then load allinoneworkflow.json, paste the full video path into the node, check Extra options → Auto Queue, and hit Queue Prompt. The graph is tiny: a "Frame Counter" primitive (an incrementing integer) drives AllInOnePlayer's frame input, and its STRING output feeds a ShowText node that displays the mosaic. Auto Queue just keeps feeding the counter so the video advances on its own.
The inputs that matter
- frame - which frame to display, 1-based. This is meant to be wired to an incrementing counter, not typed by hand.
- video_path - full path to the video. Quotes auto-stripped, so "Copy as path" works.
- width - emoji grid width, 10–200, default 100. Bigger is sharper and much slower.
- framerate - playback pacing, default 30. Set to 0 to disable the per-frame sleep.
Output
One STRING - the emoji grid for the requested frame. Wire it into ShowText or any text display node. When you ask for a frame past the end of the movie, it returns the friendly "Failed to load frame. Either the video is over..." string rather than crashing, which is how the demo loop terminates.
Install
ComfyUI Manager (search "VideoPlayer") or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/BetaDoggo/ComfyUI-VideoPlayer
Restart, and install ComfyUI-Custom-Scripts too or the example workflow won't open. The pack's only pip dependency is opencv-python; no models, no weights. It's CPU-only work - OpenCV and numpy - so it'll run on anything, just don't expect fast.
Where people get caught out
The default framerate of 30 means real-time playback, and "real-time" here means time.sleep(33ms) inside the node - the queue is blocked while it plays. If you want to fast-forward through frames for a batch job, drop framerate to 0 and let the counter run unthrottled. Also worth knowing: a full movie at width 200 writes a lot of text files into temp_frames, and a single wide frame is a huge string for ShowText to render. Keep width around 100 unless you're showing off.
The honest framing: this is a proof of concept from an author who's an active community contributor (known for the danbooru tag lists and an Ernie-image fp16 patch), and who calls it "a silly POC" in the project metadata. It's not going in a production workflow. It's the node you load when a friend asks what ComfyUI even is.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| frame | INT | 11–100000 | — |
| video_path | STRING | — | |
| width | INT | 10010–200 | — |
| framerate | INT | 300–500 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |