Skip to content

Syphon, Spout and NDI

Martin Pulec edited this page Oct 14, 2024 · 14 revisions

Table of Contents

NDI

Since UltraGrid version 1.7.2, binary builds include NDI®. NDI library is dynamically loaded, therefore you need to have the NDI runtime installed, for macOS and Windows the simplest way is to get it together with NDI tools

Firewall

If a firewall is filtering the traffic, you'll need to allow the traffic.

You'd need to allow following recv ports (assuming that outgoing traffic is not filtered) for UltraGrid to work:

  • Sender (NDI display) - TCP/5960-6000
  • Receiver (NDI capture) - UDP/5960-6000
  • (optional) for discovery (both sides) - UDP/5353 (the absence can be avoided by using extra_ips= vidcap parameters)

(The range for port numbers from 5960 is somewhat arbitrary, just the single port 5960 or few ports may be sufficient for single stream but 40 port above was chosen as a marging of safety.)

(Complete listing of ports used by NDI can be found here.)

Capture

Basic usage is simply:

uv -t ndi -c <compression> [-s embedded --audio-codec <ac>] <receiver>

The above command picks first source found on a local network and sends the data to the receiver.

You may also specify name and/or URL (either in form ip_addr or ip_addr:port, exact URL format may change with future NDI releases) to capture from, eg.:

uv -t "ndi:name=HD10 (DeckLink 4K Extreme)" -c JPEG ultragrid-receiver.example.net
uv -t ndi:url=192.0.2.15 -c JPEG ultragrid-receiver.example.net
uv -t ndi:url=192.0.2.15:5961 -c JPEG ultragrid-receiver.example.net

(Note that the apostrophes in the first command are because the resource name contains spaces.)

You can also let UltraGrid discover available sources on a local network:

uv -t ndi:help

(The list doesn't need to be complete - UltraGrid waits only limited amount of time to response.)

If you want to capture including alpha channel, select a mode that captures RGBA (alpha is currently stripped from YCbCr formats):

uv -t ndi:color=0          # BGRX_BGRA; 1 (UYVY_BGRA), 2 (RGBX_RGBA), 3 (UYVY_RGBA) are also ok; default is however 100 (best)

Note: Very few of compressions support alpha-channel compression, one exception is GPUJPEG.

Audio

NDI video capture is capable of capturing video alongside with audio as usual:

uv -t ndi -s embedded -c libavcodec --audio-codec OPUS ultragrid-receiver.example.net

If the NDI source is audio only, it is possible to capture the audio with the NDI vidcap module even in the absence of video signal:

uv -t ndi:name=mic -s embedded --audio-codec OPUS ultragrid-receiver.example.net   # if "mic" is audio only NDI source, no video is sent

Display

Basic usage is quite usual:

uv -d ndi[:name=<n>] [-r embedded] <sender>

Analogically to the capture, the NDI display can also playback the audio without a video.

NDI Linux installation

This step is required to add run-time dependency, for compilation see here.

Installation steps:

  1. download and extract the installer:

    tar xaf Install_NDI_SDK_v6_Linux.tar.gz
    
  2. install the NDI

    ./Install_NDI_SDK_v6_Linux.sh
    
  3. this creates directory "NDI SDK for Linux" directory in current path

  4. make the contained library libndi.so.6 visible to UltraGrid, this can be done in two ways:

    • copy (as root) libraries to /usr/local/lib:

      cp -a NDI\ SDK\ for\ Linux/lib/x86_64-linux-gnu/lib* /usr/local/lib/
      cp -a NDI\ SDK\ for\ Linux/include/* /usr/local/include/      # (headers optional, can be omitted)
      
    • or export path to the library before running UG (or to system environment):

      export NDI_RUNTIME_DIR_V6=<NDI_SDK_root>/lib/x86_64-linux-gnu/lib/
      ./UltraGrid*AppImage [...]
      

Spout

Currently there is only Spout server support.

Server

Use following command to create Spout sender:

uv -d gl:spout  # or
uv -d spout     # wraps GL display, equivalent to `-d gl:spout:hide_window`

Similarly to Syphon, you can specify server name:

uv -d gl:spout=<name>

Client

You can use Spout capturer by running:

uv -t spout[:name=<srv_name>][:fps=<fps>]

Syphon

Server

Syphon support is added to UltraGrid OpenGL display. You can run it with following command:

uv -d gl:syphon # or 
uv -d syphon    # wraps GL display, equivalent to `-d gl:syphon:hide_window`

Alternatively, you can specify server name (instead of default UltraGrid):

uv -d gl:syphon=<another_name>

Client

Syphon clinet can be simply run as a normal capturer:

uv -t syphon -c <compression> <receiver_addr>

Footnotes

[1] NDI® is a registered trademark of NewTek, Inc.
[2] NDI® is available at http://ndi.tv/

Clone this wiki locally