Embed: mews: ABR

This commit is contained in:
Cat 2021-05-31 14:31:04 +02:00 committed by Thulinma
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

View file

@ -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": {

View file

@ -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();
};