xgplayer-dash
Version:
xgplayer plugin for MPEG-DASH
141 lines (140 loc) • 5.21 kB
JavaScript
import { inherits as _inherits, createSuper as _createSuper, classCallCheck as _classCallCheck, createClass as _createClass } from "./_virtual/_rollupPluginBabelHelpers.js";
import EventEmitter from "eventemitter3";
import MPD from "./m4s/mpd.js";
import Task from "./media/task.js";
import MSE from "./media/mse.js";
import EME from "./media/eme.js";
var DASH = /* @__PURE__ */ function(_EventEmitter) {
_inherits(DASH2, _EventEmitter);
var _super = _createSuper(DASH2);
function DASH2(url) {
var _this;
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var video = arguments.length > 2 ? arguments[2] : void 0;
_classCallCheck(this, DASH2);
_this = _super.call(this);
_this.mse = void 0;
_this.url = url;
_this.inited = false;
if (video) {
_this.video = video;
}
if (options.dashOpts && options.dashOpts.drm) {
_this.eme = new EME(options.dashOpts.drm);
}
return _this;
}
_createClass(DASH2, [{
key: "getData",
value: function getData(url) {
var range = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [0];
return new Promise(function(resolve, reject) {
var task = new Task(url, resolve, range);
task.once("error", function(err) {
self.emit("error", err);
});
});
}
}, {
key: "init",
value: function init(url) {
var _this2 = this;
var mpd = new MPD(url);
this.mpd = mpd;
var dash = this;
var mse;
var vl, al;
return new Promise(function(resolve, reject) {
mpd.once("ready", function() {
dash.type = mpd.type;
vl = mpd.mediaList.video;
al = mpd.mediaList.audio;
if (dash.eme) {
dash.eme.setOptions("".concat(vl[vl.selectedIdx].mimeType, '; codecs="').concat(vl[vl.selectedIdx].codecs, '"'), "".concat(al[al.selectedIdx].mimeType, '; codecs="').concat(al[al.selectedIdx].codecs, '"'));
dash.eme.SetupEME(dash.video);
}
mse = new MSE();
mse.on("sourceopen", function() {
["video", "audio"].forEach(function(mediaType) {
var ml = mpd.mediaList[mediaType];
if (ml[ml.selectedIdx]) {
mse.addSourceBuffer("".concat(ml[ml.selectedIdx].mimeType, ';codecs="').concat(ml[ml.selectedIdx].codecs, '"'));
dash.getData(ml[ml.selectedIdx].initSegment, ml[ml.selectedIdx].initSegmentRange).then(function(initRes) {
mse.appendBuffer("".concat(ml[0].mimeType, ';codecs="').concat(ml[0].codecs, '"'), initRes);
mse.once("".concat(ml[ml.selectedIdx].mimeType, ';codecs="').concat(ml[ml.selectedIdx].codecs, '" updateend'), function() {
ml[ml.selectedIdx].inited = true;
mse.emit("updateend");
});
});
}
});
});
mse.on("updateend", function(e) {
if (vl[vl.selectedIdx] && vl[vl.selectedIdx].inited && al[al.selectedIdx] && al[al.selectedIdx].inited) {
dash.inited = true;
if (vl[vl.selectedIdx].encrypted || al[al.selectedIdx].encrypted) {
dash.eme.emit("encrypted");
}
if (dash.type === "vod") {
dash.seek(0);
dash.emit("startPlay");
}
}
});
mse.on("error", function(e) {
reject(e);
console.log("mse error");
});
dash.mse = mse;
resolve(mse);
});
mpd.once("end", function() {
if (_this2.type === "live") {
dash.mse.endOfStream();
}
});
});
}
}, {
key: "seek",
value: function seek(time) {
var dash = this;
var seekResult = this.mpd.seek(time);
["video", "audio"].forEach(function(mediaType) {
if (seekResult[mediaType] && seekResult[mediaType].length > 0) {
seekResult[mediaType].every(function(item) {
if (item.downloaded) {
return true;
}
new Task(item.url, function(res) {
if (res === "Not Found") {
if (!item.tryTimes) {
item.tryTimes = 0;
}
item.tryTimes++;
if (item.tryTimes <= 2) {
return true;
}
} else {
dash.mse.appendBuffer("".concat(dash.mpd.mediaList[mediaType][0].mimeType, ';codecs="').concat(dash.mpd.mediaList[mediaType][0].codecs, '"'), new Uint8Array(res));
}
var idx = item.idx;
var ml = dash.mpd.mediaList[mediaType];
ml[ml.selectedIdx].mediaSegments.every(function(sItem) {
if (sItem.idx !== idx) {
return true;
} else {
sItem.downloaded = true;
return false;
}
});
}, item.range);
return true;
});
}
});
}
}]);
return DASH2;
}(EventEmitter);
export { DASH as default };