What is videojs-contrib-quality-levels?
The videojs-contrib-quality-levels package is a plugin for Video.js that provides an API for managing and interacting with the quality levels of a video. This is particularly useful for adaptive bitrate streaming, where multiple quality levels are available, and you want to control or monitor which quality level is being used.
What are videojs-contrib-quality-levels's main functionalities?
Get Available Quality Levels
This feature allows you to get all available quality levels for the video. The 'addqualitylevel' event is triggered whenever a new quality level is added, and you can access the quality level object from the event.
const player = videojs('my-video');
player.qualityLevels().on('addqualitylevel', function(event) {
const qualityLevel = event.qualityLevel;
console.log('Quality level added:', qualityLevel);
});
Select a Quality Level
This feature allows you to select a specific quality level based on certain criteria, such as resolution. In this example, the code selects the 720p quality level and disables all others.
const player = videojs('my-video');
const qualityLevels = player.qualityLevels();
qualityLevels.on('addqualitylevel', function(event) {
const qualityLevel = event.qualityLevel;
if (qualityLevel.height === 720) { // Select 720p quality level
qualityLevel.enabled = true;
} else {
qualityLevel.enabled = false;
}
});
Monitor Quality Level Changes
This feature allows you to monitor changes in the active quality level. The 'change' event is triggered whenever the active quality level changes, and you can access the new active quality level from the qualityLevels array.
const player = videojs('my-video');
const qualityLevels = player.qualityLevels();
qualityLevels.on('change', function() {
const activeQualityLevel = qualityLevels[qualityLevels.selectedIndex];
console.log('Active quality level changed to:', activeQualityLevel);
});
Other packages similar to videojs-contrib-quality-levels
videojs-http-source-selector
The videojs-http-source-selector plugin provides a UI component for selecting different quality levels in a Video.js player. It adds a button to the control bar that allows users to manually select the desired quality level. Unlike videojs-contrib-quality-levels, which focuses on providing an API for managing quality levels, videojs-http-source-selector provides a user interface for manual selection.
videojs-hls-quality-selector
The videojs-hls-quality-selector plugin is another Video.js plugin that adds a quality selector menu to the player. It is specifically designed for HLS (HTTP Live Streaming) and allows users to manually select the desired quality level from a dropdown menu. This plugin is similar to videojs-http-source-selector but is tailored for HLS streams.
videojs-resolution-switcher
The videojs-resolution-switcher plugin allows users to switch between different video resolutions manually. It adds a button to the Video.js control bar that lets users choose from available resolutions. This plugin is similar to videojs-contrib-quality-levels in that it deals with multiple quality levels, but it focuses more on providing a user interface for manual resolution switching.
videojs-contrib-quality-levels
A plugin that provides a framework of working with source quality levels.
Maintenance Status: Stable
Installation
Installation
npm install --save videojs-contrib-quality-levels
The npm installation is preferred, but Bower works, too.
bower install --save videojs-contrib-quality-levels
Using
The list of QualityLevels
can be accessed using qualityLevels()
on the Player object.
With this list, you can:
- See which quality levels are available for the current source
- Enable or disable specific quality levels to change which levels are selected by ABR
- See which quality level is currently selected by ABR
- Detect when the selected quality level changes
Example
let player = videojs('my-video');
let qualityLevels = player.qualityLevels();
qualityLevels.on('addqualitylevel', function(event) {
let qualityLevel = event.qualityLevel;
if (qualityLevel.height >= 720) {
qualityLevel.enabled = true;
} else {
qualityLevel.enabled = false;
}
});
let toggleQuality = (function() {
let enable720 = true;
return function() {
for (let qualityLevel of qualityLevels) {
if (qualityLevel.height >= 720) {
qualityLevel.enabled = enable720;
} else {
qualityLevel.enabled = !enable720;
}
}
enable720 = !enable720;
};
})();
let currentSelectedQualityLevelIndex = qualityLevels.selectedIndex;
qualityLevels.on('change', function() {
console.log('Quality Level changed!');
console.log('New level:', qualityLevels[qualityLevels.selectedIndex]);
});
Supporting Quality Levels for your source
This project provides the framework for working with source quality levels. Just including this project alongside videojs does not necessarily mean that there will be levels available in the list or that any events will be triggered. Some projects within the videojs org supports this project and automatically populates the list and triggers change
events when the selected quality level changes. See the Supported Projects section for a list of these projects.
If you are not using one of the supported projects, but still want to use quality levels with your source, you will have to implement your own plugin that populates the list and triggers change events when selected level changes. Implementing such a plugin is very specific to the source in question, so it is difficult to provide specific examples, but will most likely require a custom middleware, source handler, or tech.
Populating the list
Initially the list of quality levels will be empty. You can add quality levels to the list by using QualityLevelList.addQualityLevel
for each quality level specific to your source. QualityLevelList.addQualityLevel
takes in a Representation
object (or generic object with the required properties). All properties are required except width
, height
and frameRate
.
Example Representation
Representation {
id: string,
width: number,
height: number,
bitrate: number,
frameRate: number,
enabled: function
}
The enabled
function should take an optional boolean to enable or disable the representation and return whether it is currently enabled.
You can also remove quality levels from the list using QualityLevelList.removeQualityLevel
. Call this function with the reference to the QualityLevel
object you wish to remove. The QualityLevelList.selectedIndex
property will automatically be updated when a quality level is removed so that it still refers to the correct level. If the currently selected level is removed, the selectedIndex
will be set to -1
.
Triggering the 'change' event
When your playback plugin changes the selected quality for playback, you will also have to trigger the change
event on the QualityLevelList
and update the QualityLevelList.selectedIndex_
, as it does not have knowledge of which quality is active in playback.
let player = videojs('my-video');
let qualityLevels = player.qualityLevels();
qualityLevels.selectedIndex_ = 0;
qualityLevels.trigger({ type: 'change', selectedIndex: 0 });
Supported Projects
The following projects have built-in support for videojs-contrib-quality-levels and will automatically populate the list with available levels and trigger change
events when the quality level changes.
Including the Plugin
To include videojs-contrib-quality-levels on your website or web application, use any of the following methods.
<script>
Tag
This is the simplest case. Get the script in whatever way you prefer and include the plugin after you include video.js, so that the videojs
global is available.
<script src="//path/to/video.min.js"></script>
<script src="//path/to/videojs-contrib-quality-levels.min.js"></script>
<script>
var player = videojs('my-video');
player.qualityLevels();
</script>
Browserify
When using with Browserify, install videojs-contrib-quality-levels via npm and require
the plugin as you would any other module.
var videojs = require('video.js');
require('videojs-contrib-quality-levels');
var player = videojs('my-video');
player.qualityLevels();
RequireJS/AMD
When using with RequireJS (or another AMD library), get the script in whatever way you prefer and require
the plugin as you normally would:
require(['video.js', 'videojs-contrib-quality-levels'], function(videojs) {
var player = videojs('my-video');
player.qualityLevels();
});
License
Apache-2.0. Copyright (c) Brightcove, Inc.