nsplayer
Version:
NSPlayer, a player which supports quality list of dash and hls
235 lines (177 loc) • 7.07 kB
JavaScript
'use strict';
var global = typeof self !== 'undefined' ? self : globalThis;
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
var Hls = require('hls.js');
var common = require('@newstudios/common');
var index = require('./index-773e68b1.js');
require('delegates');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
var Hls__default = /*#__PURE__*/_interopDefaultLegacy(Hls);
const supportMSE = typeof window === 'undefined' ? false : Hls__default["default"].isSupported();
class HlsPlayer extends index.CorePlayer {
constructor(video, source, fastSwitch = true, capLevelToPlayerSize = false) {
super(video, source);
_defineProperty__default["default"](this, "_nextLevel", -1);
_defineProperty__default["default"](this, "_initialBitrateMutable", this._register(new common.MutableDisposable()));
this._fastSwitchEnabled = fastSwitch;
if (supportMSE) {
const hlsPlayer = new Hls__default["default"]({
autoStartLoad: false,
capLevelToPlayerSize
});
this._hlsPlayer = hlsPlayer;
this._register(common.toDisposable(() => hlsPlayer.destroy()));
}
}
get levels() {
var _this$_hlsPlayer;
return ((_this$_hlsPlayer = this._hlsPlayer) === null || _this$_hlsPlayer === void 0 ? void 0 : _this$_hlsPlayer.levels) || [];
}
get currentLevel() {
if (this.ready) {
var _this$_hlsPlayer2, _this$_hlsPlayer3;
return (_this$_hlsPlayer2 = this._hlsPlayer) === null || _this$_hlsPlayer2 === void 0 ? void 0 : _this$_hlsPlayer2.levels[(_this$_hlsPlayer3 = this._hlsPlayer) === null || _this$_hlsPlayer3 === void 0 ? void 0 : _this$_hlsPlayer3.currentLevel];
} else {
var _this$_hlsPlayer4, _this$_hlsPlayer5;
return (_this$_hlsPlayer4 = this._hlsPlayer) === null || _this$_hlsPlayer4 === void 0 ? void 0 : _this$_hlsPlayer4.levels[(_this$_hlsPlayer5 = this._hlsPlayer) === null || _this$_hlsPlayer5 === void 0 ? void 0 : _this$_hlsPlayer5.startLevel];
}
}
get nextLevel() {
var _this$_hlsPlayer6;
if (!this._hlsPlayer) {
return undefined;
}
const nextLevelIndex = this._nextLevel < 0 ? this._fastSwitchEnabled ? this._hlsPlayer.nextLevel : this._hlsPlayer.nextLoadLevel : this._nextLevel;
return (_this$_hlsPlayer6 = this._hlsPlayer) === null || _this$_hlsPlayer6 === void 0 ? void 0 : _this$_hlsPlayer6.levels[nextLevelIndex];
}
get autoQualityEnabled() {
const hlsPlayer = this._hlsPlayer;
if (hlsPlayer) {
return this._nextLevel < 0;
}
return true;
}
levelToQuality(hlsLevel) {
const level = {
bitrate: hlsLevel.bitrate,
width: hlsLevel.width,
height: hlsLevel.height
};
if (hlsLevel.videoCodec) {
level.type = 'video';
}
return level;
}
findLevelIndexByQualityLevel(playLevel) {
// bitrate match
const idx = this.levels.findIndex(level => level.bitrate === playLevel.bitrate);
if (idx >= 0) {
return idx;
} // short side match
const shortSide = Math.min(playLevel.width, playLevel.height);
return this.levels.findIndex(level => Math.min(level.width, level.height) === shortSide);
}
setAutoQualityState(auto) {
const hlsPlayer = this._hlsPlayer;
if (!hlsPlayer) {
return;
}
if (auto) {
this._nextLevel = -1;
if (this._fastSwitchEnabled) {
hlsPlayer.nextLevel = -1;
} else {
hlsPlayer.loadLevel = -1;
}
} else {
this._nextLevel = hlsPlayer.nextLevel;
this._initialBitrateMutable.value = undefined;
}
}
setNextLevelIndex(index) {
const hlsPlayer = this._hlsPlayer;
if (!hlsPlayer) {
return;
}
if (!this.ready) {
this.log('setNextLevelIndex', 'start level:', index);
hlsPlayer.startLevel = index;
}
this._nextLevel = index;
if (this._nextLevel >= 0) {
if (this._fastSwitchEnabled) {
hlsPlayer.nextLevel = index;
} else {
hlsPlayer.loadLevel = index;
}
}
this._initialBitrateMutable.value = undefined;
}
onInit(video, source) {
const hlsPlayer = this._hlsPlayer;
if (hlsPlayer) {
const disposables = this._register(new common.DisposableStore());
const onManifestParsed = common.Event.fromNodeEventEmitter(hlsPlayer, Hls__default["default"].Events.MANIFEST_PARSED);
const onLevelsUpdated = common.Event.fromNodeEventEmitter(hlsPlayer, Hls__default["default"].Events.LEVEL_UPDATED);
const onLevelSwitched = common.Event.fromNodeEventEmitter(hlsPlayer, Hls__default["default"].Events.LEVEL_SWITCHED);
const onLevelSwitching = common.Event.fromNodeEventEmitter(hlsPlayer, Hls__default["default"].Events.LEVEL_SWITCHING);
onLevelsUpdated(this.updatePlayList, this, disposables);
onManifestParsed(this.updatePlayList, this, disposables);
onManifestParsed(() => {
hlsPlayer.startLoad();
video.autoplay && video.play();
this.setReady();
});
onLevelSwitching(this.updateNextQualityLevel, this, disposables);
onLevelSwitched(this.updateQualityLevel, this, disposables);
hlsPlayer.loadSource(source.src);
hlsPlayer.attachMedia(video);
} else {
video.src = source.src;
if (!video.canPlayType(source.mime)) {
common.onUnexpectedError(new Error('hlsplayer src not supported: ' + source.src + ', mime: ' + source.mime));
}
this.updatePlayList();
}
}
setInitialBitrate(bitrate) {
const hlsPlayer = this._hlsPlayer;
if (!hlsPlayer) {
return;
}
this._initialBitrateMutable.value = this.onOncePlayListReady(levels => {
let index = 0;
for (let i = 0; i < levels.length; i++) {
if (levels[i].bitrate <= bitrate) {
index = i;
} else {
break;
}
}
this.log('setInitialBitrate', 'async start level:', index);
hlsPlayer.startLevel = index; // hlsPlayer.nextLoadLevel = index
});
}
setCapLevelToPlayerSize(capLevelToPlayerSize) {
if (this._hlsPlayer) {
this.log('setCapLevelToPlayerSize', capLevelToPlayerSize);
this._hlsPlayer.capLevelToPlayerSize = capLevelToPlayerSize;
}
}
get capLevelToPlayerSize() {
var _this$_hlsPlayer$capL, _this$_hlsPlayer7;
return (_this$_hlsPlayer$capL = (_this$_hlsPlayer7 = this._hlsPlayer) === null || _this$_hlsPlayer7 === void 0 ? void 0 : _this$_hlsPlayer7.capLevelToPlayerSize) !== null && _this$_hlsPlayer$capL !== void 0 ? _this$_hlsPlayer$capL : false;
}
get bandwidthEstimate() {
var _this$_hlsPlayer8;
return ((_this$_hlsPlayer8 = this._hlsPlayer) === null || _this$_hlsPlayer8 === void 0 ? void 0 : _this$_hlsPlayer8.bandwidthEstimate) || NaN;
}
get name() {
return `HLSPlayer (${Hls__default["default"].version})`;
}
get supportAutoQuality() {
return true;
}
}
exports.HlsPlayer = HlsPlayer;