August 30, 2021

Generate NDI stream from local files via Server Playlist

We want to tell you about Server Playlist feature, which lets you create live streams from the video or audio files on your storage. This feature gives vigorous possibilities to your live streaming setup: from simply running a video in a loop as a backup stream to arranging a precise schedule for programs to run at a specific time. Multiplied by Nimble’s and Live Transcoder processing power, you can have any desired live stream egress ranging from re-publishing for any major streaming provider via RTMP or have a precise NDI stream to your equipment. Any supported output protocol can be used, including cutting edge SLDP, SRT and RIST.

As you finish reading this tutorial, you will be able to stream files from a hard disk drive as NDI streams and learn the basics of playlist editing for Nimble Streamer.

For our use case, we will just describe a couple of files in a playlist and loop them endlessly to a live stream, next we set up the Transcoder to make NDI output.


Step 1: Check Prerequisites

First, make sure you have the latest version of Nimble Streamer. You can install it using this instruction or upgrade it.

Second, make also sure that the Transcoder package is installed as described on Transcoder installation page.

Third, you need to have an active Live Transcoder license with respective subscription. Check the license at your account Settings menu under Transcoder licenses tab.

Also, we assume that all your video files are encoded with H.264 and have the same resolution and stereo AAC audio stream, so no additional encoding will be discussed.


Step 2: Make Nimble to know your playlists

Conception starts with a Playlist that uses a JSON syntax to describe files for making a live stream. JSON is powerful yet clear and various online tools can be used to validate it against errors.

To make Nimble know the playlist is engaged in work, specify a location of your playlist by adding the server_playlist_sync_url option to nimble.conf. Location can be either a local path on a hard disk drive with Nimble or HTTP(s) URL. 

Add the next string to /etc/nimble/nimble.conf file:

server_playlist_sync_url=/var/nimble/playlists/basic_playlist.json

and restart Nimble to apply changes. We will fill basic_playlist.json a moment later.

The playlist will be reloaded every 10 seconds, so you can make dynamic changes via some custom scripting and these changes will be accepted by Nimble. If you want any other update time interval, you may set it via the server_playlist_sync_interval option in nimble.conf or via the playlist itself.


Step 3: Write a playlist and get your live stream


The playlist’s grammar is based on key sections: Tasks, Blocks and Streams - which can have their own properties, e.g. Start time or Duration.

Now, copy this text to basic_playlist.json file using your preferred console editor:

{
  "Tasks": [
    {
      "Stream": "live/from_playlist",
      "Blocks": [
        {
          "Id":"1",
   "MaxIterations":0,
           "Streams" : [
            {"Type": "vod", "Source": "/var/nimble/mp4/bbb_1080p_h264_aac.mp4"},
            {"Type": "vod", "Source": "/var/nimble/mp4/TOS-1080p_aac.mp4"}
          ]
        }
      ]
    }
  ]
}

A few seconds later you will notice stream live/from_playlist appearing at Live Streams / Outgoing Live streams of your server.



This very basic example perfectly illustrates the mandatory fields and values of a playlist. It contains one Tasks, one Block, and two Stream sections.

Tasks object represents an array of alive streams, which must have a name set by a Stream field as application/name. Tasks also hold an array of Blocks that can be started at different times. It is achieved via Start property, but we are not discussing it for now in this tutorial. Each block must have a unique Id and a number of times to run. These repetitions are set by MaxIterations and each block runs only once by default. Setting MaxIterations to 0 means the infinite loop of a block.

Next comes the Streams array of objects which holds the full path and name of a file to play within the previously defined live stream. Source property is used for this. At the moment, Type property must have “vod” value, and this property is reserved for future improvements for mixing live streams with video files.

No more additional properties are needed for our simplified case but more details can be found at feature technical spec if needed.

Step 4: Turn Live Stream into NDI stream

Now, you see a live/from_playlist stream, so it can be processed via Transcoder to have NDI output.
Create a new Transcoder scenario and use live/from_playlist as Audio and Video Input.


As for Video and Audio output, click NDI radio button and name it from_playlist:




Click Save button and switch to a console to check available NDI streams with the nimble_ndi tool or any other NDI-supported software.





You did a great job by easily transforming your video files to an NDI stream using the Nimble Server Playlist feature and Live Transcoder.

We will continue to show more elegant scenarios and more complex playlists’ grammar in our later articles. Please feel free to share this article with anyone who may be interested in Nimble Streamer’s ability to playback files as a live stream.

Related documentation