Skip to main content
Version: 6.13.0

Subtitles, Closed Captions and Metadata tracks

THEOplayer's TextTrack api gives developers the capability to manage and manipulate various types of text-based content. Some of its key functionalities include text track selection, styling, and listening to track and cue events.

Types of text tracks

In this document we will differentiate between the following kinds of text tracks:

  • Subtitles, which are text-based translations of the dialogue or narrative of a video;
  • Closed Captions (CC), which go beyond subtitles by providing additional information about sound effects, music, and other audio cues;
  • Metadata tracks, which are used for providing non-textual information about the video, such as thumbnail urls or program boundaries in a live stream.

In addition, a distinction can be made between how a text track is delivered to the player:

  • In-band refers to text tracks that are embedded within the video or audio media stream itself.
  • Out-band, or out-of-band, is used to describe text tracks that are delivered separately from the media file. They are typically described in the playlist or manifest.
  • Side-loaded text tracks are those that are manually added or loaded by the user through the source description.

Side-loaded text tracks

In contrast to in-band and out-band text tracks, which are delivered to the player through the media content itself, the side-loaded text tracks can be configured by the user when setting a source to the player:

player.source = {
"sources": [
{
"src": "https://cdn.theoplayer.com/video/big_buck_bunny/big_buck_bunny.m3u8",
"type": "application/x-mpegurl"
}
],
"textTracks": [
{
"default": true,
"src": "https://cdn.theoplayer.com/dash/theoplayer/thumbnails/big_buck_bunny_thumbnails.vtt",
"label": "thumbnails",
"kind": "metadata",
"format": "webvtt",
"srclang": "en"
}
]
}

iOS/tvOS

On iOS and tvOS, support for side-loaded tracks is provided by a separate connector, which is enabled by adding the feature to the react-native-theoplayer.json (or theoplayer-config.json) file in your app folder.

{
"ios": {
"features": ["SIDELOADED_TEXTTRACKS"]
}
}

Listening to text track events

Out-band and side-loaded text tracks become accessible via the text track API once the player has loaded the media source. This event is signaled by the PlayerEventType.LOADED_METADATA event, which is dispatched by the THEOplayer API:

player.addEventListener(PlayerEventType.LOADED_METADATA, (event: LoadedMetadataEvent) => {
console.log(TAG, 'loadedmetadata', JSON.stringify(event));
})

Alternatively, the PlayerEventType.TEXT_TRACK_LIST event can be used to dynamically listen to text tracks that are being added, removed or changed. In-band text tracks, in particular, are created when their first cue is loaded, which can occur at any point during playback.

player.addEventListener(PlayerEventType.TEXT_TRACK_LIST, (event: TextTrackListEvent) => {
const { subType, track } = event;
switch (subType) {
case TrackListEventType.ADD_TRACK: /*A text track has been added*/ break;
case TrackListEventType.REMOVE_TRACK: /*A text track has been removed*/ break;
case TrackListEventType.CHANGE_TRACK: /*A text track has changed*/ break;
}
});

Similarly for text track cues, the PlayerEventType.TEXT_TRACK event provides knowledge on cues being added or removed.

player.addEventListener(PlayerEventType.TEXT_TRACK, (event: TextTrackEvent) => {
const { subType, cue } = event;
switch (subType) {
case TextTrackEventType.ADD_CUE: /*A text track cue has been added to the text track*/ break;
case TextTrackEventType.ENTER_CUE: /*A text track cue has entered; it became active*/ break;
case TextTrackEventType.EXIT_CUE: /*A text track cue has exited; it became inactive*/ break;
case TextTrackEventType.REMOVE_CUE: /*A text track cue has been removed from the text track*/ break;
}
})

Enabling a text track

A subtitle or closed caption can be enabled by setting the player's selectedTextTrack property to the uid of the track, or undefined to select none.

const track: TextTrack;
player.selectedTextTrack = track.uid;

Note that THEOplayer React-Native UI package provides a visual representation of the list of available text tracks, as well as the ability to enable/disable them.

Preview thumbnails

Preview thumbnails is a feature that allows users to see a visual representation of different points or scenes within a video, making it easier to navigate and locate specific content of interest.

The thumbnails are typically contained in a dedicated thumbnail track, which is a text track of kind metadata with label thumbnails. The track can be either be side-loaded to the stream source, or contained in a stream manifest, as the demo sources in the example application demonstrate:

{
"sources": [
{
"src": "https://cdn.theoplayer.com/video/big_buck_bunny/big_buck_bunny.m3u8",
"type": "application/x-mpegurl"
}
],
"textTracks": [
{
"default": true,
"src": "https://cdn.theoplayer.com/dash/theoplayer/thumbnails/big_buck_bunny_thumbnails.vtt",
"label": "thumbnails",
"kind": "metadata",
"format": "webvtt"
}
]
}

The @theoplayer/react-native-ui package provides a thumbnail viewer the interprets thumbnail cues and displays them above the progress bar.

Styling subtitles and closed captions

In this section, we showcase the functionality of THEOplayer's TextTrackStyle API, which enables the customization of subtitles and closed captions' appearance. We will illustrate the practical implementation of this API through some examples.

Style properties

PropertyPurposeValueSupport
fontFamilyThe font of the text track.A string, e.g. 'serif', 'monospace', 'arial'.All platforms,
fontColorThe font color of the text track.A string, e.g.'red', '#ff0000', '#ffc50f' or 'rgba(255, 0, 0, 1).All platforms. The rgba() formatting is supported on Web only.
fontSizeThe font size of the text track.A percentage string, e.g.'50%', '100%' (default), '175%'.All platforms,
backgroundColorThe color of the area directly behind the text.A string, e.g.'red', '#ff0000', '#ffc50f' or 'rgba(255, 0, 0, 1).All platforms. The rgba() formatting is supported on Web only.
windowColorThe color of the area covering the full width of the text track.A string, e.g.'red', '#ff0000', '#ffc50f' or 'rgba(255, 0, 0, 1).Web and Android. The rgba() formatting is supported on Web only.
edgeStyleThe edge style of the text.An enum value, either none (default), dropshadow, raised, depressed, uniform.All platforms.
marginTopThe top margin of the area where subtitles are being rendered.A positive numeric value specifying the number of pixels.All platforms.
marginLeftThe left margin of the area where subtitles are being rendered.A positive numeric value specifying the number of pixels.All platforms.
marginBottomThe bottom margin of the area where subtitles are being rendered.A positive numeric value specifying the number of pixels.Web only.
marginRightThe right margin of the area where subtitles are being rendered.A positive numeric value specifying the number of pixels.Web only.

Examples

background

player.textTrackStyle.backgroundColor = 'red';
player.textTrackStyle.marginLeft = 45;

size

player.textTrackStyle.windowColor = 'black';
player.textTrackStyle.fontColor = '#ffff00ff';
player.textTrackStyle.fontSize = '250%';

size

player.textTrackStyle.fontFamily = 'monospace';