Embed: mews: ABR
This commit is contained in:
parent
7ecb799d94
commit
d9d72aab99
4 changed files with 61 additions and 8 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -37,7 +37,7 @@ var MistUtil = {
|
||||||
return string.charAt(0).toUpperCase()+string.slice(1);
|
return string.charAt(0).toUpperCase()+string.slice(1);
|
||||||
},
|
},
|
||||||
number: function(num) {
|
number: function(num) {
|
||||||
if ((isNaN(Number(num))) || (num == 0)) { return num; }
|
if ((isNaN(Number(num))) || (Number(num) == 0)) { return num; }
|
||||||
|
|
||||||
//rounding
|
//rounding
|
||||||
//use a significance of three, but don't round "visible" digits
|
//use a significance of three, but don't round "visible" digits
|
||||||
|
@ -58,10 +58,10 @@ var MistUtil = {
|
||||||
|
|
||||||
return num;
|
return num;
|
||||||
},
|
},
|
||||||
bytes: function(val){
|
bytes: function(val,bits){
|
||||||
if (isNaN(Number(val))) { return val; }
|
if (isNaN(Number(val))) { return val; }
|
||||||
|
|
||||||
var suffix = ["bytes","KB","MB","GB","TB","PB"];
|
var suffix = bits ? ["bits","Kb","Mb","Gb","Tb","Pb"] : ["bytes","KB","MB","GB","TB","PB"];
|
||||||
if (val == 0) {
|
if (val == 0) {
|
||||||
unit = suffix[0];
|
unit = suffix[0];
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,7 @@ var MistUtil = {
|
||||||
}
|
}
|
||||||
return this.number(val)+unit;
|
return this.number(val)+unit;
|
||||||
},
|
},
|
||||||
|
bits: function(val) { return this.bytes(val,true); },
|
||||||
mime2human: function(mime){
|
mime2human: function(mime){
|
||||||
switch (mime) {
|
switch (mime) {
|
||||||
case "html5/video/webm": {
|
case "html5/video/webm": {
|
||||||
|
|
|
@ -367,6 +367,7 @@ p.prototype.build = function (MistVideo,callback) {
|
||||||
//the last fragment has been added to the buffer
|
//the last fragment has been added to the buffer
|
||||||
var eObj;
|
var eObj;
|
||||||
eObj = MistUtil.event.addListener(video,"waiting",function(e){
|
eObj = MistUtil.event.addListener(video,"waiting",function(e){
|
||||||
|
player.sb.paused = true;
|
||||||
MistUtil.event.send("ended",null,video);
|
MistUtil.event.send("ended",null,video);
|
||||||
MistUtil.event.removeListener(eObj);
|
MistUtil.event.removeListener(eObj);
|
||||||
});
|
});
|
||||||
|
@ -378,7 +379,7 @@ p.prototype.build = function (MistVideo,callback) {
|
||||||
var serverDelay = player.ws.serverDelay.get();
|
var serverDelay = player.ws.serverDelay.get();
|
||||||
var desiredBuffer = Math.max(500+serverDelay,serverDelay*2);
|
var desiredBuffer = Math.max(500+serverDelay,serverDelay*2);
|
||||||
if (MistVideo.info.type != "live") { desiredBuffer += 2000; } //if VoD, keep an extra 2 seconds of buffer
|
if (MistVideo.info.type != "live") { desiredBuffer += 2000; } //if VoD, keep an extra 2 seconds of buffer
|
||||||
if (player.debugging) console.log("on_time received",msg.data.current/1e3,"currtime",video.currentTime,requested_rate+"x","buffer",Math.round(buffer),"/",Math.round(desiredBuffer),(MistVideo.info.type == "live" ? "latency:"+Math.round(msg.data.end-video.currentTime*1e3)+"ms" : ""),"listeners",player.ws.listeners && player.ws.listeners.on_time ? player.ws.listeners.on_time : 0,"msgqueue",player.msgqueue ? player.msgqueue.length : 0,msg.data);
|
if (player.debugging) console.log("on_time received",msg.data.current/1e3,"currtime",video.currentTime,requested_rate+"x","buffer",Math.round(buffer),"/",Math.round(desiredBuffer),(MistVideo.info.type == "live" ? "latency:"+Math.round(msg.data.end-video.currentTime*1e3)+"ms" : ""),"bitrate:"+MistUtil.format.bits(player.monitor.currentBps)+"/s","listeners",player.ws.listeners && player.ws.listeners.on_time ? player.ws.listeners.on_time : 0,"msgqueue",player.msgqueue ? player.msgqueue.length : 0,msg.data);
|
||||||
|
|
||||||
if (!player.sb) {
|
if (!player.sb) {
|
||||||
MistVideo.log("Received on_time, but the source buffer is being cleared right now. Ignoring.");
|
MistVideo.log("Received on_time, but the source buffer is being cleared right now. Ignoring.");
|
||||||
|
@ -605,6 +606,9 @@ p.prototype.build = function (MistVideo,callback) {
|
||||||
}
|
}
|
||||||
var data = new Uint8Array(e.data);
|
var data = new Uint8Array(e.data);
|
||||||
if (data) {
|
if (data) {
|
||||||
|
for (var i in player.monitor.bitCounter) {
|
||||||
|
player.monitor.bitCounter[i] += e.data.byteLength*8;
|
||||||
|
}
|
||||||
if ((player.sb) && (!player.msgqueue)) {
|
if ((player.sb) && (!player.msgqueue)) {
|
||||||
if (player.sb.updating || player.sb.queue.length || player.sb._busy) {
|
if (player.sb.updating || player.sb.queue.length || player.sb._busy) {
|
||||||
player.sb.queue.push(data);
|
player.sb.queue.push(data);
|
||||||
|
@ -776,8 +780,6 @@ p.prototype.build = function (MistVideo,callback) {
|
||||||
obj.type = "tracks";
|
obj.type = "tracks";
|
||||||
obj = MistUtil.object.extend({
|
obj = MistUtil.object.extend({
|
||||||
type: "tracks",
|
type: "tracks",
|
||||||
audio: null,
|
|
||||||
video: null,
|
|
||||||
seek_time: Math.max(0,video.currentTime*1e3-(500+player.ws.serverDelay.get()))
|
seek_time: Math.max(0,video.currentTime*1e3-(500+player.ws.serverDelay.get()))
|
||||||
},obj);
|
},obj);
|
||||||
send(obj);
|
send(obj);
|
||||||
|
@ -935,4 +937,54 @@ p.prototype.build = function (MistVideo,callback) {
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//ABR: monitor playback issues and switch to lower bitrate track if available
|
||||||
|
this.monitor = {
|
||||||
|
bitCounter: [],
|
||||||
|
bitsSince: [],
|
||||||
|
currentBps: null,
|
||||||
|
nWaiting: 0,
|
||||||
|
nWaitingThreshold: 3,
|
||||||
|
listener: MistUtil.event.addListener(video,"waiting",function(){
|
||||||
|
player.monitor.nWaiting++;
|
||||||
|
|
||||||
|
if (player.monitor.nWaiting >= player.monitor.nWaitingThreshold) {
|
||||||
|
player.monitor.nWaiting = 0;
|
||||||
|
MistVideo.log("ABR threshold triggered, requesting lower quality");
|
||||||
|
player.monitor.action();
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
getBitRate: function(){
|
||||||
|
if (player.sb && !player.sb.paused) {
|
||||||
|
|
||||||
|
this.bitCounter.push(0);
|
||||||
|
this.bitsSince.push(new Date().getTime());
|
||||||
|
|
||||||
|
//calculate current bitrate
|
||||||
|
var bits, since;
|
||||||
|
if (this.bitCounter.length > 5) {
|
||||||
|
bits = player.monitor.bitCounter.shift();
|
||||||
|
since = this.bitsSince.shift();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bits = player.monitor.bitCounter[0];
|
||||||
|
since = this.bitsSince[0];
|
||||||
|
}
|
||||||
|
var dt = new Date().getTime() - since;
|
||||||
|
this.currentBps = bits / (dt*1e-3);
|
||||||
|
|
||||||
|
//console.log(MistUtil.format.bytes(this.currentBps)+"its/s");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MistVideo.timers.start(function(){
|
||||||
|
player.monitor.getBitRate();
|
||||||
|
},500);
|
||||||
|
},
|
||||||
|
action: function(){
|
||||||
|
player.api.setTracks({video:"max<"+Math.round(this.currentBps)+"bps"});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.monitor.getBitRate();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue