October 31, 2015

The State of Streaming Protocols - October 2015

WMSPanel team continues analyzing the state of streaming protocols.

The metrics calculations are based on nearly 2 billion views. The stats are collected from 2100+ media servers (including our Nimble StreamerWowza and Flussonic).

HLS share still grows and it's 74% now.

The State of Streaming Protocols - October 2015.

You can compare that to September stats below.

October 28, 2015

Video recording (DVR) in Nimble Streamer

Streams recording is one of the essential use cases for live streaming. It's important to be able to view stream after the transmission is over, or switch between parts of the show during the transmission.

Nimble Streamer has an excellent capabilities for handling live streams and transmuxing them from RTSP, RTMP, SRT, MPEG-TS, Icecast and SHOUTcast to any supported format like HLS, MPEG-DASH, RTMP, SRT, SLDP, RTSP and MPEG-TS. So the next step we always wanted to make is to create streams recording, also known as Digital Video Recording, or DVR.

Nimble Streamer DVR current features:
For HLS DVR playback you may have your content be packaged in both MPEG2TS and fragmented MP4 (fMP4) containers simultaneously - see the last section of this article for details.

Nimble Streamer DVR allows recording and playing both HEVC (H.265) and AVC (H.264) video content with AAC, MP3 and AC3 audio. Other codecs are not supported.

Nimble Streamer also provides DRM feature set for Widevine, Playready and FairPlay content encryption. When a viewer connects to a stream within an application protected by the DRM, its output will be encrypted with respective DRM engine.

Let's see how you can start using Nimble Streamer DVR in your environment.

Take a look at this video tutorial to get familiar with the most useful features.

Read documentation below for more details and full description of available options.

1. Streaming scenarios setup

This article assumes that you've already installed Nimble Streamer. If not, then use this installation instruction to get an instance on your server or desktop. If you have old version of Nimble, then just easily upgrade it.

Check the following articles as examples of setup:

With all these scenarios being up and running you can start setting up DVR.

2. DVR setup

Go to "Nimble Streamer" -> "Live streams settings" menu to open the setup page. Then click on "DVR" tab to open its settings.

DVR settings tab
Here you can see list of setting. In our example we've set up something, otherwise you would see an empty list. Click on "Add DVR setting" button to start the setup.

DVR setup dialog

Here are the parameters you can define.

  • Application is the name of the application which is used during the live streaming. Whatever application name you use in live stream, it must be specified here. 
  • Stream name can be used to recording of some specific stream. If it's not specified, all streams will be recorded, each one separately within recording path. 
  • Recording path is the location of the storage which you'd like to use. It needs to be a file system location. If you don't specify it, the default cache path of Nimble Streamer will be used. 
  • Loop recording duration is the maximum time window that keeps the content. E.g. if you set this to 1 hour, start streaming and your stream lasts for 1 hour and 10 minutes, then first 10 minutes of recording will be erased to keep the last 10 minutes. This duration mostly depends on your storage capacity. If you don't specify the duration then Nimble will keep recording until it has space at the specified location.
  • Maximum size works the same way as Loop recording duration, but it uses archive size as a trigger to start erasing old recordings. It's specified in megabytes.
  • Min free space enables DVR cleanup when minimum free space on DVR storage has reached the specified limit. E.g. with 90% of available space, Nimble will cleanup archive(s) maintaining recorded duration to avoid filling the storage (same cleanup method used as for "Loop recording duration"/"Maximum size" criteria). It works only for "being recorded" DVR archives having active live stream.
  • Clean up after enables automatic deletion of "too old" content, e.g. older than 24/48/etc hours even for DVR archives that do not have "live stream" running. Nimble will periodically check if there is "too old" recording based on number of hours set and then delete it.
  • Read-only mode allows using pre-recorded archives as well as performing scheduled recording. This mode allows pausing the recording process while the archive will be still accessible for playback. Read this article for more details on operating DVR this way.
In the example above we used Larix Broadcaster mobile application to push RTSP stream into demo Nimble instance and we've set up its recording accordingly. We specified only the application name because it was up to the streamer to define a stream name.

Advanced settings include the following parameters.
  • Segment duration is the duration of the chunk being used for media storage. 
  • Thread name and priority are used for splitting recording process among several threads.
Other options include Drop invalid segments, Keep protocol timestamps and Check segment sizes on load, please read Handling timing errors article to get full details about them.

Keep SCTE-35 markers option allows recording SCTE-35 markers from incoming stream into DVR. Once HLS DVR is played, those markers are streamed along with the content.

Keep ID3 metadata allows recording ID3 tags into DVR if your source has them, whether it's Icecast or pulled HLS.

Adding from streams list

You may also easily set up recording from existing incoming and outgoing streams lists. Being in the respective lists, just click on recording button to be redirected to previously described DVR setup dialog.

ABR HLS streams

To have a DVR for ABR HLS stream, just define DVR for single bitrate streams as usual and then create an ABR stream based on those streams. After that you'll be able to play that stream as other DVR streams, check the following section for playback details.

3. DVR recording and playback

The recording process starts as soon as Nimble Streamer starts getting the incoming stream. Each stream is recorded into its own recording path. If only an application is defined then a sub-directory after stream name will be added. If the stream was specified then its path will be used.

Each recording session will be appended into stream location. So you can start, stop and resume incoming stream several times and Nimble Streamer will write the content as if it would be a single session. Obviously, the playback will be played as a single outgoing stream.

To view the existing DVR streams, go to "Nimble Streamer" -> "DVR streams" menu to open DVR streams list as shown below.

List of DVR streams.

As you can see we had 2 publishers, each having separate stream name. So every stream was recorded separately. For each one you can see its server and name, recording path and current recording size, total duration and some media parameters. You also have an option to remove un-used streams recordings as well.

Now for every stream, you can click on a question mark to open sample dialog.

DVR sample playback.
Here you can copy the outgoing DVR stream URL for further usage in your player or application. It also allows viewing the DVR stream in selected players to see what was actually recorded before giving the link outside.

Basically if you have a live stream name like
then your DVR stream URL will be
ABR live streams work the same way. For ABR stream name like
the DVR stream URL will be
You may use it in any HLS-capable players.


The same applies to MPEG-DASH except it doesn't support ABR. Your stream like
will be available as

fMP4 container for HLS

The HLS URLs described above will have their content packaged in MPEG2TS container. However you can use fMP4 container for DVR playback, you'll just need to use "fmp4" suffix like this:
Adding that suffix will create DVR stream with fMP4 container.

Both MPEG2TS and fMP4 DVR streams can be played simultaneously. So you can provide your users with playlist_dvr.m3u8 and playlist_fmp4_dvr.m3u8 URLs depending on their device type.

fMP4 container will work the same way as MPEG2TS for all DVR-related features like selecting range or time shift.

Removing DVR archives

Each recorded stream has its own archive. That archive is not mapped to a DVR setting so if you delete DVR setting from the DVR settings page, the archive files won't be deleted. Only the setting will disappear from the panel.

If you need to delete archives, you need to do it manually using DVR stream page. Notice that if you don't stop the DVR setting and will try to remove the archive, it will appear again because the setting will have the same destination for recording.
So in order to delete archive files, switch the stream to Read-only mode, and then delete files from DVR Streams page.
If you removed the DVR setting but kept the recorded streams archives, you may create the DVR setting again for the same stream. In this case Nimble will detect the old files on a hard drive and show it as one archive e.g. duration in the panel and on the timeline.

If you Pause DVR settings for the specific stream, you won't have its DVR streams shown on the DVR Streams page, as this is considered a stopped DVR setting, which makes Nimble 'forget' the DVR recorded stream until it is resumed.


Video/audio timing. Sometimes when MPEG-TS stream is used as a media source, it may have some glitches either in video or audio. This is caused by third-party encoders which set incorrect time stamps assigned to media fragments. Check timing errors handling article to learn more details about fixing this kind of issues.

Audio glitches. If you use HLS DVR output with MPEG-TS containers and have audio glitches or audio is missing, you need to enable interleaving compensation for the target application. Click on Nimble Streamer -> Live streams settings top menu, choose the application which you record your DVR for, then check Enable interleaving compensation option and set Min delay time must be set to "0".

MPEG-TS or HLS pull source. If you use pulled MPEG-TS or HLS as a source for your live stream, you need to make the following DVR setting adjustment. Go to DVR setup dialog for your DVR stream, click on Advanced settings... item and check Keep protocol timestamps check box. This will prevent possible issues with source timestamps.

DVR in SLDP HTML5 Player

HLS DVR streams can be added to SLDP HTML5 Player for rewinding low latency streams.


Please notice that you may also control DVR via API in order to automate your streaming infrastructure.

If you'd like to export DVR into MP4, you can use this API call or use this instruction for other option.

Related documentation

October 26, 2015

RTSP playback support in Nimble Streamer

Early this year our team introduced RTSP transmuxing support for Nimble Streamer which allowed to take RTSP streams and produce HLS, DASH and MPEG-TS outgoing streams.

As our customers requested, now we introduce RTSP TCP interleaved playback in Nimble Streamer which means the stream can both be played and pulled from the Nimble instance for further processing. To make this output, the Nimble Streamer instance may take the input of RTSP, RTMP and MPEG-TS protocols.

1. Install Nimble Streamer

Use this installation instruction to get Nimble on your server or desktop. The procedure is easy and straight-forward so having any popular 64-bit Linux, Windows or MacOS will allow you to get it working.

2. Make general settings

Since you've completed WMSPanel account sign up at the previous step, you can log into the system and go to "Nimble Streamer" -> "Live stream settings" menu.

The first tab you need is called "Global". Here you need to select output protocols which you will use for playback at selected server. In the following example we see HLS, RTSP and MPEG-DASH.

Selecting protocols for playback.

October 21, 2015

Larix Broadcaster mobile streaming from iOS to Nimble Streamer

Do you want to broadcast live video from mobile device to your own audience all over the world? The viewers might be your clients, colleagues, friends, family or everybody else you want to show the current moment of your live. Sure, that should be simple. Just point your mobile device and push the button.

In this article we are going to show how to create video streaming from iOS mobile device via Larix Broadcaster. Larix Broadcaster is a free mobile application which can stream live video and/or audio to media server via RTSP protocol. In this example, we'll use Nimble Streamer because it's a freeware powerful media server with rich feature set.

You can visit Larix Broadcaster web page for full Larix feature set description.
Please also visit Larix documentation reference to see more articles about app setup.

To launch the live steaming from a mobile device via Larix Broadcaster you need to perform several steps:
  1. Install Larix Broadcaster on your mobile device;
  2. Install Nimble Streamer and make necessary settings;
  3. Specify published URL in Larix Broadcaster;
  4. Open output stream from the media server and check that everything works fine.

1. Install Larix Broadcaster application

Open AppStore in your mobile device, search for Larix Broadcaster and proceed with installing it. Or just use this direct link.

When you launch Larix Broadcaster you will see preview window with "Settings" gear icon and and other buttons.

2. Install and set up Nimble Streamer

Nimble Streamer can be installed on all popular Linux distributions and Windows. For more details about Nimble Streamer installation please see this page. You need to sign up WMSPanel account before starting the installation.

Go to wmspanel.com and press the "Sign Up" link in the top right corner.

Specify your e-mail address in the appeared dialog and then press "Sign Up" button. Follow the instructions from the received e-mail message to complete the registration.

Go to https://wmspanel.com/nimble/install web page and follow installation and registration instructions.

Now let's proceed to Nimble Streamer setup.

Log in to WMSPanel and go to "Nimble Streamer" -> "Live stream settings" menu. Check the HLS and RTMP checkboxes in "General" tab and then press the "Save" button. You may specify Push login and Push password to protect you connection with mobile device. This login and password will be used in Larix Broadcaster settings.

Go to "Interfaces" tab and press "Add RTSP interface" button.

Specify the port number in appeared dialog. Also, this port number will be used in Larix Broadcaster settings. Select your Nimble Streamer instance and press the "Save" button.

In order to make your outgoing stream be available for RTMP playback, add RTMP port as well. That is usually 1935.

If you'd like to avoid publishing from un-authorized sources, you need to set up login and password which you may then use in this app. Go to Global tab to set up server-wide credentials or create application-specific credentials. Refer to this article for basic workflow setup.

So the basic Nimble Streamer configuration to work with Larix Broadcaster is completed. Proceed to configure mobile application.

3. Configure Larix Broadcaster app

For more information about streaming setup, visit Larix documentation reference hich includes video tuutorials.

Specify the IP-address of your media server, Port and Path. If you have specified Push login and Push password then RTSP URL should look like
For RTMP it will be
I user and password fields, enter push_login and push_password

Now return to mobile application preview screen. Make sure that your mobile device has network connection and press "Broadcast" big red button.

4. Check the streaming

Now get back to WMSPanel. Go to "Nimble Streamer" -> "Live streams" menu and click on the number under the "Outgoing streams" column.

Then click on the Question sign in the stream name row.

The video playback from mobile device starts automatically in the appeared dialog. By default the most popular streaming protocol (HLS) is used for video playback. HLS is supported by the most modern mobile devices. If you need to playback video with minimum possible latency, you may use RTMP protocol. To configure minimum latency please read the "Nimble Streamer performance tuning" article.

Also you can play streaming URL with system player (e.g. VLC).

You can now broadcast live video and/or audio from your iPhone and iPad via Larix Broadcaster to your web page, YouTube live or any other CDN.

Larix premium SDK

If you'd like to create similar iOS app capable of media streaming, you can use our mobile broadcasting library and SDK which is the core of Larix Broadcaster. You will get Larix source code and a library for further UI customization.

Some frequent questions regarding Larix Broadcaster ap and SDK are answered in our FAQ.

Visit our documentation reference page for more Larix setup information.
Also, take a look at our Mobile to mobile snapshot which shows the example of using Softvelum products for building mobile streaming and playback network.

Please contact us if you have any questions.

Related documentation

Transmux RTSP to HLS, RTMP, DASH and more via Nimble Streamer

October 12, 2015

SRT, RTMP and RTSP publish control framework overview

For the past few years, mobile devices were showing significant improvements for video creation capabilities hence the popularity of video live streaming solutions - from mobile broadcasting applications to complex all-in-one solutions. If you create a streaming solution yourself, you need to be able to control the publication process for the protocol which you choose to work with, e.g. for RTSP or RTMP.

SRTRTSPRTMP and WebRTC incoming streams were supported in Nimble Streamer for a while already among other protocols. Nimble supports SRT, RTSP, RTMP and WebRTC streaming authentication server-wise as well as for specific applications. So if a customer needed to separate publishing permissions between his users, he needed to create separate application for each individual publisher. But when you broadcast from mobile devices, you probably will need some better way to make sure each publisher has separate permission to publish.

Our customers have been using WMSAuth Paywall functionality to secure the outgoing streaming for a long time. Now to secure the incoming streams, we introduce the Publish control framework which allows performing multi-level authorization.

So now Nimble Streamer allows controlling the publication for RTSP, RTMP and SRT in Listen mode receiver both when establishing connection time and during the streaming process. It has various options so let's see what we have, step by step.

The following scenarios authentication are available.

"Zero option" is if you don't need any protection for incoming streams, then you can just specify only port number for RTMP and RTSP, and define SRT listener. Any publishers can push any streams to your server through the specified port so we do not recommend it. WebRTC requires authentication though.

1. Use publishing credentials

The first scenario is to create a separate application in Nimble Streamer settings for each user with unique username and password to get authorized streams from different authorized users. This mechanism is unsuitable for the large number of users and does not allow to block users during streaming process because the authorization takes place only at the time of connection of the user.

2. Use per-stream publish signature.

In order to allow multiple users to publish streams to the media server and to have the flexibility to control streams, you need to use our Publish control framework.

At this step we add a publish signature, which is based on the following parameters:
  • user identifier (ID);
  • stream name;
  • password which was specified in application;
  • publisher IP address (this one is optional).
You need to specify an application in WMSPanel control UI to operate the incoming streams. Publishing users will be grouped in. The application name should be the same as specified on step 2. The password which is used in this signature should be specified in the publish control application settings via the UI.

To publish to Nimble Streamer, the publisher will use the URL like this:
For RTMP this will be
For SRT receiver in Listen mode you will define streamid as shown in the following example, read Setting SRT user and password authentication with SRT PASSet article for setup details of proper streamid.
ffmpeg -re -i video.mp4 -codec copy -f mpegts pipe:1 | ./srt-live-transmit -v file://con "srt://"
For WebRTC the WHIP signaling URL will be

Here, a publishsign is the signature for incoming stream.

When the user is going to publish RTSP or RTMP stream, the media server will check publish signature and if this signature does not match the calculated signature, then the user stream will not pass.
At this step the publish control is very similar to the hotlinking protection.

3. Use connection handler to manage connection process.

To get full control for the incoming streams, you need to create a handler application and specify its URL in the control UI.

The handler is an HTTP application which is able to process POST requests and return the response according to the business logic of the customer. If you don't specify the handler URL then Publish control framework will not try to call the handler. This is done to allow debugging the signature-checking mechanism.
Besides handler URL, you can set up the grouping interval for the incoming streams. The handler is called with some timeout to aggregate several requests in one. This allows avoiding the resources waste in case of frequent calls.

Publish control passes the client signature (publishsign) to the handler. As a response to the request, the handler must return the status and Nimble Streamer acts accordingly to allow or deny the connection, based on the status received from the handler.

4. Use publication controller during streaming

With publish control framework you can manipulate SRT, RTSP and RTMP streams not only at connection time, but also during the streaming process as well when the user is already connected and streaming. To perform this, each streaming session is assigned with its own key. You can create publish controller app which can request Nimble with any frequency to identify which users still publish their streams.
If you need to stop certain streaming session then your controller calls Nimble, specifies the session ID and this stream will be blocked immediately.

Using publish control framework you can implement any level of incoming streams security from basic level authorization to advanced business logic solution.

If you need to change the incoming streams' content parameters, like change the bitrate, use our Live Transcoder for Nimble Streamer to transform. It has high performance and low resource usage.

Next step is the setup

The next article describes step-by-step publish control set up with examples of source code, requests and responses.

Also check playback authorization feature set which allows controlling playback connections via external handler similar to what is used in publish control.

Related documentation

RTSP streaming via Nimble Streamer, RTMP feature set in NimbleNimble Streamer paywall feature set, Larix BroadcasterSRT Publisher Assistance Security Set, WebRTC support in Nimble