mirror of
https://github.com/kmoskwiak/videojs-resolution-switcher.git
synced 2025-10-03 09:49:21 +02:00
default src
This commit is contained in:
parent
6889d02fe7
commit
3103da56f7
2 changed files with 53 additions and 24 deletions
13
example.html
13
example.html
|
@ -52,7 +52,12 @@
|
||||||
videojs('video', {
|
videojs('video', {
|
||||||
controls: true,
|
controls: true,
|
||||||
muted: true,
|
muted: true,
|
||||||
width: 1000
|
width: 1000,
|
||||||
|
plugins: {
|
||||||
|
videoJsResolutionSwitcher: {
|
||||||
|
default: 'low' // Default resolution [{Number}, 'low', 'high']
|
||||||
|
}
|
||||||
|
}
|
||||||
}, function(){
|
}, function(){
|
||||||
var player = this;
|
var player = this;
|
||||||
window.player = player
|
window.player = player
|
||||||
|
@ -61,12 +66,14 @@
|
||||||
{
|
{
|
||||||
src: 'http://media.xiph.org/mango/tears_of_steel_1080p.webm',
|
src: 'http://media.xiph.org/mango/tears_of_steel_1080p.webm',
|
||||||
type: 'video/webm',
|
type: 'video/webm',
|
||||||
label: 'SD'
|
label: 'SD',
|
||||||
|
res: 360
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: 'http://mirrorblender.top-ix.org/movies/sintel-1024-surround.mp4',
|
src: 'http://mirrorblender.top-ix.org/movies/sintel-1024-surround.mp4',
|
||||||
type: 'video/mp4',
|
type: 'video/mp4',
|
||||||
label: 'HD'
|
label: 'HD',
|
||||||
|
res: 720
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,9 @@
|
||||||
(function(window, videojs) {
|
(function(window, videojs) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var defaults = {
|
var defaults = {},
|
||||||
option: true
|
videoJsResolutionSwitcher,
|
||||||
},
|
groupedSrc;
|
||||||
videoJsResolutionSwitcher;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the plugin.
|
* Initialize the plugin.
|
||||||
|
@ -33,18 +32,13 @@
|
||||||
onClick: function(){
|
onClick: function(){
|
||||||
// Hide bigPlayButton
|
// Hide bigPlayButton
|
||||||
player.bigPlayButton.hide()
|
player.bigPlayButton.hide()
|
||||||
|
|
||||||
// Remember player state
|
// Remember player state
|
||||||
var currentTime = player.currentTime()
|
var currentTime = player.currentTime()
|
||||||
var isPaused = player.paused()
|
var isPaused = player.paused()
|
||||||
|
|
||||||
// Change player source and wait for loadedmetadata event, then play video
|
// Change player source and wait for loadedmetadata event, then play video
|
||||||
player.src({src: this.src, type: this.type}).one( 'loadedmetadata', function() {
|
player.src({src: this.src, type: this.type}).one( 'loadedmetadata', function() {
|
||||||
player.currentTime(currentTime)
|
player.currentTime(currentTime)
|
||||||
|
if(!isPaused){ player.play() }
|
||||||
if(!isPaused){
|
|
||||||
player.play()
|
|
||||||
}
|
|
||||||
player.trigger('resolutionchange')
|
player.trigger('resolutionchange')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -58,17 +52,12 @@
|
||||||
var ResolutionMenuButton = videojs.extends(MenuButton, {
|
var ResolutionMenuButton = videojs.extends(MenuButton, {
|
||||||
constructor: function(player, options){
|
constructor: function(player, options){
|
||||||
this.sources = options.sources;
|
this.sources = options.sources;
|
||||||
|
|
||||||
MenuButton.call(this, player, options);
|
MenuButton.call(this, player, options);
|
||||||
|
|
||||||
this.controlText('Quality')
|
this.controlText('Quality')
|
||||||
|
|
||||||
},
|
},
|
||||||
createItems: function(){
|
createItems: function(){
|
||||||
|
var sources = this.sources;
|
||||||
var sources = this.sources.sort(compareResolutions);
|
|
||||||
var menuItems = [];
|
var menuItems = [];
|
||||||
|
|
||||||
for(var i = 0; i < sources.length; i++){
|
for(var i = 0; i < sources.length; i++){
|
||||||
menuItems.push(new ResolutionMenuItem(player, {
|
menuItems.push(new ResolutionMenuItem(player, {
|
||||||
label: sources[i].label,
|
label: sources[i].label,
|
||||||
|
@ -76,27 +65,26 @@
|
||||||
type: sources[i].type
|
type: sources[i].type
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
return menuItems;
|
return menuItems;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
player.updateSrc = function(src){
|
player.updateSrc = function(src){
|
||||||
|
|
||||||
//Return current src if src is not given
|
//Return current src if src is not given
|
||||||
if(!src){ return player.src() }
|
if(!src){ return player.src() }
|
||||||
|
|
||||||
// Dispose old resolution menu button before adding new sources
|
// Dispose old resolution menu button before adding new sources
|
||||||
if(player.controlBar.resolutionSwitcher){
|
if(player.controlBar.resolutionSwitcher){
|
||||||
player.controlBar.resolutionSwitcher.dispose()
|
player.controlBar.resolutionSwitcher.dispose()
|
||||||
delete player.controlBar.resolutionSwitcher
|
delete player.controlBar.resolutionSwitcher
|
||||||
}
|
}
|
||||||
|
//Sort sourcec
|
||||||
|
src = src.sort(compareResolutions)
|
||||||
|
groupedSrc = bucketSources(src)
|
||||||
var menuButton = new ResolutionMenuButton(player, { sources: src });
|
var menuButton = new ResolutionMenuButton(player, { sources: src });
|
||||||
menuButton.el().classList.add('vjs-resolution-button')
|
menuButton.el().classList.add('vjs-resolution-button')
|
||||||
player.controlBar.resolutionSwitcher = player.controlBar.addChild(menuButton)
|
player.controlBar.resolutionSwitcher = player.controlBar.addChild(menuButton)
|
||||||
|
player.src(chooseSrc(src));
|
||||||
player.src(src);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,6 +98,40 @@
|
||||||
return (+b.res)-(+a.res);
|
return (+b.res)-(+a.res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Group sources by label, resolution and type
|
||||||
|
* @param {Array} src Array of sources
|
||||||
|
* @returns {Object} grouped sources: { label: {}, res: {}, type: {} }
|
||||||
|
*/
|
||||||
|
function bucketSources(src){
|
||||||
|
var resolutions = {
|
||||||
|
label: {},
|
||||||
|
res: {},
|
||||||
|
type: {}
|
||||||
|
}
|
||||||
|
for(var i = 0; i<src.length; i++){
|
||||||
|
resolutions.label[src[i].label] = resolutions.label[src[i].label] || []
|
||||||
|
resolutions.res[src[i].res] = resolutions.res[src[i].res] || []
|
||||||
|
resolutions.type[src[i].type] = resolutions.type[src[i].type] || []
|
||||||
|
resolutions.label[src[i].label].push(src[i])
|
||||||
|
resolutions.res[src[i].res].push(src[i])
|
||||||
|
resolutions.type[src[i].type].push(src[i])
|
||||||
|
}
|
||||||
|
return resolutions
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Choose src if option.default is specified
|
||||||
|
* @param {Array} src Array of sources
|
||||||
|
* @returns {Object} source object
|
||||||
|
*/
|
||||||
|
function chooseSrc(src){
|
||||||
|
if(settings.default === 'low'){ return src[src.length - 1] }
|
||||||
|
if(settings.default === 'high'){ return src[0] }
|
||||||
|
if(groupedSrc.res[settings.default]){ return groupedSrc.res[settings.default][0] }
|
||||||
|
return src
|
||||||
|
}
|
||||||
|
|
||||||
// Create resolution switcher for videos form <source> tag inside <video>
|
// Create resolution switcher for videos form <source> tag inside <video>
|
||||||
if(player.options_.sources.length > 1){
|
if(player.options_.sources.length > 1){
|
||||||
player.updateSrc(player.options_.sources)
|
player.updateSrc(player.options_.sources)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue