UNPKG

xgplayer-dash

Version:
141 lines (140 loc) 5.21 kB
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 };