Skip to main content
Version: 4.12.7

How to customise quality selection & labels (MP4)

Some of our customers prefer MP4 assets over HLS/MPEG-DASH ones. One major downside to this approach is that Adaptive Bitrate Streaming (ABR) is not possible with such streams, as they don't have a playlist with multiple qualities.

To counter this, we've made it possible to pass on a list of MP4 qualities & switch between them manually, to improve the overall UX. What is nice about this piece of integration code, is that it can be tweaked and applied to customise other parts of the default UI as well!

SDKs

Web SDKAndroid SDKiOS SDKtvOS SDKAndroid TV SDKChromecast SDK
YesYesYesN/AYesN/A

Customizing the quality selector & labels

This example explains how to customise quality selection & labels for MP4 assets.

Web SDK

First of all, we need to set up the player (don't forget to edit the placeholders to match your setup).

Then, the different MP4 qualities of the same asset need to be stated, along with the corresponding resolutions:

// set your resolutions and sources
var resolutions = [
{ name: "360p", src: "http://example.com/demos/sample-videos/low.mp4" },
{ name: "540p", src: "http://example.com/demos/sample-videos/medium.mp4" },
{ name: "720p", src: "http://example.com/demos/sample-videos/high.mp4" }
];

Now for the slightly trickier part: Removing current & adding custom menu

var currentTime, wasPaused;
var settingsMenu = player.ui
.getChild("ControlBar")
.getChild("SettingsButton").menu;

// Remove built-in quality sub menu
settingsMenu.removeMenuItem(settingsMenu.menuItems[0]);

// Create custom quality sub menu
var qualityMenuItem = settingsMenu.addSubMenuItem({
index: 0
});
var qualityMenuTitle = document.createElement("span");
qualityMenuTitle.className = "theo-settings-control-menu-item-title";
qualityMenuTitle.innerHTML = "Quality";
var qualityMenuValue = document.createElement("span");
qualityMenuValue.className = "theo-settings-control-menu-item-value";
qualityMenuItem.el().appendChild(qualityMenuTitle);
qualityMenuItem.el().appendChild(qualityMenuValue);
qualityMenuItem.subMenu.menuHeader.el().innerHTML = "Quality";
var qualityItems = resolutions.map(function (resolution) {
var qualityItem = qualityMenuItem.subMenu.addMenuItem();
qualityItem.el().innerHTML = resolution.name;
qualityItem.on("click", function () {
selectQuality(resolution);
});
return qualityItem;
});

// Getting the player/UI in the correct state
function selectQuality(resolution) {
qualityMenuValue.innerHTML = resolution.name;
currentTime = player.currentTime;
wasPaused = player.paused;
player.src = resolution.src;
player.currentTime = currentTime;
if (!wasPaused) {
player.play();
}
var qualityItem = qualityItems[resolutions.indexOf(resolution.name)];
qualityItems.forEach(function (item) {
item.selected(item === qualityItem);
});
}
selectQuality(resolutions[0]);
Android SDK

The above JavaScript code can be used for Android projects by injecting the JavaScript code. Documentation for: Injecting CSS and JavaScript to Android/iOS

Legacy iOS/tvOS SDK (4.12.x)

The above JavaScript code can be used for Android projects by injecting the JavaScript code. Documentation for: Injecting CSS and JavaScript to Android/iOS

You can now select multiple qualities of the same MP4 asset!

Customize quality selection