Nodes/radiance/NDI Sender
ComfyUI Node

NDI Sender

Stream your ComfyUI render straight into OBS, Resolume or Nuke

By FXTD-Studios·Created 8 months ago·Updated about 18 hours ago· 246
NDI Sender
  • image
  • image
  • connected
◄stream_nameRadiance ComfyUI►
◄encodingNone (SDR)►
◄enable_streamingtrue►
◄frame_rate24►

NDI Sender pushes the frames coming out of your graph over the network as an NDI video source, so they show up like a capture card in OBS, Resolume, vMix, Nuke, or anything else with an NDI receiver. No export, no copy-paste, no watching a folder. You get to see generations land inside a broadcast or comp tool in real time, which is a different feeling from squinting at a preview thumbnail.

It's also the runt of this pack in one specific way: it's the node whose dependencies Radiance does not install and cannot install for you.

The install is the hard part

Get Radiance first, the usual way - ComfyUI Manager, search Radiance, install, restart, refresh. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt

Then the part the README doesn't shout about. Radiance's requirements.txt does not pull the NDI bindings; the node's own docstring says NDIlib "must be installed separately". Miss it and you get a console line and False on connected, nothing more:

python -m pip install ndi-python

Use ComfyUI's Python (Windows portable: python_embeded\python.exe). On top of that you need the NDI SDK runtime actually present on the machine - ndi-python is just the binding, and without the runtime no receiver will ever list your source. Installing NDI Tools is the quickest way to get the runtime onto both ends. Nothing errors loudly if you miss a step, which is why this node is the most likely one in the pack to make you think you wired it wrong.

What the node gives you

image is required and takes the whole batch, every frame in order. It goes out as 8-bit BGRA, so with the default encoding of None (SDR) your values need to be display-ready 0–1 already - HDR values just clip, quietly. stream_name is the source name receivers see, and changing it tears down and rebuilds the sender rather than renaming in place, so expect a blip. frame_rate is metadata only (default 24, range 1–120): it doesn't pace anything, so a slow graph streams slowly and correctly.

The encoding choices are the interesting ones. S-Log3 (HDR) and LogC4 (HDR) expect scene-linear input and apply the log curve before 8-bit quantisation, with no gamut change - so the receiving end must decode with the same curve. That's how you get a vaguely sane HDR-ish signal through an 8-bit pipe; log encoding is exactly the trick for that. If nobody downstream is going to decode it, leave it on None.

Two outputs: image is a straight passthrough so you can keep chaining, and connected is a boolean that's true only if a frame actually went out. Wire it into a logger or route it into something you'll look at - it's the cheapest health check this node offers. The node is an output node, so it always runs; the plumbing behind that (always-run nodes and backward caching) is in comfyui-node-plumbing.md.

Where people get burned

  • Wrong Python. ndi-python installed into your system Python while ComfyUI runs from its own environment is the classic failure. Import error, node returns connected: false.
  • Firewall. NDI is mDNS discovery plus a TCP/UDP stream. Windows Defender blocks it on first run happily. If the source shows up in one app but not another, that's your firewall, not Radiance.
  • Segmented networks. NDI discovery doesn't cross VLANs by default. Same machine or same subnet, or you're configuring access points.
  • Expecting HDR out. 8-bit is 8-bit. Log encoding preserves relationships; it doesn't get you a 16-bit pipe.

For a sanity check, put NDI Tools on the receiving machine and open Studio Monitor. If the source isn't in its list, your problem is upstream of whatever app you were troubleshooting.

CategoryFXTD STUDIOS/Radiance/Pipeline

Inputs (5)

NameTypeDefaultDescription
imageIMAGEFrames to stream, every frame of the batch in order. Sent as 8-bit BGRA, so with encoding None the values must already be display-ready 0-1.
stream_nameSTRINGRadiance ComfyUINDI source name shown to receivers. Changing it recreates the sender.
encodingCOMBONone (SDR)Curve applied before 8-bit quantisation. None sends values as-is (clipped to 0-1). S-Log3 and LogC4 expect scene-linear input and apply only the log curve (no gamut change), so the receiver must decode with the same curve.
enable_streamingBOOLEANtrueEnable real-time NDI streaming during generation. Requires NDI SDK installed.
frame_rateFLOAT241–120Frame rate written into NDI video frame metadata.

Outputs (2)

NameTypeDescription
imageIMAGEPass-through image (unchanged).
connectedBOOLEANTrue if NDI frame was sent successfully this call.