Embed: dashjs trackswitching using generic method
This commit is contained in:
parent
80a3618bc4
commit
7cf115d79a
2 changed files with 1 additions and 67 deletions
|
@ -1 +1 @@
|
||||||
mistplayers.dashjs={name:"Dash.js player",mimes:["dash/video/mp4"],priority:MistUtil.object.keys(mistplayers).length+1,isMimeSupported:function(t){return MistUtil.array.indexOf(this.mimes,t)==-1?false:true},isBrowserSupported:function(t,e,i){if(location.protocol!=MistUtil.http.url.split(e.url).protocol){i.log("HTTP/HTTPS mismatch for this source");return false}if(location.protocol=="file:"){i.log("This source ("+t+") won't load if the page is run via file://");return false}return"MediaSource"in window},player:function(){this.onreadylist=[]},scriptsrc:function(t){return t+"/dashjs.js"}};var p=mistplayers.dashjs.player;p.prototype=new MistPlayer;p.prototype.build=function(t,e){var i=this;this.onDashLoad=function(){if(t.destroyed){return}t.log("Building DashJS player..");var a=document.createElement("video");if("Proxy"in window){var r={get:{},set:{}};t.player.api=new Proxy(a,{get:function(t,e,i){if(e in r.get){return r.get[e].apply(t,arguments)}var a=t[e];if(typeof a==="function"){return function(){return a.apply(t,arguments)}}return a},set:function(t,e,i){if(e in r.set){return r.set[e].call(t,i)}return t[e]=i}});if(t.info.type=="live"){r.get.duration=function(){var e=0;if(this.buffered.length){e=this.buffered.end(this.buffered.length-1)}var i=((new Date).getTime()-t.player.api.lastProgress.getTime())*.001;return e+i+-1*t.player.api.liveOffset+45};r.set.currentTime=function(e){var i=e-t.player.api.duration;t.log("Seeking to "+MistUtil.format.time(e)+" ("+Math.round(i*-10)/10+"s from live)");t.video.currentTime=e};MistUtil.event.addListener(a,"progress",function(){t.player.api.lastProgress=new Date});t.player.api.lastProgress=new Date;t.player.api.liveOffset=0}}else{i.api=a}if(t.options.autoplay){a.setAttribute("autoplay","")}if(t.options.loop&&t.info.type!="live"){a.setAttribute("loop","")}if(t.options.poster){a.setAttribute("poster",t.options.poster)}if(t.options.muted){a.muted=true}if(t.options.controls=="stock"){a.setAttribute("controls","")}var s=dashjs.MediaPlayer().create();s.initialize(a,t.source.url,t.options.autoplay);i.dash=s;var n=["METRIC_ADDED","METRIC_CHANGED","METRICS_CHANGED","FRAGMENT_LOADING_STARTED","FRAGMENT_LOADING_COMPLETED","LOG","PLAYBACK_TIME_UPDATED","PLAYBACK_PROGRESS"];for(var o in dashjs.MediaPlayer.events){if(n.indexOf(o)<0){i.dash.on(dashjs.MediaPlayer.events[o],function(e){t.log("Player event fired: "+e.type)})}}t.player.setSize=function(t){this.api.style.width=t.width+"px";this.api.style.height=t.height+"px"};t.player.api.setSource=function(e){t.player.dash.attachSource(e)};t.player.api.setTrack=function(e,a){var r=MistUtil.tracks.parse(t.info.meta.tracks);if(!(e in r)||!(a in r[e])&&a!="none"){t.log("Skipping trackselection of "+e+" track "+a+" because it does not exist");return}var s=[];for(var n in t.info.meta.tracks){var o=t.info.meta.tracks[n];if(o.type==e){s.push(o)}}MistUtil.array.multiSort(s,["bps"]);var l=false;for(var n in s){var d="idx"in s[n]?s[n].idx:s[n].trackid;if(d==a){l=n;break}}if(l===false){return false}i.dash.setAutoSwitchQualityFor(e,false);i.dash.setFastSwitchEnabled(true);i.dash.setQualityFor(e,l);return true};i.dash.on("qualityChangeRendered",function(e){var i=[];for(var a in t.info.meta.tracks){var r=t.info.meta.tracks[a];if(r.type==e.mediaType){i.push(r)}}MistUtil.array.multiSort(i,["bps"]);var s="idx"in i[e.newQuality]?i[e.newQuality].idx:i[e.newQuality].trackid;MistUtil.event.send("playerUpdate_trackChanged",{type:e.mediaType,trackid:s},t.video)});var l=false;i.dash.on("allTextTracksAdded",function(){l=true});t.player.api.setSubtitle=function(e){if(!l){var a=function(){t.player.api.setSubtitle(e);i.dash.off("allTextTracksAdded",a)};i.dash.on("allTextTracksAdded",a);return}if(!e){i.dash.enableText(false);return}var r=i.dash.getTracksFor("text");for(var s in r){var n="idx"in e?e.idx:e.trackid;if(r[s].id==n){i.dash.setTextTrack(s);if(!i.dash.isTextEnabled()){i.dash.enableText()}return true}}return false};MistUtil.event.addListener(a,"progress",function(e){if(t.container.getAttribute("data-loading")=="stalled"){t.container.removeAttribute("data-loading")}});i.api.unload=function(){i.dash.reset()};t.log("Built html");e(a)};if("dashjs"in window){this.onDashLoad()}else{var a=MistUtil.scripts.insert(t.urlappend(mistplayers.dashjs.scriptsrc(t.options.host)),{onerror:function(e){var i="Failed to load dashjs.js";if(e.message){i+=": "+e.message}t.showError(i)},onload:i.onDashLoad},t)}};
|
mistplayers.dashjs={name:"Dash.js player",mimes:["dash/video/mp4"],priority:MistUtil.object.keys(mistplayers).length+1,isMimeSupported:function(e){return MistUtil.array.indexOf(this.mimes,e)==-1?false:true},isBrowserSupported:function(e,t,i){if(location.protocol!=MistUtil.http.url.split(t.url).protocol){i.log("HTTP/HTTPS mismatch for this source");return false}if(location.protocol=="file:"){i.log("This source ("+e+") won't load if the page is run via file://");return false}return"MediaSource"in window},player:function(){this.onreadylist=[]},scriptsrc:function(e){return e+"/dashjs.js"}};var p=mistplayers.dashjs.player;p.prototype=new MistPlayer;p.prototype.build=function(e,t){var i=this;this.onDashLoad=function(){if(e.destroyed){return}e.log("Building DashJS player..");var r=document.createElement("video");if("Proxy"in window){var a={get:{},set:{}};e.player.api=new Proxy(r,{get:function(e,t,i){if(t in a.get){return a.get[t].apply(e,arguments)}var r=e[t];if(typeof r==="function"){return function(){return r.apply(e,arguments)}}return r},set:function(e,t,i){if(t in a.set){return a.set[t].call(e,i)}return e[t]=i}});if(e.info.type=="live"){a.get.duration=function(){var t=0;if(this.buffered.length){t=this.buffered.end(this.buffered.length-1)}var i=((new Date).getTime()-e.player.api.lastProgress.getTime())*.001;return t+i+-1*e.player.api.liveOffset+45};a.set.currentTime=function(t){var i=t-e.player.api.duration;e.log("Seeking to "+MistUtil.format.time(t)+" ("+Math.round(i*-10)/10+"s from live)");e.video.currentTime=t};MistUtil.event.addListener(r,"progress",function(){e.player.api.lastProgress=new Date});e.player.api.lastProgress=new Date;e.player.api.liveOffset=0}}else{i.api=r}if(e.options.autoplay){r.setAttribute("autoplay","")}if(e.options.loop&&e.info.type!="live"){r.setAttribute("loop","")}if(e.options.poster){r.setAttribute("poster",e.options.poster)}if(e.options.muted){r.muted=true}if(e.options.controls=="stock"){r.setAttribute("controls","")}var s=dashjs.MediaPlayer().create();s.initialize(r,e.source.url,e.options.autoplay);i.dash=s;var o=["METRIC_ADDED","METRIC_CHANGED","METRICS_CHANGED","FRAGMENT_LOADING_STARTED","FRAGMENT_LOADING_COMPLETED","LOG","PLAYBACK_TIME_UPDATED","PLAYBACK_PROGRESS"];for(var n in dashjs.MediaPlayer.events){if(o.indexOf(n)<0){i.dash.on(dashjs.MediaPlayer.events[n],function(t){e.log("Player event fired: "+t.type)})}}e.player.setSize=function(e){this.api.style.width=e.width+"px";this.api.style.height=e.height+"px"};e.player.api.setSource=function(t){e.player.dash.attachSource(t)};var l=false;i.dash.on("allTextTracksAdded",function(){l=true});e.player.api.setSubtitle=function(t){if(!l){var r=function(){e.player.api.setSubtitle(t);i.dash.off("allTextTracksAdded",r)};i.dash.on("allTextTracksAdded",r);return}if(!t){i.dash.enableText(false);return}var a=i.dash.getTracksFor("text");for(var s in a){var o="idx"in t?t.idx:t.trackid;if(a[s].id==o){i.dash.setTextTrack(s);if(!i.dash.isTextEnabled()){i.dash.enableText()}return true}}return false};MistUtil.event.addListener(r,"progress",function(t){if(e.container.getAttribute("data-loading")=="stalled"){e.container.removeAttribute("data-loading")}});i.api.unload=function(){i.dash.reset()};e.log("Built html");t(r)};if("dashjs"in window){this.onDashLoad()}else{var r=MistUtil.scripts.insert(e.urlappend(mistplayers.dashjs.scriptsrc(e.options.host)),{onerror:function(t){var i="Failed to load dashjs.js";if(t.message){i+=": "+t.message}e.showError(i)},onload:i.onDashLoad},e)}};
|
|
@ -135,72 +135,6 @@ p.prototype.build = function (MistVideo,callback) {
|
||||||
MistVideo.player.dash.attachSource(url);
|
MistVideo.player.dash.attachSource(url);
|
||||||
};
|
};
|
||||||
|
|
||||||
//trackswitching
|
|
||||||
MistVideo.player.api.setTrack = function(type,id){
|
|
||||||
var meta = MistUtil.tracks.parse(MistVideo.info.meta.tracks);
|
|
||||||
if ((!(type in meta)) || ((!(id in meta[type]) && (id != "none")))) {
|
|
||||||
MistVideo.log("Skipping trackselection of "+type+" track "+id+" because it does not exist");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//figure out what the track number is
|
|
||||||
//for dash: 0 lowest bitrate, going up
|
|
||||||
//get the relevant tracks
|
|
||||||
var mistTracks = [];
|
|
||||||
for (var i in MistVideo.info.meta.tracks) {
|
|
||||||
var t = MistVideo.info.meta.tracks[i];
|
|
||||||
if (t.type == type) {
|
|
||||||
mistTracks.push(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//sort by bitrate
|
|
||||||
MistUtil.array.multiSort(mistTracks,["bps"]);
|
|
||||||
var n = false;
|
|
||||||
for (var i in mistTracks) {
|
|
||||||
var trackid = ("idx" in mistTracks[i] ? mistTracks[i].idx : mistTracks[i].trackid);
|
|
||||||
if (trackid == id) {
|
|
||||||
n = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (n === false) {
|
|
||||||
return false; //track not found
|
|
||||||
}
|
|
||||||
|
|
||||||
me.dash.setAutoSwitchQualityFor(type,false); //turn off ABR rules //TODO do we want this by default?
|
|
||||||
me.dash.setFastSwitchEnabled(true); //show the new track asap
|
|
||||||
me.dash.setQualityFor(type,n);
|
|
||||||
//dash does change the track, but is appended to the buffer, so it seems to take a while..
|
|
||||||
|
|
||||||
return true; //track found and change requested
|
|
||||||
}
|
|
||||||
|
|
||||||
//react to automatic trackswitching
|
|
||||||
me.dash.on("qualityChangeRendered",function(e){
|
|
||||||
//the newQuality-th track of type mediaType is being selected
|
|
||||||
|
|
||||||
//figure out the track id
|
|
||||||
//for dash: 0 lowest bitrate, going up
|
|
||||||
//get the relevant tracks
|
|
||||||
var mistTracks = [];
|
|
||||||
for (var i in MistVideo.info.meta.tracks) {
|
|
||||||
var t = MistVideo.info.meta.tracks[i];
|
|
||||||
if (t.type == e.mediaType) {
|
|
||||||
mistTracks.push(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//sort by bitrate
|
|
||||||
MistUtil.array.multiSort(mistTracks,["bps"]);
|
|
||||||
//get mist's id for the track
|
|
||||||
var id = ("idx" in mistTracks[e.newQuality] ? mistTracks[e.newQuality].idx : mistTracks[e.newQuality].trackid);
|
|
||||||
|
|
||||||
//create an event to pass this to the skin
|
|
||||||
MistUtil.event.send("playerUpdate_trackChanged",{
|
|
||||||
type: e.mediaType,
|
|
||||||
trackid: id
|
|
||||||
},MistVideo.video);
|
|
||||||
|
|
||||||
});
|
|
||||||
var subsloaded = false;
|
var subsloaded = false;
|
||||||
me.dash.on("allTextTracksAdded",function(){
|
me.dash.on("allTextTracksAdded",function(){
|
||||||
subsloaded = true;
|
subsloaded = true;
|
||||||
|
|
Loading…
Add table
Reference in a new issue