July 16, 2020

NDI support in Nimble Streamer

NDI® is a free protocol for video delivery over IP. It's widely adopted by industry professionals in a variety of products used in live production.

NDI is a technology which was implemented with these ideas in mind:
  • Live video is produced and processed by professional production teams in local networks prior to outer-world delivery.
  • Various solutions from various vendors are fully interoperable using the same protocol.
  • Network topology doesn't matter, making it easy to find and capture video streams.
  • Video source is abstracted from video destinations, it just sends out the data into the network.
  • The video content is moderately compressed with 10x factor down to 100 MBps making it easy to deliver over local networks.
  • It's a replacement for SDI technology.

1. Nimble NDI features overview


Softvelum Nimble Streamer software media server is used by a lot of customers from live production industry for efficient delivery of live streams among production sites and from production to the viewers using all general-purpose protocols like SRT, RTMP, MPEG-TS and others.

Now NDI is available in Nimble Streamer to provide even more capabilities for live delivery.

Receive NDI signal as input. Nimble gets the stream and decodes it for further usage. You can do various further processing:
  • get NDI from local network;
  • transform with Live Transcoder: re-sizing, re-sampling etc
  • encode into H.264/AVC, H.265/HEVC, VP8, VP9 with supported encoder libraries;
  • re-package into other protocols for further delivery: SRT, HLS, MPEG-DASH, RTMP etc;
  • record and play with DVR;
  • handle heavy duty when serving streams to multiple viewers.
Send NDI signal as output. Nimble produces an NDI stream:
  • take any content input via supported protocols like SRT or RTMP;
  • transcode and send the content via NDI into local network.
So Nimble Streamer is not a production-level mixing and editing tool but rather is a "bridge" between live production environments and global networks.

NDI monitoring tool. Along with implementing NDI in Nimble Streamer, we've made a console tool for diagnosing NDI streams. This helped us test and debug our solution, so we are sure it also will help our customers debugging their setup of Nimble and NDI streams in general.

Now let's look at NDI setup and usage in our products.

2. Installation


Handling NDI requires Live Transcoder for Nimble Streamer because the streams must be either decoded from or encoded to NDI format.

So before moving forward, you need to install the following products of Softvelum and make subscription where it's required.
  1. Sign up for WMSPanel account.
  2. Install Nimble Streamer on a proper server and register it in WMSPanel. If you'd like to install SRT package, please also refer to proper instructions.
  3. Subscribe for WMSPanel account, the price starts from 30 USD per month.
  4. Create Live Transcoder license and subscribe. This short video shows the process. It costs 50 USD per month per server.
  5. Install Live Transcoder package and register the license on the server with Nimble Streamer instance.
Once you're finished, you will have a paid WMSPanel account, a running instance of Nimble Streamer with Live Transcoder package, ready to transcode streams. For more details about Live Transcoder usage please refer to documentation reference and our video tutorials.

3. Set up NDI input


To get the NDI stream in, you need to create a Transcoder scenario. In your WMSPanel account, click on Transcoders menu to open scenarios page, then click on Create new scenario button. You'll be redirected into an empty scenario.

Now drag a blue video source element, then select NDI option.


In NDI name field you need to enter your source NDI stream. It can have both host name and stream name, but you may use just stream name. In our example the NDI source is "SOURCE HOST (stream)" which means host ("SOURCE HOST") and stream name ("stream"). Please also check NDI tool described in section 5, its output provides NDI source names which you can use for your input.

Now you can create the video output element, just drag the green element and keep the output type as "Stream".


Application and stream name define the naming of your output stream for further reuse. You may leave other values by default if you find them appropriate or define other parameters and values, like different codec or encoder library. Once you save encoder settings, you need to link decoder and encoder elements, just drag an arrow from the decoder to the encoder.

You may also put any filters between decoder and encoder in case you need to additionally transform the content, like to split the stream and make various renditions.

Once you're done with video pipe, you need to do the same for audio part of your input content. Drag audio source and select NDI stream as input. You need to define the same input stream name as you did for video.


Now add audio encoder element.


Here you specify the same output app and stream name, then you may choose codec and encoder. Once you save settings. You need to connect decoder and encoder, unless you want to apply some filters like volume changer.


That's it. Now once you save scenario, it will sync up with Nimble Streamer within several seconds and your server instance will start receiving NDI stream to process it and generate the output stream.

You can now handle this stream according to your use case, like re-publish it via SRT or RTMP. The SRT publication setup is described in this article and RTMP re-publishing described here.
You can also try playback to make sure the stream is available. The example of HLS output stream URL will be http://yourhost/live/output/playlist.m3u8 for default settings.

In addition to the aforementioned "direct output" transcoding pipe, you can add more filters and generate multiple outputs. Check this scenario example.


It has video split filter after NDI decoder, then it makes direct output with original rendition, scales down to 480p and down to 240p, and encodes all 3 outputs. The decoded audio is also split into 3 output streams.
You can also check other examples of transcoder workflow in our YouTube playlist.

4. Set up NDI output


Setting NDI output is somewhat similar to input setup process.

First, make your live stream input available for further processing, read our documentation for details:
You can check other protocols and use cases on live streaming digest page.

Once you have your input stream ready and tested, you can proceed with NDI setup.

Go to your transcoder setup and create a new scenario.

Video input will have your processed incoming stream application and stream name. You may choose another decoder if you want as well.


Drag and drop encoder element and select NDI as output option.


Now specify output stream name, this is how it will be recognized by other NDI recipients in this network. You may also define this stream's key frame alignment.

Save this and connect video input and output. 


Now add audio input having the same stream app and stream name.


Then add encoder element with NDI selected in it.


The stream name needs to be the same as you specified in video output. When you save audio output, connect input and output.


When you save this scenario, it will be synced within several seconds.

Once the scenario settings are synced, your Nimble Streamer will start sending NDI output with the content defined by our scenario.

Just like you saw in section 3, you may create more complex scenarios.


In this example the audio in encoded without changes while the video is scaled down and then custom "fps" filter is applied to change the framerate.

5. NDI monitoring tool usage


In addition to implementing NDI in Nimble Streamer and Live Transcoder we've created a tool which helped us debugging NDI workflow. It's a command line utility called "nimble_ndi". It works if Nimble Streamer and Nimble Live Transcoder are installed with no need for registering Nimble instance or Transcoder license.

It provides two functions: getting the list of available streams and getting full details about a particular stream.

5.1 Get active NDI streams list

Log into the server where Nimble Streamer is installed and run this command:
nimble_ndi
It will show the list of streams as "host name (stream name)" with IP and port, e.g.

camera1 (stream)                  10.208.14.1:6961
camera2 (stream)                  10.208.14.2:6961
producer (main)                   10.208.15.1:6961
producer (secondary)              10.208.15.1:6962
OSA-VM-WIN10 (vMix - Output 1)    192.168.0.201:5961
OSA-VM-WIN10 (vMix - Output 2)    192.168.0.201:5962
That information can be used as a reference for NDI setup in previous sections. For example, having this output, you can use host and stream ("OSA-VM-WIN10 (vMix - Output 1)") for your NDI input setting.

5.2 Get NDI stream details

If you want to have full info on the frames of specific stream, run this command:
nimble_ndi --show-frames="host (stream)"
E.g.
nimble_ndi --show-frames="camera1 (stream)"
It will produce the output like this:

video: timecode=107080000 timestamp=15943425579304024 av_sync_ms=0 fps=24/1
audio: timecode=107310000 timestamp=15943425579707145 av_sync_ms=40 no_samples=1024 sample_rate=48000
audio: timecode=107520000 timestamp=15943425579708666 av_sync_ms=40 no_samples=1024 sample_rate=48000
video: timecode=107500000 timestamp=15943425579712332 av_sync_ms=0 fps=24/1
audio: timecode=107730000 timestamp=15943425580115564 av_sync_ms=40 no_samples=1024 sample_rate=48000
audio: timecode=107950000 timestamp=15943425580117047 av_sync_ms=40 no_samples=1024 sample_rate=48000

Each line represents a frame of either video or audio with these parameters:
  • timecode: it's optional but Nimble generates it for he tools which need it;
  • timestamp: time which NDI library provides us with;
  • av_sync_ms: a delta from previous frame of either video or audio, in milliseconds;
  • no_samples: number of audio samples, it's for audio frames only;
  • sample_rate: it's audio frames only;
  • fps: for video frames only.
That allows easily tracking NDI streams in your network.

6. Using NDI Discovery Server


Nimble Streamer can work with NDI Discovery Server and if you want Nimble to work with it, you need to specify it in ndi-config.v1.json by its address.
You can find this file at these locations:
  • On Windows it's %PROGRAMDATA%\NewTek\NDI\ndi-config.v1.json
  • On Linux it's $HOME/.newtek/ndi-config.v1.json
In order to specify NDI Discovery Server, you need to open ndi-config.v1.json, find "networks" section and add "discovery": "discovery.server.I.P" parameter. Here, discovery.server.I.P is the address of a host where NDI Discovery Server is working. For example if you have it working on 192.168.0.253 then your config will have this section:
"networks": {
      "ips": "",
      "discovery": "192.168.0.253"
},

If you don't want to edit these files manually, use respective utils such as NDI Access Manager for Windows or Sienna Access Manager for Linux.

Notice that on Linux the NDI config files should be placed in the home directory of the user which Nimble is running as. For example, if Nimble is running as root, then the file must be located at /root/.newtek/ndi-config.v1.json

7. Video step-by-step tutorial


We've made a video showing the setup process, take a look at it.


Also, watch:

8. SEI metadata NTP sync-up

Nimble Streamer supports SEI metadata processing for synchronizing output NDI streams. Using this feature you can take multiple input streams and line them up to make in sync with each other which is important when you need to show the same event from different video sources.
This feature also allows forwarding SEI meta further.

9. Troubleshooting


Q: I setup NDI Discovery Server IP by the 3rd party software and nimble_ndi shows a list of NDI streams, but streams are not available for the Transcoder.

Make sure that the .newtek directory with the *.json config files is located at the home folder of a user which Nimble is running as.
In the latest NDI library releases NDI config files are also moved from .newtek to .ndi directory. Please copy ndi-config.v1.json file to the .ndi directory if NDI streams provided via Discovery Server are still not available. The full path to the config for the root user is /root/.ndi/ndi-config.v1.json


Q: I see stutter and dropped frames in NDI output

First, try to add the following line into /etc/nimble/nimble.conf and restart Nimble:
ndi_sender_cbr_enabled = true
If this doesn't help, switch from default RUDP mode to Single TCP for sending and receiving.


Q: I'd like to have NDI|HX® support

At the moment NDI|HX® support is not available on Linux.
On Windows it's available by default, no additional activities are needed.
NDI|HX® is intended to be used in mobile applications and uses H264 or HEVC. You can have NDI HX as a source, but Nimble doesn't use HX compression for NDI output.

Q: I have other problem

If you have any problems with NDI, check that your host is configured to have respective ports opened. Here's an example of UFW rules for Ubuntu host with properly configures ports.

> sudo ufw status
Status: active
To                      Action  From
--                      ------  ----
6960                    ALLOW    192.168.0.0/24
6961                    ALLOW    192.168.0.0/24
6962                    ALLOW    192.168.0.0/24
6963                    ALLOW    192.168.0.0/24
6964                    ALLOW    192.168.0.0/24
6965                    ALLOW    192.168.0.0/24
6966                    ALLOW    192.168.0.0/24

If you have other issues with NDI configuration, please refer to General NDI Troubleshooting page from NewTek knowledge base.



Contact us if you have any questions regarding NDI support in Nimble Streamer.

Follow us in social media to get updates about our new features and products: YouTubeTwitterFacebookLinkedInRedditTelegram

NDI® is a registered trademark of NewTek, Inc.

Related documentation

No comments:

Post a Comment

If you face any specific issue or want to ask some question to our team,
PLEASE USE OUR HELPDESK

This will give much faster and precise response.
Thank you.

Note: Only a member of this blog may post a comment.