UNPKG

nsplayer

Version:

NSPlayer, a player which supports quality list of dash and hls

235 lines (177 loc) 7.07 kB
'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;