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);
|
||||
},
|
||||
number: function(num) {
|
||||
if ((isNaN(Number(num))) || (num == 0)) { return num; }
|
||||
if ((isNaN(Number(num))) || (Number(num) == 0)) { return num; }
|
||||
|
||||
//rounding
|
||||
//use a significance of three, but don't round "visible" digits
|
||||
|
@ -58,10 +58,10 @@ var MistUtil = {
|
|||
|
||||
return num;
|
||||
},
|
||||
bytes: function(val){
|
||||
bytes: function(val,bits){
|
||||
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) {
|
||||
unit = suffix[0];
|
||||
}
|
||||
|
@ -77,6 +77,7 @@ var MistUtil = {
|
|||
}
|
||||
return this.number(val)+unit;
|
||||
},
|
||||
bits: function(val) { return this.bytes(val,true); },
|
||||
mime2human: function(mime){
|
||||
switch (mime) {
|
||||
case "html5/video/webm": {
|
||||
|
|
|
@ -367,6 +367,7 @@ p.prototype.build = function (MistVideo,callback) {
|
|||
//the last fragment has been added to the buffer
|
||||
var eObj;
|
||||
eObj = MistUtil.event.addListener(video,"waiting",function(e){
|
||||
player.sb.paused = true;
|
||||
MistUtil.event.send("ended",null,video);
|
||||
MistUtil.event.removeListener(eObj);
|
||||
});
|
||||
|
@ -378,7 +379,7 @@ p.prototype.build = function (MistVideo,callback) {
|
|||
var serverDelay = player.ws.serverDelay.get();
|
||||
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 (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) {
|
||||
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);
|
||||
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.updating || player.sb.queue.length || player.sb._busy) {
|
||||
player.sb.queue.push(data);
|
||||
|
@ -776,8 +780,6 @@ p.prototype.build = function (MistVideo,callback) {
|
|||
obj.type = "tracks";
|
||||
obj = MistUtil.object.extend({
|
||||
type: "tracks",
|
||||
audio: null,
|
||||
video: null,
|
||||
seek_time: Math.max(0,video.currentTime*1e3-(500+player.ws.serverDelay.get()))
|
||||
},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