NDI input
NDI input properties for Script Engine. Receives a live NDI (Network Device Interface) video and audio stream from another NDI source on the local network — a camera, encoder, switcher, or another Composer instance. NDI is a widely used IP-based protocol for low-latency video transport, designed by NewTek and now maintained by Vizrt. Composer automatically discovers all NDI sources visible on the network so they can be selected from a drop-down. Includes tally signalling back to the upstream source, automatic reconnect, a choice between freezing the last frame and black output when the input stops receiving, and bandwidth/quality presets. Free utilities for testing and monitoring NDI streams (Test Pattern Generator, Studio Monitor, Webcam Input, Scan Converter, etc.) are available in NDI Tools: https://ndi.video/tools/
| Property | Type | Access | Description |
|---|---|---|---|
ShowAdvancedOptions |
bool |
get/set |
Show or hide the input's advanced settings in the editor UI. [default=false]. |
AvailableSources |
Source |
get/set |
Picker for NDI sources currently advertised on the local network. Updates automatically as sources come and go. Selecting one populates SelectedSource with the source's full name. Useful for choosing between multiple available feeds in the editor — scripts that drive the input headlessly typically set SelectedSource directly. |
SelectedSource |
string |
get/set |
Full name of the NDI source the input is configured to receive. In NDI's standard MACHINE-NAME (Stream Name) format. Set this from a script to switch to a different NDI source — the input will connect on the next start, or immediately if already running and AutoReconnect is enabled. Required before StartCommand will run. |
PlaybackState |
PlaybackState |
get |
Current playback state of the NDI receiver (read-only). Reflects whether the receiver is Stopped, Starting, Running, or in an error state. Driven indirectly by StartCommand and StopCommand. Read this from a script to decide whether the stream is live; it also drives the running indicator and the enabled state of the Start/Stop buttons. |
StartCommand |
Command |
get |
Start receiving the selected NDI source. |
StopCommand |
Command |
get |
Stop receiving the NDI source. |
TallyProgram |
bool |
get/set |
Whether the upstream NDI source is told it's on the Program (on-air) output. [default=false]. When true, this input notifies the source that its feed is currently live — typically causing a red tally light on the camera or encoder. Set from a script driving a switcher workflow so the talent / operator knows which camera is live. |
TallyPreview |
bool |
get/set |
Whether the upstream NDI source is told it's on the Preview (next) output. [default=false]. When true, this input notifies the source that its feed is queued to go live — typically causing a green tally light on the camera or encoder. |
AutoReconnect |
bool |
get/set |
Whether the input automatically reconnects when the source disappears. [default=true]. When true, a lost source leaves the input in Restarting rather than stopping it: it waits for the configured source to reappear on the network and resumes receiving without manual intervention. When false, the input stops. Useful when the upstream camera or encoder may briefly drop off the network during a production. |
IgnoreHostNameOnReconnect |
bool |
get/set |
Whether reconnect matches by stream name only, ignoring the host machine name. [default=true]. NDI sources are normally identified by MACHINE-NAME (Stream Name). With this on, the input reconnects to a stream with the same name even if it now comes from a different machine — handy when a source is moved between encoders or workstations. Disable for strict reconnects that require the exact same machine. |
LostConnectionSeverityError |
bool |
get/set |
Whether a lost connection is logged as an error or as a warning. [default=true (error)]. When true, a dropped NDI source produces an error-level log entry — useful in productions where a missing feed is critical. Disable to log it as a softer warning when the source is expected to come and go. |
FreezeFrameOptions |
FreezeFrameOptions |
get/set |
What the input shows once it is no longer receiving. [default=Forever]. Applies whenever the input is not running: after the source is lost, while it waits to reconnect, and after it is stopped. Forever keeps the last received frame on screen until the input receives again. Never switches to black output at once, and the timed options hold the last frame for that long first. Audio is silenced at once regardless of this setting. |
PreferredBandwidth |
NDIlib.recv_bandwidth_e |
get/set |
Quality / bandwidth trade-off when receiving the stream. [default=highest]. Highest requests the full-quality stream from the source. Lowest requests a low-bitrate thumbnail-style stream that's cheap to receive and decode — useful for monitoring many sources at once or running on constrained networks. The available levels depend on what the source publishes. |
NdiBufferFrames |
int |
get/set |
How many frames to hold in reserve before rendering them. [default=2]. The sending device and this machine run on separate clocks, so their frame rates are never exactly equal. This reserve gives the input room to absorb that difference and the network's jitter, spending it as a single repeated or dropped frame now and then instead of an unpredictable stutter. Each frame of reserve adds one frame of latency - about 33 ms in a 29.97 project, 20 ms at 50 fps. Audio is held to the same reserve, so there is no fixed offset between picture and sound to compensate for at any setting. The two devices' audio clocks still run at slightly different speeds, as independent clocks do, which would slowly pull sound and picture apart over a long show; the input measures the difference and resamples the incoming audio to match this machine, which is inaudible and drops nothing. AudioDriftPpm reports what it measured. 2 suits almost every setup. Raise it to 3 for a busy or wireless network where frames arrive unevenly. Set it to 0 for the lowest latency the input can achieve, at the cost of uncorrected repeated and dropped frames whenever the two clocks disagree, and of the audio retiming, which needs a reserve to measure against - only worth it when latency matters more than smoothness. |
NumberOfAudioChannels |
AudioNumberOfChannels |
get/set |
Number of audio channels to bring in from the NDI source. [default=Two (Stereo)]. Two takes the first two channels of the incoming stream as a stereo pair. Eight brings in up to eight discrete, independent audio channels. If the source sends fewer channels than selected, the missing channels are silent; if it sends more, the extra channels are ignored. The channel count actually detected on the wire is reported by ReceivedAudioChannels. |
ComponentLog |
ComponentLog |
get |
Recent log lines from the input — connect, disconnect, reconnect, and error events (read-only). A short history of the most recent NDI events, useful for diagnosing why a source disappeared, why a reconnect attempt failed, or why the receiver couldn't start. |
Width |
int |
get |
Width of the video frames currently being received, in pixels (read-only). |
Height |
int |
get |
Height of the video frames currently being received, in pixels (read-only). |
LastRunningSourceName |
string |
get |
Name of the NDI source the input most recently received frames from (read-only). Survives a disconnect, so it shows what was last working even when the source has dropped off the network. Used internally as the target for automatic reconnect. |
FourCC |
AVPixelFormat |
get |
Pixel format of the incoming video frames (read-only, debug). Reflects the colour format the upstream NDI source is sending — typically a YUV variant such as UYVY. Useful for diagnostics when the colour or chroma looks unexpected. |
SourceFrameRate |
string |
get |
Frame rate the NDI source says it is sending, for example "29.97 (30000/1001)" (read-only). This is the rate declared in the stream, not a measurement - compare it with MeasuredFrameRate to see whether the source actually keeps to it. |
MeasuredFrameRate |
string |
get |
Frame rate measured from actual frame arrivals (read-only). Blank until enough frames have arrived to measure. A source that declares 29.97 but reports 30.00 here is mislabelled, and will cost a dropped frame roughly every 33 seconds; the difference is only 0.1%, so read the decimals. |
NumDriftCorrections |
long |
get |
Number of times the input has repeated or dropped a single frame to keep the buffered frames on target (read-only, debug). A slow, steady climb is normal and is the correction doing its job. A fast climb means the source and project frame rates genuinely disagree - check MeasuredFrameRate against the project frame rate. |
MeasuredFps |
double |
get |
Measured arrival rate in frames per second, as a number (read-only, debug). 0 until enough frames have arrived to measure. The numeric companion to MeasuredFrameRate, for metrics and scripts. |
RateDeviationPpm |
double |
get |
How far the measured arrival rate is from the project frame rate, in parts per million (read-only, debug). A few ppm is ordinary clock drift between two machines. Around 1000 ppm means the source is mislabelled — sending 30.000 while declaring 29.97, or the reverse — and will cost a repeated or dropped frame roughly every 33 seconds. |
ArrivalJitterMs |
double |
get |
How unevenly frames are arriving, in milliseconds (read-only, debug). Near zero on a quiet wired network; several milliseconds on a congested or wireless path. Independent of RateDeviationPpm — a source can be exactly on rate and still arrive unevenly, which is what the buffered frames absorb. |
NumRecycleDrops |
long |
get |
Frames discarded at the receiver because the input's queue grew close to the size of its frame ring (read-only, debug). Should always be zero. A non-zero value means the rest of the pipeline stalled long enough that incoming frames had to be dropped to avoid overwriting a frame still in use — look at overall compute time rather than at the NDI source. |
NumReceivedVideoFrames |
long |
get |
Total number of video frames received from the source since the receiver started (read-only, debug). Should grow steadily at the source's frame rate during healthy reception. A counter that stops moving while PlaybackState is Running indicates the source has gone silent or the network path has stalled. |
NumReceivedAudioFrames |
long |
get |
Total number of audio frames received from the source since the receiver started (read-only, debug). |
ReceivedAudioChannels |
int |
get |
Number of audio channels detected in the incoming NDI stream (read-only, debug). This is what the source is actually sending on the wire, which may differ from the configured NumberOfAudioChannels (channels beyond the configured count are ignored, and any configured-but-missing channels are silent). 0 until the first audio frame arrives. |
VideoQueueSize |
int |
get |
Number of video frames currently buffered in the input, waiting to be rendered (read-only, debug). Should sit close to zero during steady reception. A growing queue means the rest of the pipeline is consuming frames more slowly than the network is delivering them. |
AudioQueueSizeMs |
int |
get |
Amount of audio held in reserve by the input, in milliseconds (read-only, debug). Sampled once per frame, straight after that frame's audio is consumed, so it reads as the standing reserve rather than as whatever happened to have just arrived. Settles at NdiBufferFrames frames' worth — about 67 ms at the default of 2 in a 29.97 project — because audio is held back by the same reserve as the picture, so the two stay together. Reading high means audio is arriving faster than the project clock consumes it; reading low means a dropout, or the sender's audio clock running slow, has eaten into the reserve. Either way the input corrects itself — by dropping a packet or by refilling — so a value that wanders and returns is normal, and one that sits wrong is not. |
AudioDriftPpm |
int |
get |
How far the source's audio clock is from this machine's, in parts per million (read-only, debug). The input measures this from its own audio queue and resamples by the same amount in the opposite direction, so sound and picture stay together instead of drifting apart over a show. Positive means the source is sending audio slightly faster than this machine plays it back; negative, slightly slower. Two nominally identical 48 kHz devices are never exactly identical, so a reading of a few tens of ppm between two machines is entirely normal and needs no action. It takes several minutes to settle after a connection, and reads 0 until it has. A reading pinned near 1000 either way means the source is further out than resampling can correct - a sample rate set wrongly at the sending device rather than an ordinary clock difference - and the input falls back to dropping or inserting audio, which is audible. |
SdkTotalVideoFrames |
long |
get |
Total video frames the NDI receiver has accepted from the network, before Composer processes them (read-only, debug). Compare against NumReceivedVideoFrames to see whether frames are being dropped between the network receiver and Composer's pipeline. |
SdkTotalAudioFrames |
long |
get |
Total audio frames the NDI receiver has accepted from the network, before Composer processes them (read-only, debug). Counterpart to SdkTotalVideoFrames. |
SdkDroppedVideoFrames |
long |
get |
Total video frames dropped at the network receiver before reaching Composer (read-only, debug). Should stay at 0 during healthy reception. A rising count means the receive thread can't keep up with the incoming stream — typically a sign of CPU pressure or network jitter. |
SdkDroppedAudioFrames |
long |
get |
Total audio frames dropped at the network receiver before reaching Composer (read-only, debug). Should stay at 0 during healthy reception. |
SdkDroppedMetadataFrames |
long |
get |
Total metadata frames dropped at the network receiver (read-only, debug). NDI metadata frames carry tally, custom strings, and other side-channel data. A non-zero value usually doesn't affect video/audio quality but suggests upstream pressure. |
SdkVideoQueueDepth |
int |
get |
Number of video frames currently buffered inside the network receiver, upstream of Composer (read-only, debug). Sits in front of VideoQueueSize. Should be near zero — sustained high values mean Composer isn't draining frames fast enough and back-pressure is building up. |
SdkAudioQueueDepth |
int |
get |
Number of audio frames currently buffered inside the network receiver, upstream of Composer (read-only, debug). Sits in front of AudioQueueSizeMs. |
SdkMetadataQueueDepth |
int |
get |
Number of metadata frames currently buffered inside the network receiver (read-only, debug). |
Inherits from: AbstractInput, AbstractAudioProcessing, AbstractAudioMetering, NamedModel.
See also: NDI input in Inputs — user-facing introduction, screenshots, and section summaries.