This page describes how FAB Subtitler BCAST can transmit subtitles for DASH internet live streams.
Introduction to transmitting subtitles for live internet streams
FAB Subtitler BCAST can generate data that is necessary in order to add subtitles to the internet video/audio streams in DASH format. FAB Subtitler monitors the video manifest (.mpd) from the video encoder and generates the subtitle segments (and the subtitle initialization segment). Those are then distributed through a CDN in the same way as video/audio. The manifest has to contain an additional AdaptationSet for every subtitle language, so that the players are able to identify and display the subtitles. FAB Subtitler generates this AdaptationSet for you and offers it in three different forms, so that you can choose the one that fits your installation best (see “Manifest files generated by FAB Subtitler” below).
The system design is the same as for HLS, only the video manifest is an .mpd instead of an .m3u8 playlist:

FAB Subtitler BCAST can monitor the video manifest in two ways:
- Solution 1 (PUSH MODE): By accepting the manifest.mpd over http that is POSTed by a video encoder to the IP address of FAB Subtitler
- Solution 2 (PULL MODE): By downloading the manifest.mpd from an URL
Configuration of FAB Subtitler BCAST
To activate real time generation of DASH subtitle segments, one DASH Live Streaming output has to be added in the System/Network part of the configuration of FAB Subtitler BCAST for every video stream as can be seen on the following picture:

The configuration of the DASH Live Streaming output is shown on the following pictures:
- For solution 1 (PUSH MODE): accepting the manifest.mpd over http POSTed by a video encoder

- For solution 2 (PULL MODE): downloading the manifest.mpd

“Manifest URL” is the URL that the FAB Subtitler will use to fetch the video manifest (PULL MODE). In PUSH MODE the address on which FAB Subtitler accepts the manifest and the segments is displayed instead.
“Advance subt. playlist by” allows defining how many video segments subtitles can be advanced in time. This can help reducing delay for live subtitles. Generally 1 shall be used, however you have to verify that all targeted players display subtitles correctly. If there are problems with players, use value 0. Even Higher values than 1 may cause some players not to display the subtitles at all.
“Generate segments in advance (ms)” (0 to 10000, default 1500).
When the video manifest addresses its segments by number and a constant duration
(SegmentTemplate with $Number$ and duration), FAB Subtitler can compute the number of a
segment before the video reaches it. The subtitle segment is then generated this many
milliseconds before the time it starts, so that it is already available when the player
requests it. If your player now and then reports that a subtitle segment is not available
(for example a 404 for the newest segment), increase this value. Do not set it higher
than necessary: subtitles that FAB Subtitler receives only after the segment has been
generated can not be included in it. For manifests with an explicit SegmentTimeline the
setting has no effect.
“Language” is the language of the subtitle track. It is written into the lang
attribute of the AdaptationSet.
“Name” is an optional, human readable name of the subtitle track. When it is not
empty, a <Label> element with that text is added to the AdaptationSet (for example
<Label>Subtitles Eng</Label>), which players can show in their subtitle menu. When it
is empty, no Label is written. When “Mirror original names” is active, the AdaptationSet
of the source manifest is left exactly as it is, and the Name is not used.
“URL suffix for subtitle manifest” is a string that will be appended to the URL on the host on which FAB Subtitler is running. The full resulting URLs are displayed next to the entry field. The subtitle manifest and segments are accessible through that URL.
“Name prefix for subtitle manifest (i.e. subt)” is the prefix of all files that FAB Subtitler generates: the segments, the initialization segment and the manifest files described below. Please note that FAB Subtitler will synchronize files on the destination with the locally produced files. Therefore all files starting with this prefix that are not produced by this FAB Subtitler will be deleted on the destination.
“Mirror original names”: when the source manifest already contains a subtitle AdaptationSet (for example one that the encoder or the CDN prepared for subtitles), FAB Subtitler can deliver segments under exactly the names, addressing and format that this AdaptationSet announces, and republishes the AdaptationSet untouched. Use this when you can not change the AdaptationSets, but you can prepare the placeholder.
“Subtitle format” can be TTML - Timed Text XML (.m4s), WebVTT (.m4s) or WebVTT (.webvtt).
Most DASH players support TTML and WebVTT in .m4s. The generated AdaptationSet announces
the matching mimeType and codecs, see below.
“Timed text format TTML” enables you to select which type of TTML you would like to use.
Not all players support all TTML features so depending on the players used, you
might have to use a different TTML type. The available formats and the codecs string
that is announced for each of them are listed below.
“Remove tt namespace”: The EBU has specified that tt namespace shall be used for EBU-TT compliant TTML subtitles. There are almost no players that support using namespace, so you might consider removing tt namespace from the TTML used.
FAB Subtitler can publish the generated files in the following ways:
- Push using HTTP(s) POST/PUT to a configurable URL
- Push using file copy to a network folder
- Only make the files available over the internal web server so that they can be downloaded
“Public base URL of this folder” is the address under which the players reach the folder where
FAB Subtitler publishes its files, normally the address on the CDN, for example
https://cdn.example.com/live/channel1/subt/. When it is set, it is put in front of the segment and
initialization segment names in the AdaptationSets (in the modified manifest and in the
xlinked file) and in front of the file name in the xlink example. When it is empty, relative file names are
written. Players do not reach FAB Subtitler directly, so never enter the address of the FAB
Subtitler computer here, but the address of the CDN or leave it empty
when relative addressing is working.
Manifest files generated by FAB Subtitler
For every subtitle prefix FAB Subtitler generates three files. If the prefix is subt, they are:
subt.mpd- the video manifest of the encoder with our subtitle AdaptationSet(s) added. This is the manifest that the players can use instead of the original one.subt_orig.mpd- a copy of the original, unmodified manifest with one additionalAdaptationSetelement that carries anxlink:hrefpointing tosubt_sets.xml(withxlink:actuate="onLoad"). It is an example that shows how a customer that can make static changes to his own manifest (but not dynamic ones) can reference our subtitles without having to use our modified manifest.subt_sets.xml- all AdaptationSets that FAB Subtitler generates, side by side. This is the target of the xlink in the example above. It is only generated when there is at least one subtitle AdaptationSet.
All three files are updated whenever the video manifest changes. All of them are published in the same way as the segments, so they are on the CDN next to them.
Which one to use:
-
If you can let the players use another manifest than the one from the encoder, use
subt.mpd. Nothing else is needed. -
If the players must keep using the customer’s own manifest, add the following line inside the
<Period>of that manifest (and the xlink namespacexmlns:xlink="http://www.w3.org/1999/xlink"to the<MPD>element), as shown insubt_orig.mpd:<AdaptationSet xlink:href="https://cdn.example.com/live/channel1/subt/subt_sets.xml" xlink:actuate="onLoad"/>The players load the AdaptationSets from
subt_sets.xmleach time they load the manifest. The reference player dash.js can only resolve absolute http(s) addresses inxlink:href. Therefore set “Public base URL of this folder” in the configuration. With it, the xlink insubt_orig.mpdis generated as an absolute address. Without it, only the file name is written, which you have to complete yourself.
Codecs announced for the TTML formats
The AdaptationSet announces mimeType="application/mp4" and a codecs string that depends
on the selected subtitle format. For WebVTT (.m4s) it is wvtt. WebVTT as plain
text segments (.webvtt) is announced as mimeType="text/vtt" without codecs.
For TTML the string depends on the profile that the selected format fulfills, as registered in the
W3C TTML profile registry and listed by the DASH Industry Forum:
| TTML format | codecs |
|---|---|
| IMSC1 (20th Century Fox) | stpp.ttml.im1t |
| IMSC1.1 (Warner Bros), Paramount IMSC1.1, Rosetta IMSC1.2 | stpp.ttml.im2t |
| ARD TT (EBU-TT-D), Redbull (EBU-TT-D) | stpp.ttml.etd1 |
| Simple Timed Text, Flash JW Player (both), iTunes, Amazon Video, Netflix, NBC Universal, SMPTE-TT | stpp |
The Rosetta document does not declare a profile, im2t is the closest registered one.
TTML formats that can be used live
The following TTML formats can be generated for live streaming: Simple Timed Text, Flash JW Player (with and without colors), ARD TT, iTunes TT, Amazon Video, Netflix, NBC Universal, Redbull TT, IMSC1 (20th Century Fox), IMSC1.1 (Warner Bros), Paramount IMSC1.1, SMPTE-TT and Rosetta IMSC1.2.
The formats NPO Open Profile, NPO Hearing Impaired, NPO EBU-TT-D and RTV Slovenia TTML are file formats only. They are selectable, but FAB Subtitler reports the error “The format … is not supported for live TTML output.”
For all TTML formats:
- The subtitle is placed at the top when its first non-empty line is in row 12 or above (rows 1 to 12), otherwise at the bottom.
- Left, centered and right aligned subtitles keep their alignment (where the format supports it).
- Like in WebVTT, a narrow space (U+2009) is added at the beginning and at the end of each line. This avoids that the text touches the edge of its background box.
Language groups
When subtitles are transmitted in several languages, the DASH output is added to a language group in the language definitions of FAB Subtitler. One AdaptationSet per language is then added to the same manifest. Two additional settings in the language definition control what is written into the AdaptationSet of that language:

- “DASH/HLS Language”: the language tag of the AdaptationSet. When it is empty, the language of the language definition is used.
- “DASH/HLS Name”: the name of the track (the
<Label>). When it is empty, no Label is written.
Checklist for setting up subtitles for DASH live stream
- Decide whether you will use solution 1 (PUSH MODE) or solution 2 (PULL MODE)
- Define the URL where FAB Subtitler must push the manifest, segments and the xlink files, and the public (CDN) address of that folder
- Configure FAB Subtitler as described above
- For solution 1 configure the live streaming encoder to push the manifest.mpd and video segments to the IP/URL of FAB Subtitler
- For solution 2 configure the correct PULL URL for the manifest.mpd and video segments
- Let the players use
<prefix>.mpd, or add the xlinked AdaptationSet to your own manifest as shown in<prefix>_orig.mpd - Run the DASH live stream and FAB Subtitler to transmit subtitles and check if the player displays them correctly. Increase “Generate segments in advance (ms)” if the player reports missing segments.
This page was last updated on 2026-10-03