xgplayer-dash
Version:
xgplayer plugin for MPEG-DASH
242 lines (241 loc) • 7.75 kB
JavaScript
import { inherits as _inherits, createSuper as _createSuper, createClass as _createClass, classCallCheck as _classCallCheck, assertThisInitialized as _assertThisInitialized, typeof as _typeof } from "./_virtual/_rollupPluginBabelHelpers.js";
import { Events, BasePlugin } from "xgplayer";
import DASH from "./dash.js";
import Task from "./media/task.js";
var errorHandle = function errorHandle2(player, err) {
err.vid = player.config.vid;
err.url = player.src;
if (err.errd && _typeof(err.errd) === "object") {
if (player.dash) {
err.errd.url = player.dash.url;
err.url = player.dash.url;
}
}
player.emit("DATA_REPORT", err);
if (err.errt === "network" && player.config._backupURL) {
player.src = player.config._backupURL;
} else {
player.src = player.config._mainURL;
}
player.switchURL = null;
player._replay = null;
};
var DashPlugin = /* @__PURE__ */ function(_BasePlugin) {
_inherits(DashPlugin2, _BasePlugin);
var _super = _createSuper(DashPlugin2);
function DashPlugin2(options) {
var _this;
_classCallCheck(this, DashPlugin2);
_this = _super.call(this, options);
_this.definitions = [];
_this.destroy = _this.destroy.bind(_assertThisInitialized(_this));
_this.timeUpdate = _this.timeUpdate.bind(_assertThisInitialized(_this));
_this.replay = _this.replay.bind(_assertThisInitialized(_this));
_this.initEvents();
return _this;
}
_createClass(DashPlugin2, [{
key: "initEvents",
value: function initEvents() {
this.on(Events.DESTROY, this.destroy);
this.on(Events.TIME_UPDATE, this.timeUpdate);
this.on(Events.REPLAY, this.replay);
}
}, {
key: "beforePlayerInit",
value: function beforePlayerInit() {
var _this2 = this;
var player = this.player, playerConfig = this.playerConfig;
if (this.config.drm) {
if (!navigator.requestMediaKeySystemAccess) {
console.log("EME API is not supported. Enable pref media.eme.enabled to true in about:config");
return;
}
}
var dash = new DASH(playerConfig.url, playerConfig, player.video);
return dash.init(playerConfig.url).then(function(res) {
if (!_this2.definitions.length) {
dash.mpd.mediaList.video.forEach(function(item) {
_this2.definitions.push({
name: item.height + "P",
url: item.id,
selected: false
});
});
_this2.definitions[0].selected = true;
}
player.emit("resourceReady", _this2.definitions);
var mse = res;
_this2.dash = dash;
_this2.mse = mse;
dash.on("error", function(err) {
errorHandle(player, err);
});
dash.once("startPlay", function() {
_this2.progressTimer = setInterval(function() {
_this2.timeUpdate();
}, 300);
});
try {
BasePlugin.defineGetterOrSetter(_this2.player, {
__url: {
get: function get() {
return _this2.mse.url;
}
}
});
} catch (e) {
}
});
}
}, {
key: "loadData",
value: function loadData() {
var time = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.player.currentTime;
var dash = this.dash;
var range = this.findRangeForPlaybackTime(time);
var appendTime = range && range.end || time;
if (appendTime > time + 15)
return;
dash.seek(appendTime);
}
}, {
key: "download",
value: function download() {
this.dash.download();
}
}, {
key: "findRangeForPlaybackTime",
value: function findRangeForPlaybackTime(time) {
var player = this.player;
var ranges = player.buffered;
if (!ranges)
return;
for (var i = 0; i < ranges.length; i++) {
if (ranges.start(i) <= time && ranges.end(i) >= time) {
return {
start: ranges.start(i),
end: ranges.end(i)
};
}
}
}
}, {
key: "switchURL",
value: function switchURL(url) {
var player = this.player;
player.config.url = url;
player.hasStart = false;
if (!player.paused) {
player.pause();
player.once("pause", function() {
player.start(url);
});
player.once("canplay", function() {
player.play();
});
} else {
player.start(url);
}
player.once("canplay", function() {
player.currentTime = 0;
});
}
}, {
key: "timeUpdate",
value: function timeUpdate() {
var player = this.player, dash = this.dash;
this.loadData(player.currentTime + 1);
this.isEnded(player, dash);
}
}, {
key: "switchBW",
value: function switchBW(idx) {
var _this3 = this;
var dash = this.dash;
idx = idx.split("/")[idx.split("/").length - 1];
var vl = dash.mpd.mediaList.video;
var newIdx = vl.selectedIdx;
vl.every(function(item, index) {
if (item.id === idx) {
newIdx = index;
dash.getData(vl[newIdx].initSegment, vl[newIdx].initSegmentRange).then(function(videoInitRes) {
changeBitWidth(videoInitRes);
});
return false;
} else {
return true;
}
});
var changeBitWidth = function changeBitWidth2(videoInitRes) {
var player = _this3.player;
var curTime = player.currentTime;
var temp = vl[vl.selectedIdx].mediaSegments.find(function(item) {
return item.start - curTime > 6;
});
var start = temp.start;
var end = player.getBufferedRange()[1];
if (end - start > 0 && BasePlugin.Sniffer.browser !== "safari") {
player.mse.removeBuffer("".concat(vl[0].mimeType, ';codecs="').concat(vl[0].codecs, '"'), start, end);
}
vl[vl.selectedIdx].mediaSegments.every(function(item) {
item.downloaded = false;
return true;
});
_this3.mse.appendBuffer("".concat(vl[0].mimeType, ';codecs="').concat(vl[0].codecs, '"'), videoInitRes);
_this3.mse.once("".concat(vl[0].mimeType, ';codecs="').concat(vl[0].codecs, '" updateend'), function() {
vl[newIdx].inited = true;
vl.selectedIdx = newIdx;
_this3.loadData((temp.start + temp.end) / 2);
});
};
}
}, {
key: "replay",
value: function replay() {
var player = this.player;
Task.clear();
var selectedIdx = this.dash.mpd.mediaList.video.selectedIdx;
this.definitions[selectedIdx].selected = true;
player.hasStart = false;
player.start();
this.once(Events.COMPLETE, function() {
player.play();
});
}
}, {
key: "isEnded",
value: function isEnded() {
var dash = this.dash, player = this.player, mse = this.mse;
if (dash.type === "vod") {
if (player.duration - player.currentTime < 2) {
var range = player.getBufferedRange();
if (player.currentTime - range[1] < 0.1) {
mse.endOfStream();
if (this.progressTimer) {
clearInterval(this.progressTimer);
this.progressTimer = null;
}
}
}
}
}
}, {
key: "destroy",
value: function destroy() {
if (this.dash) {
window.clearTimeout(this.dash.mpd.timer);
}
if (this.progressTimer) {
clearInterval(this.progressTimer);
}
}
}], [{
key: "pluginName",
get: function get() {
return "DashPlugin";
}
}]);
return DashPlugin2;
}(BasePlugin);
export { DashPlugin as default };