Skip to content
Martin Pulec edited this page Oct 14, 2024 · 5 revisions

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

Table of Contents

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, see extra_ips)

(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 (in form "MACHINE (source)") 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:name=uv"               # source can be specified without MACHINE
uv -t "ndi:name=HD10"             # vice versa - MACHINE without explicit service
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: 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 DNS-SD is not operable, see extra_ips below.)

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

extra_ips

If service discovery (DNS-SD) isn't working or is filtered, you'd need to use a parameter :extra_ips to explicitly specify the sender IP address(es) to be probed, examples:

uv -t ndi:extra_ips=10.0.1.24:help           # server listing running on 10.0.1.24
uv -t ndi:extra_ips=10.0.1.24,10.0.1.25:help # multiple addresses can be specified as well
uv -t ndi:extra_ips=10.0.1.24:name=uv        # capture NDI sender named "uv" send with 10.0.1.24

Note: If DNS-SD is required, in Linux Avahi is required to be run for NDI DNS-SD to work.

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 [...]
      

Footnotes

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

Clone this wiki locally