Publishing Video to the Server
Flussonic Media Server can accept video from external systems and devices that initiate broadcast. This is called publishing to Flussonic.
Publishing can be used in a situation where the external system has no static IP or where it is located behind the firewall in a private IP network. In this case, Flussonic has no way of directly sending a request for video.
What we call publishing to Flussonic:
- Transmitting video from a mobile device to Flussonic.
- Transmitting video from OBS (Open Broadcaster Software) or vMix to Flussonic. Learn more
- Transmitting video from a webpage to Flussonic via WebRTC. Learn more
What we don't call publishing to Flussonic:
- Receiving a multicast
- Ingesting a stream from some source
In those cases, Flussonic Media Server has to connect to the data source. Whereas the case where the connection is not initiated by Flussonic itself is called publishing. For example, publishing is when a mobile device connects to Flussonic to transmit video.
Publishing video to social networks is not publishing to Flussonic and therefore it does not meet Flussonic's definition of publishing as used in this documentation.
Supported protocols
Flussonic Media Server can receive requests for video publishing via the RTMP, RTSP, HTTP MPEG-TS, WebRTC, and SRT (20.08) protocols.
Contents:
- Publishing to a static stream
- Publishing with a dynamic name
- Publishing via RTMP
- Publishing via RTSP
- Publishing via MPEG-TS
- Publishing via WebRTC
- Publishing via SRT
- Authorization for stream publishing
- Extended validation of a publication source
- DVR archives and dynamic names of streams
- Re-publishing
- Configuring adaptive bitrate (ABR) for WebRTC publications
Publishing to a static stream
If you know what stream name an external system will use to publish video to Flussonic, you can create a stream with that name and a input publish://
data source.
stream published {
input publish://;
}
To apply the settings, run the command:
service flussonic reload
Caution
In Flussonic version 19.01 and higher, the input publish://
data source type replaces the publish_enabled
option. Newer versions are not compatible with older configuration files.
The new input publish://
data source offers far more flexibility — it adds options for timeout, transcoding, and WebRTC support.
URLs for publishing via different protocols
You can publish videos to Flussonic using the following URLs:
rtsp://flussonic-ip/published
http://flussonic-ip/published/mpegts
rtmp://flussonic-ip/published
orrtmp://flussonic-ip/static/published
. Learn more about RTMP URL at Publishing RTMP streams.
Configuring publishing to a static stream via the web UI
You can add the input publish://
data source to a stream via the web interface.
Creating a static stream for publishing
To create a static stream with a publishing source:
- In the admin interface, create a stream: Media > Stream > add.
- Enter a Stream name.
- Specify
publish://
as the Source URL. Alternatively, save the stream, go to the Input tab, and click accept under Published input. - Click create to save the stream.
To specify additional options for a published source, click options:
Viewing URLs for publishing via different protocols
To view links for publishing:
- Click on the stream name in Media and go to the Overview tab.
- All available links for publishing will be displayed in the Publish links section.
Removing a publishing source from a stream
To remove a publishing source from stream settings:
- Click on the stream name in Media and go to the Input tab.
- Click ignore below the Published input, or click the recycle bin icon to the right of the
publish://
source.
- Click save to apply the settings.
Publishing with a dynamic name
Why use dynamic names and publishing locations?
You might want to use dynamic names for published streams if one or more of the following is true:
-
Your publications last for a limited period of time (unlike a 24/7 TV channel broadcast).
-
You manage a lot of publications, and it is too much work to create a separate stream for each of them.
-
You do not know the names of the incoming streams in advance. For example, you are dealing with a third-party application – like a web chat – that generates a new unique identifier for each stream that it publishes to Flussonic.
Flussonic solves these problems by allowing you to create a publishing location (publication prefix) where you can specify common settings for multiple streams.
A dynamic name means that the full name of a stream is formed from a pre-configured publication prefix and the name defined in an external app.
If the name of a published stream is not known beforehand, or if you expect many published streams, you should set up a publication prefix:
template chats {
prefix chats;
input publish://;
}
Here, chats
is the publication prefix.
All streams published under the chats
prefix will have settings that you specify in the template
directive.
To learn more about stream settings and options, refer to the Flussonic Media Server API.
You can specify several prefixes in the template
directive to create several publishing locations. You can also specify an empty prefix (""
) to publish a stream with any prefix or even without a prefix. Learn more at Templates and prefixes.
URLs for publishing via different protocols
In case of publishing with a dynamic name, you will need to publish streams under names with a prefix, for example:
rtsp://flussonic-ip/chats/tempname
http://flussonic-ip/chats/tempname/mpegts
rtmp://flussonic-ip/chats/tempname
. Learn more about RTMP URL at Publishing RTMP streams.
The part of the name that goes after chats
is defined in the client app. Flussonic Media Server does not "know" the stream name in advance.
Transcoding a published stream
Publishing via WebRTC to live locations
You can use the following transcoder settings for WebRTC published streams with dynamic names:
-
output_audio=(keep|add_aac|aac)
. Specifies audio transcoding options. You can get the resulting audio for playback in AAC (aac
), AAC+Opus (add_aac
), or Opus (keep
— do not transcode audio). By default,add_aac
is used – this means that an input stream, which usually has audio in Opus, will also have a track in AAC in the output. -
prefer_codec=(h264|vp8|vp9|av1)
. Offers to choose one of the listed video codecs at the start of the publication. The default codec is H264. Video encoded in VP8, VP9, and AV1 is currently transferred without transcoding.
Example:
template chats {
prefix chats;
input publish://;
prefer_codec av1;
}
You can also configure transcoding for publishing to a static stream.
Publishing via RTMP to live locations
If published RTMP streams contain audio in PCMU, then you can transcode it to AAC, or specify that the audio tracks must not be transcoded:
output_audio=(keep|add_aac|aac)
. Specifies audio transcoding options. You can get the resulting audio for playback in AAC (aac
), AAC+PCMU (add_aac
) or leave the original codec without change (keep
). By default,keep
is used.
template chats {
prefix chats;
input publish://;
output_audio aac;
}
Publishing via RTMP
To test that publishing over RTMP works, you can use ffmpeg
:
ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -vcodec copy -acodec copy -f flv rtmp://localhost/chats/tmp
This command should cause a new stream to appear in the web interface:
Learn more about RTMP publishing URL at Publishing RTMP streams.
Publishing via RTSP
Some clients can publish video over RTSP.
Flussonic Media Server supports automatic selection between UDP and TCP transport and will receive the stream using the protocol selected by the client.
The stream name must be complete: chats/my/chat-15
ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -vcodec copy -acodec copy -f rtsp rtsp://localhost/chats/my/chat-15
Publishing via MPEG-TS
When transcoding a stream using ffmpeg
, it is possible to publish video over HTTP.
Video can be published with mpegts
added at the end of the URL:
ffmpeg -re -i /opt/flussonic/priv/bunny.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy -f mpegts http://localhost:80/chats/my/chat-15/mpegts
Authorization for stream publishing
Flussonic Media Server can verify a password when publishing a stream. Enter the password in the configuration file as follows:
template chats {
prefix chats;
password mypass;
input publish://;
}
stream published {
password secure;
input publish://;
}
RTMP
To publish a password-protected RTMP stream, use the following example: rtmp application rtmp://192.168.2.3/live
and stream name mystream?password=mypass
HTTP MPEG-TS
To publish an HTTP MPEG-TS stream, you can enter the data as follows:
http://192.168.2.3:80/s1/mpegts?password=secure
ffmpeg -re -i video.mp4 -vcodec copy -acodec copy -f flv rtmp://192.168.2.3/live/mystream?password=mypass
ffmpeg -re -i video.mp4 -vcodec copy -bsf h264_mp4toannexb -acodec copy -f mpegts http://192.168.2.3:80/s1?password=secure
Extended validation of a publication source
Flussonic Media Server allows you to configure an HTTP handler or a user script handler that will check additional information about the publisher (that is, the source of a published stream) before accepting or rejecting the stream.
template chats {
prefix chats;
input publish://;
on_publish http://examplehost:5000/publish-check;
}
template chats2 {
prefix chats2;
input publish://;
on_publish /etc/flussonic/publish_check.lua;
}
Flussoniс will send an HTTP POST
request with a JSON body to an HTTP handler with the following fields:
Fileds | Description |
---|---|
name |
Name of a published stream (like chats/15 ), including a publishing prefix. |
location |
Publishing prefix. |
proto |
Publishing protocol (rtmp , rtsp , mpegts , etc.) |
args |
Parameters extracted from a request's query string. For RTMP, a query string is extracted from a name of a published stream. |
ip |
Publisher's IP address. |
To start publishing, an HTTP handler should return HTTP status code 200.
Visit Flussonic API Reference to familiarize yourself with the current Flussonic methods, fields, its possible values, and responses.
Caution
If a handler specifies a filename, Flussonic Media Server will start writing an flv
file. It will keep writing to the file for as long as the stream is active, and there is disk space left. Flussonic will not check whether it is going to overwrite an existing file with the same name.
DVR archives and dynamic names of streams
You can configure the DVR archive for a publishing prefix:
template recorded {
prefix recorded;
input publish://;
dvr /storage 3d 500G;
}
In this case, the published video will be recorded, and will be available even if the publication is terminated.
When the client stops publishing the video, the stream will disappear after some time, and Flussonic Media Server will keep a very little information about it. Information about this stream will be stored in the index of the archive, and Flussonic Media Server will not lose the files on the disk.
If configured, the system of purging of the archive will delete published streams according to the schedule.
Republishing
To republish the streams, use push
with a template (%s
):
Danger
We do not recommend using push
over UDP in this case as it causes a collision.
template pushed {
prefix pushed;
input publish://;
push rtmp://CDN-SERVER:1936/mylive/%s;
}
With the configuration above, Flussonic republishes the pushed/mystream
stream, using the following URL: rtmp://CDN-SERVER:1936/mylive/mystream
.
Configuring adaptive bitrate (ABR) for WebRTC publications
When a client device is publishing from a browser to Flussonic, Flussonic can control the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication to the bandwidth of the channel. This prevents packet loss when the bandwidth of the Internet connection is insufficient. If you reduce the channel width, the client must reduce the publication bitrate, if you expand the channel, the client must increase the publication bitrate.
To change ABR settings via the Flussonic UI:
To specify additional options for a published source, click options next to the source URL. Adaptive bitrate settings are under WebRTC > ABR:
The following settings in the file correspond to these settings in the UI:
stream published_stream_name {
input publish:// abr_loss_lower=2 abr_loss_upper=10 abr_mode=1 abr_stepdown=50 frames_timeout=1 max_bitrate=2200 min_bitrate=500 output_audio=aac priority=0 source_timeout=5;
}
Options for adjusting the bitrate from the browser-publisher to the channel width up to Flussonic (ABR)
Parameters | Unit | Description |
---|---|---|
max_bitrate |
kbit/s | The maximum allowed bitrate. |
min_bitrate |
kbit/s | The minimum bitrate threshold. By default min_bitrate=100 kbit/s . |
abr_mode |
integer (0 or 1) | The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. Two options are possible: 1) abr_mode=0 . This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles. 2) abr_mode=1 .This mode considers only packet losses and target bitrate. |
abr_stepup |
percent (%) | Increment step for raising the bitrate to the maximum (by 30%. by default). If the loss is less than abr_loss_lower , Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of abr_stepup percent. |
abr_stepdown |
percent (%) | A step of reducing the bitrate to the minimum. If packet losses are greater than abr_loss_upper , Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of abr_stepdown percent. |
abr_loss_lower |
percent (%) | The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. That is, if packet loss is less than abr_loss_lower , Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of abr_stepup percent. |
abr_loss_upper |
percent (%) | The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. That is, if packet loss is greater than abr_loss_upper , Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of abr_stepdown percent. |
abr_cycles |
integer | The number of cycles of bitrate auto-adjustment. |
Flussonic recommends the browser bitrate within the min_bitrate - max_bitrate
range, depending on the presence and amount of packet losses during publication.
Flussonic recommends lowering the bitrate when the amount of losses is more than abr_loss_upper
and increasing it when the amount of losses is less than abr_loss_lower
. Decreasing and increasing are performed by steps of size abr_stepdown
and abr_stepup
, respectively. After the specified number of auto-adjustment cycles (abr_cycles
) passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. By default, abr_cycles=5
. If abr_cycles=0
, the adjustment process takes place all the time while the publication lasts.
Also, Flussonic calculates the actual maximum bitrate. It remembers the bitrate values at which the losses grew up to abr_loss_upper
and considers their average value over the past number of cycles to be the new maximum bitrate value (current).
Switching stream sources, using timeout
The rules of switching sources according to their priority and state (whether a source is available or not) apply to published sources too. This means that you can add alternative sources to a stream with a published source and use timeout for switching between sources.
If a published source is unavailable, Flussonic immediately switches by default to the next source. Alternatively, you can specify your custom timeout.
Example with multiple sources and a timeout:
stream published {
source_timeout 3;
input publish://;
input file://vod/bunny.mp4;
}
You can also specify timeout for each source individually:
stream published {
input publish:// source_timeout=3;
input file://vod/bunny.mp4 source_timeout=2;
}
Prohibiting the publication, the publish_forbidden event in logs
When the source input publish://
has a lower priority than the other specified stream sources, it might mean that the publication will not actually happen. You can prevent the publication and allow it again by changing the priority of sources. This can be done during the broadcast.
If publishing is not possible, Flussonic generates the event publish_forbidden
. For example, this event occurs with the following configuration if the file bunny.mp4
exists and is successfully played:
stream published {
source_timeout 3;
input file://vod/bunny.mp4;
input publish://;
}
To allow publication, put the source of publication before the file.