{"version":3,"file":"index.min.js","sources":["../../xgplayer-helper-utils/es/events/index.js","../../xgplayer-helper-models/es/remuxed-buffer.js","../../xgplayer-helper-models/es/data-view.js","../../xgplayer-helper-models/es/track.js","../../xgplayer-helper-models/es/u8a-buffer.js","../../xgplayer-helper-models/es/track-meta.js","../../xgplayer-helper-models/es/track-sample.js","../../xgplayer-helper-models/es/media-info.js","../../xgplayer-helper-models/es/flv-tag.js","../../xgplayer-helper-utils/node_modules/eventemitter3/index.js","../../xgplayer-helper-utils/es/context/index.js","../../xgplayer-helper-utils/es/mse/index.js","../../xgplayer-helper-utils/es/sniffer/index.js","../../xgplayer-helper-utils/es/loader-fetch/speed.js","../../xgplayer-helper-utils/es/loader-fetch/fetch-loader.js","../../xgplayer-helper-utils/es/common/dev-logger.js","../../xgplayer-helper-codec/es/aac/index.js","../../xgplayer-helper-codec/es/avc/golomb.js","../../xgplayer-helper-codec/es/avc/sps.js","../../xgplayer-helper-codec/es/avc/rbsp.js","../../xgplayer-helper-codec/es/avc/sei.js","../../xgplayer-helper-codec/es/avc/nalunit.js","../../xgplayer-helper-codec/es/hevc/golomb.js","../../xgplayer-helper-codec/es/hevc/sps.js","../../xgplayer-helper-codec/es/hevc/rbsp.js","../../xgplayer-helper-codec/es/hevc/sei.js","../../xgplayer-helper-codec/es/hevc/nalunit.js","../../xgplayer-helper-codec/es/compat/index.js","../../xgplayer-helper-codec/es/utf8/index.js","../../xgplayer-helper-transmuxers/es/flv/amf-parser.js","../../xgplayer-helper-transmuxers/node_modules/eventemitter3/index.js","../../xgplayer-helper-transmuxers/es/flv/demuxer.js","../../xgplayer-helper-transmuxers/es/flv/index.js","../../xgplayer-helper-transmuxers/node_modules/concat-typed-array/lib/concat.js","../../xgplayer-helper-transmuxers/node_modules/concat-typed-array/lib/index.js","../../xgplayer-helper-transmuxers/es/mp4-remux/buffer.js","../../xgplayer-helper-transmuxers/es/mp4-remux/fmp4.js","../../xgplayer-helper-transmuxers/es/mp4-remux/remuxer.js","../../xgplayer-helper-transmuxers/es/mp4-remux/index.js","../../xgplayer-flv-live/es/mse/flv-live.js","../../xgplayer-flv-live/es/mse/config.js","../../xgplayer-flv-live/es/mse/index.js","../../xgplayer-flv-live/es/mobile/flv-live-mobile.js","../../xgplayer-flv-live/es/mobile/config.js","../../xgplayer-flv-live/es/mobile/index.js","../../xgplayer-flv-live/es/index.js","../../xgplayer-flv-vod/es/flv-vod.js","../../xgplayer-flv-vod/es/index.js","../../xgplayer-helper-utils/es/common/func/debounce.js","../src/index.js"],"sourcesContent":["var BROWSER_EVENTS = {\n VISIBILITY_CHANGE: 'VISIBILITY_CHANGE'\n};\nvar PLAYER_EVENTS = {\n SEEK: 'SEEK'\n};\n\nvar LOADER_EVENTS = {\n LADER_START: 'LOADER_START',\n LOADER_DATALOADED: 'LOADER_DATALOADED',\n LOADER_COMPLETE: 'LOADER_COMPLETE',\n LOADER_RESPONSE_HEADERS: 'LOADER_RESPONSE_HEADERS',\n LOADER_ERROR: 'LOADER_ERROR',\n LOADER_RETRY: 'LOADER_RETRY',\n LOADER_TTFB: 'LOADER_TTFB'\n};\n\nvar DEMUX_EVENTS = {\n DEMUX_START: 'DEMUX_START',\n DEMUX_COMPLETE: 'DEMUX_COMPLETE',\n DEMUX_ERROR: 'DEMUX_ERROR',\n METADATA_PARSED: 'METADATA_PARSED',\n SEI_PARSED: 'SEI_PARSED',\n VIDEO_METADATA_CHANGE: 'VIDEO_METADATA_CHANGE',\n AUDIO_METADATA_CHANGE: 'AUDIO_METADATA_CHANGE',\n MEDIA_INFO: 'MEDIA_INFO',\n ISKEYFRAME: 'ISKEYFRAME'\n};\n\nvar REMUX_EVENTS = {\n REMUX_METADATA: 'REMUX_METADATA',\n REMUX_MEDIA: 'REMUX_MEDIA',\n MEDIA_SEGMENT: 'MEDIA_SEGMENT',\n REMUX_ERROR: 'REMUX_ERROR',\n INIT_SEGMENT: 'INIT_SEGMENT',\n DETECT_CHANGE_STREAM: 'DETECT_CHANGE_STREAM',\n DETECT_CHANGE_STREAM_DISCONTINUE: 'DETECT_CHANGE_STREAM_DISCONTINUE',\n DETECT_AUDIO_GAP: 'DETECT_AUDIO_GAP',\n DETECT_LARGE_GAP: 'DETECT_LARGE_GAP',\n DETECT_AUDIO_OVERLAP: 'DETECT_AUDIO_OVERLAP',\n RANDOM_ACCESS_POINT: 'RANDOM_ACCESS_POINT',\n DETECT_FRAG_ID_DISCONTINUE: 'DETECT_FRAG_ID_DISCONTINUE'\n};\n\nvar MSE_EVENTS = {\n SOURCE_UPDATE_END: 'SOURCE_UPDATE_END',\n MSE_ERROR: 'MSE_ERROR',\n MSE_WRONG_TRACK_ADD: 'MSE_WRONG_TRACK_ADD'\n\n // hls专有events\n};var HLS_EVENTS = {\n RETRY_TIME_EXCEEDED: 'RETRY_TIME_EXCEEDED'\n};\n\nvar CRYPTO_EVENTS = {\n START_DECRYPTOO: 'START_DECRYPTO',\n DECRYPTED: 'DECRYPTED'\n};\nvar ALLEVENTS = Object.assign({}, LOADER_EVENTS, DEMUX_EVENTS, REMUX_EVENTS, MSE_EVENTS, HLS_EVENTS, PLAYER_EVENTS, BROWSER_EVENTS);\n\nvar FlvAllowedEvents = [];\nvar HlsAllowedEvents = [];\n\nfor (var key in ALLEVENTS) {\n if (ALLEVENTS.hasOwnProperty(key)) {\n FlvAllowedEvents.push(ALLEVENTS[key]);\n }\n}\n\nfor (var _key in ALLEVENTS) {\n if (ALLEVENTS.hasOwnProperty(_key)) {\n HlsAllowedEvents.push(ALLEVENTS[_key]);\n }\n}\n\nexport default {\n ALLEVENTS: ALLEVENTS,\n HLS_EVENTS: HLS_EVENTS,\n REMUX_EVENTS: REMUX_EVENTS,\n DEMUX_EVENTS: DEMUX_EVENTS,\n MSE_EVENTS: MSE_EVENTS,\n LOADER_EVENTS: LOADER_EVENTS,\n FlvAllowedEvents: FlvAllowedEvents,\n HlsAllowedEvents: HlsAllowedEvents,\n CRYPTO_EVENTS: CRYPTO_EVENTS,\n PLAYER_EVENTS: PLAYER_EVENTS,\n BROWSER_EVENTS: BROWSER_EVENTS\n};","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexport var RemuxedBuffer = function RemuxedBuffer() {\n _classCallCheck(this, RemuxedBuffer);\n\n /** @type{string} */\n this.mimetype = '';\n /** @type{Uint8Array|null} */\n this.init = null;\n /** @type{Uint8Array[]} */\n this.data = [];\n /** @type{number} */\n this.bufferDuration = 0;\n};\n\nvar RemuxedBufferManager = function () {\n function RemuxedBufferManager() {\n _classCallCheck(this, RemuxedBufferManager);\n\n /** @type{Object.} */\n this.sources = {};\n }\n\n /**\n *\n * @param {string} name\n * @return {RemuxedBuffer}\n */\n\n\n _createClass(RemuxedBufferManager, [{\n key: 'getSource',\n value: function getSource(name) {\n return this.sources[name];\n }\n\n /**\n * @param {string} name\n * @return {RemuxedBuffer}\n */\n\n }, {\n key: 'createSource',\n value: function createSource(name) {\n this.sources[name] = new RemuxedBuffer();\n return this.sources[name];\n }\n }, {\n key: 'clear',\n value: function clear() {\n this.sources = {};\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.clear();\n }\n }]);\n\n return RemuxedBufferManager;\n}();\n\nexport default RemuxedBufferManager;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar XGDataView = function () {\n function XGDataView(buffer) {\n _classCallCheck(this, XGDataView);\n\n if (buffer instanceof ArrayBuffer) {\n /** @type {ArrayBuffer} */\n this.buffer = buffer;\n /** @type {DataView} */\n this.dataview = new DataView(buffer);\n /** @type {number} */\n this.dataview.position = 0;\n } else {\n throw new Error('data is invalid');\n }\n }\n\n /**\n * byffer length\n * @return {number}\n */\n\n\n _createClass(XGDataView, [{\n key: 'back',\n\n\n /**\n * move read position backward\n * @param count\n */\n value: function back(count) {\n this.position -= count;\n }\n\n /**\n * move read position forward\n * @param count\n */\n\n }, {\n key: 'skip',\n value: function skip(count) {\n var loop = Math.floor(count / 4);\n var last = count % 4;\n for (var i = 0; i < loop; i++) {\n XGDataView.readByte(this.dataview, 4);\n }\n if (last > 0) {\n XGDataView.readByte(this.dataview, last);\n }\n }\n\n /**\n * [readByte 从DataView中读取数据]\n * @param {DataView} buffer [DataView实例]\n * @param {Number} size [读取字节数]\n * @return {Number} [整数]\n */\n\n }, {\n key: 'readUint8',\n\n\n /**\n * @return {Number}\n */\n value: function readUint8() {\n return XGDataView.readByte(this.dataview, 1);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readUint16',\n value: function readUint16() {\n return XGDataView.readByte(this.dataview, 2);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readUint24',\n value: function readUint24() {\n return XGDataView.readByte(this.dataview, 3);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readUint32',\n value: function readUint32() {\n return XGDataView.readByte(this.dataview, 4);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readUint64',\n value: function readUint64() {\n return XGDataView.readByte(this.dataview, 8);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readInt8',\n value: function readInt8() {\n return XGDataView.readByte(this.dataview, 1, true);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readInt16',\n value: function readInt16() {\n return XGDataView.readByte(this.dataview, 2, true);\n }\n\n /**\n * @return {Number}\n */\n\n }, {\n key: 'readInt32',\n value: function readInt32() {\n return XGDataView.readByte(this.dataview, 4, true);\n }\n\n /**\n * @return {Uint8Array}\n */\n\n }, {\n key: 'writeUint32',\n value: function writeUint32(value) {\n return new Uint8Array([value >>> 24 & 0xff, value >>> 16 & 0xff, value >>> 8 & 0xff, value & 0xff]);\n }\n }, {\n key: 'length',\n get: function get() {\n return this.buffer.byteLength;\n }\n\n /**\n * set current read position of data-view\n * @param value\n */\n\n }, {\n key: 'position',\n set: function set(value) {\n this.dataview.position = value;\n }\n\n /**\n * set current read position of data-view\n * @param value\n */\n ,\n get: function get() {\n return this.dataview.position;\n }\n }], [{\n key: 'readByte',\n value: function readByte(buffer, size, sign) {\n var res = void 0;\n switch (size) {\n case 1:\n if (sign) {\n res = buffer.getInt8(buffer.position);\n } else {\n res = buffer.getUint8(buffer.position);\n }\n break;\n case 2:\n if (sign) {\n res = buffer.getInt16(buffer.position);\n } else {\n res = buffer.getUint16(buffer.position);\n }\n break;\n case 3:\n if (sign) {\n throw new Error('not supported for readByte 3');\n } else {\n res = buffer.getUint8(buffer.position) << 16;\n res |= buffer.getUint8(buffer.position + 1) << 8;\n res |= buffer.getUint8(buffer.position + 2);\n }\n break;\n case 4:\n if (sign) {\n res = buffer.getInt32(buffer.position);\n } else {\n res = buffer.getUint32(buffer.position);\n }\n break;\n case 8:\n if (sign) {\n throw new Error('not supported for readBody 8');\n } else {\n res = buffer.getUint32(buffer.position) << 32;\n res |= buffer.getUint32(buffer.position + 4);\n }\n break;\n default:\n res = '';\n }\n buffer.position += size;\n return res;\n }\n }]);\n\n return XGDataView;\n}();\n\nexport default XGDataView;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Track = function () {\n function Track() {\n _classCallCheck(this, Track);\n\n /** @type {number} */\n this.id = -1;\n /** @type {number} */\n this.sequenceNumber = 0;\n /** @type {*} */\n this.samples = [];\n /** @type {*} */\n this.droppedSamples = [];\n /** @type {number} */\n this.length = 0;\n }\n\n _createClass(Track, [{\n key: 'reset',\n value: function reset() {\n this.sequenceNumber = 0;\n this.samples = [];\n this.length = 0;\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.reset();\n this.id = -1;\n }\n }]);\n\n return Track;\n}();\n\nexport default Track;\n\n\nexport var AudioTrack = function (_Track) {\n _inherits(AudioTrack, _Track);\n\n function AudioTrack() {\n _classCallCheck(this, AudioTrack);\n\n /** @type {string} */\n var _this = _possibleConstructorReturn(this, (AudioTrack.__proto__ || Object.getPrototypeOf(AudioTrack)).call(this));\n\n _this.TAG = 'AudioTrack';\n /** @type {string} */\n _this.type = 'audio';\n return _this;\n }\n\n return AudioTrack;\n}(Track);\n\nexport var VideoTrack = function (_Track2) {\n _inherits(VideoTrack, _Track2);\n\n function VideoTrack() {\n _classCallCheck(this, VideoTrack);\n\n /** @type {string} */\n var _this2 = _possibleConstructorReturn(this, (VideoTrack.__proto__ || Object.getPrototypeOf(VideoTrack)).call(this));\n\n _this2.TAG = 'VideoTrack';\n /** @type {string} */\n _this2.type = 'video';\n /** @type {number} */\n _this2.dropped = 0;\n /** @type {number} */\n _this2.sequenceNumber = 0;\n return _this2;\n }\n\n _createClass(VideoTrack, [{\n key: 'reset',\n value: function reset() {\n this.sequenceNumber = 0;\n this.samples = [];\n this.length = 0;\n this.dropped = 0;\n }\n }]);\n\n return VideoTrack;\n}(Track);\n\nexport var Tracks = function () {\n function Tracks() {\n _classCallCheck(this, Tracks);\n\n this.audioTrack = null;\n this.videoTrack = null;\n }\n\n _createClass(Tracks, [{\n key: 'destroy',\n value: function destroy() {\n this.audioTrack = null;\n this.videoTrack = null;\n }\n }]);\n\n return Tracks;\n}();","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar XgBuffer = function () {\n /**\n * A buffer to store loaded data.\n *\n * @class LoaderBuffer\n * @param {number} length - Optional the buffer size\n */\n function XgBuffer(length) {\n _classCallCheck(this, XgBuffer);\n\n this.length = length || 0;\n this.historyLen = length || 0;\n this.array = [];\n this.offset = 0;\n }\n\n /**\n * The function to push data.\n *\n * @param {Uint8Array} data - The data to push into the buffer\n */\n\n\n _createClass(XgBuffer, [{\n key: \"push\",\n value: function push(data) {\n this.array.push(data);\n this.length += data.byteLength;\n this.historyLen += data.byteLength;\n }\n\n /**\n * The function to shift data.\n *\n * @param {number} length - The size of shift.\n */\n\n }, {\n key: \"shift\",\n value: function shift(length) {\n if (this.array.length < 1) {\n return new Uint8Array(0);\n }\n\n if (length === undefined) {\n return this._shiftBuffer();\n }\n if (this.offset + length === this.array[0].length) {\n var _ret = this.array[0].slice(this.offset, this.offset + length);\n this.offset = 0;\n this.array.shift();\n this.length -= length;\n return _ret;\n }\n\n if (this.offset + length < this.array[0].length) {\n var _ret2 = this.array[0].slice(this.offset, this.offset + length);\n this.offset += length;\n this.length -= length;\n return _ret2;\n }\n\n var ret = new Uint8Array(length);\n var tmpoff = 0;\n while (this.array.length > 0 && length > 0) {\n if (this.offset + length < this.array[0].length) {\n var tmp = this.array[0].slice(this.offset, this.offset + length);\n ret.set(tmp, tmpoff);\n this.offset += length;\n this.length -= length;\n length = 0;\n break;\n } else {\n // console.log('mark1')\n var templength = this.array[0].length - this.offset;\n ret.set(this.array[0].slice(this.offset, this.array[0].length), tmpoff);\n this.array.shift();\n this.offset = 0;\n tmpoff += templength;\n this.length -= templength;\n length -= templength;\n }\n }\n return ret;\n }\n\n /**\n * Function to clear the buffer.\n */\n\n }, {\n key: \"clear\",\n value: function clear() {\n this.array = [];\n this.length = 0;\n this.offset = 0;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.clear();\n this.historyLen = 0;\n }\n\n /**\n * Function to shift one unit8Array.\n */\n\n }, {\n key: \"_shiftBuffer\",\n value: function _shiftBuffer() {\n this.length -= this.array[0].length;\n this.offset = 0;\n return this.array.shift();\n }\n\n /**\n * Convert uint8 data to number.\n *\n * @param {number} start - the start postion.\n * @param {number} length - the length of data.\n */\n\n }, {\n key: \"toInt\",\n value: function toInt(start, length) {\n var retInt = 0;\n var i = this.offset + start;\n while (i < this.offset + length + start) {\n if (i < this.array[0].length) {\n retInt = retInt * 256 + this.array[0][i];\n } else if (this.array[1]) {\n retInt = retInt * 256 + this.array[1][i - this.array[0].length];\n }\n\n i++;\n }\n return retInt;\n }\n }]);\n\n return XgBuffer;\n}();\n\nexport default XgBuffer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexport var AudioTrackMeta = function () {\n function AudioTrackMeta(meta) {\n _classCallCheck(this, AudioTrackMeta);\n\n var _default = {\n sampleRate: 48000,\n channelCount: 2,\n codec: 'mp4a.40.2',\n config: [41, 401, 136, 0],\n duration: 0,\n id: 2,\n refSampleDuration: 21,\n sampleRateIndex: 3,\n timescale: 1000,\n type: 'audio'\n };\n if (meta) {\n return Object.assign({}, _default, meta);\n }\n return _default;\n }\n\n _createClass(AudioTrackMeta, [{\n key: 'destroy',\n value: function destroy() {\n this.init = null;\n }\n }]);\n\n return AudioTrackMeta;\n}();\n\nexport var VideoTrackMeta = function () {\n function VideoTrackMeta(meta) {\n _classCallCheck(this, VideoTrackMeta);\n\n var _default = {\n avcc: null,\n sps: new Uint8Array(0),\n pps: new Uint8Array(0),\n chromaFormat: 420,\n codec: 'avc1.640020',\n codecHeight: 720,\n codecWidth: 1280,\n duration: 0,\n frameRate: {\n fixed: true,\n fps: 25,\n fps_num: 25000,\n fps_den: 1000\n },\n id: 1,\n level: '3.2',\n presentHeight: 720,\n presentWidth: 1280,\n profile: 'High',\n refSampleDuration: 40,\n parRatio: {\n height: 1,\n width: 1\n },\n timescale: 1000,\n type: 'video'\n };\n\n if (meta) {\n return Object.assign({}, _default, meta);\n }\n return _default;\n }\n\n _createClass(VideoTrackMeta, [{\n key: 'destroy',\n value: function destroy() {\n this.init = null;\n this.sps = null;\n this.pps = null;\n }\n }]);\n\n return VideoTrackMeta;\n}();","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {Object} TAudioSample\n * @property {number} dts\n * @property {number} pts\n * @property {number} originDts\n * @property {Uint8Array} data\n */\n\n/**\n * @typedef {Object} TVideoSample\n * @property {number} dts\n * @property {number} pts\n * @property {boolean} isKeyframe\n * @property {number} originDts\n * @property {Uint8Array} data\n * @property {Array} nals\n */\n\nexport var AudioSample = function () {\n function AudioSample(info) {\n _classCallCheck(this, AudioSample);\n\n var _default = AudioSample.getDefault();\n if (!info) {\n return _default;\n }\n return Object.assign({}, _default, info);\n }\n\n /**\n * default audio sample\n * @return {TAudioSample}\n */\n\n\n _createClass(AudioSample, null, [{\n key: \"getDefault\",\n value: function getDefault() {\n return {\n dts: -1,\n pts: -1,\n originDts: -1,\n data: new Uint8Array()\n };\n }\n }]);\n\n return AudioSample;\n}();\n\nexport var VideoSample = function () {\n /**\n * @constructor\n * @param info\n * @return {TVideoSample}\n */\n function VideoSample(info) {\n _classCallCheck(this, VideoSample);\n\n var _default = VideoSample.getDefault();\n\n if (!info) {\n return _default;\n }\n var sample = Object.assign({}, _default, info);\n\n return sample;\n }\n\n /**\n * default video sample\n * @return {TVideoSample}\n */\n\n\n _createClass(VideoSample, null, [{\n key: \"getDefault\",\n value: function getDefault() {\n return {\n dts: -1,\n pts: undefined,\n isKeyframe: false, // is Random access point\n originDts: -1,\n data: new Uint8Array(),\n nals: []\n };\n }\n }]);\n\n return VideoSample;\n}();","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {Object} VideoMediaInfo\n * @property {string|null} codec\n * @property {number|null} width\n * @property {number|null} height\n * @property {string|null} profile\n * @property {{fixed: boolean,fps: number,fps_num: number,fps_den: number}} frameRate\n * @property {string|null} chromaFormat\n * @property {{width:number,height:number}} parRatio\n */\n\n/**\n * @typedef {Object} AudioMediaInfo\n * @property {string|null} codec\n * @property {number|null} sampleRate\n * @property {number|null} sampleRateIndex\n * @property {number|null} channelCount\n */\n\n/**\n * @param {Object} obj\n * @return {boolean}\n */\nvar isObjectFilled = function isObjectFilled(obj) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (obj[key] === null) {\n return false;\n }\n }\n }\n return true;\n};\n\nvar MediaInfo = function () {\n function MediaInfo() {\n _classCallCheck(this, MediaInfo);\n\n this.mimeType = null;\n this.duration = null;\n\n /** @type {boolean} */\n this.hasVideo = false;\n /**\n * video media info\n * @type {VideoMediaInfo}\n */\n this.video = {\n codec: null,\n width: null,\n height: null,\n profile: null,\n level: null,\n frameRate: {\n fixed: true,\n fps: 25,\n fps_num: 25000,\n fps_den: 1000\n },\n chromaFormat: null,\n parRatio: {\n width: 1,\n height: 1\n }\n /** @type {boolean} */\n };this.hasAudio = false;\n\n /**\n * video media info\n * @type {AudioMediaInfo}\n */\n this.audio = {\n codec: null,\n sampleRate: null,\n sampleRateIndex: null,\n channelCount: null\n };\n }\n\n _createClass(MediaInfo, [{\n key: \"isComplete\",\n value: function isComplete() {\n return MediaInfo.isBaseInfoReady(this) && MediaInfo.isVideoReady(this) && MediaInfo.isAudioReady(this);\n }\n }], [{\n key: \"isBaseInfoReady\",\n value: function isBaseInfoReady(mediaInfo) {\n return isObjectFilled(mediaInfo);\n }\n }, {\n key: \"isVideoReady\",\n value: function isVideoReady(mediaInfo) {\n if (!mediaInfo.hasVideo) {\n return true;\n }\n\n return isObjectFilled(mediaInfo.video);\n }\n }, {\n key: \"isAudioReady\",\n value: function isAudioReady(mediaInfo) {\n if (!mediaInfo.hasAudio) {\n return true;\n }\n\n return isObjectFilled(mediaInfo.video);\n }\n }]);\n\n return MediaInfo;\n}();\n\nexport default MediaInfo;","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar FlvTag = function FlvTag() {\n _classCallCheck(this, FlvTag);\n\n /** @type {number} */\n this.filtered = -1;\n /** @type {number} */\n this.tagType = -1;\n /** @type {number} */\n this.datasize = -1;\n /** @type {number} */\n this.dts = -1;\n};\n\nexport default FlvTag;","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport EVENTS from '../events';\nimport { MediaInfo } from 'xgplayer-helper-models';\nimport EventEmitter from 'eventemitter3';\n\nvar DIRECT_EMIT_FLAG = '__TO__';\n\nvar Context = function () {\n /**\n *\n * @param {*} player\n * @param {*} configs\n * @param {string[]}allowedEvents\n */\n function Context(player, configs) {\n var allowedEvents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n _classCallCheck(this, Context);\n\n this._emitter = new EventEmitter();\n if (!this._emitter.off) {\n this._emitter.off = this._emitter.removeListener;\n }\n\n this.mediaInfo = new MediaInfo();\n this._instanceMap = {}; // 所有的解码流程实例\n this._clsMap = {}; // 构造函数的map\n this._inited = false;\n this.allowedEvents = allowedEvents;\n this._configs = configs;\n this._player = player;\n this._hooks = {}; // 注册在事件前/后的钩子,例如 before('DEMUX_COMPLETE')\n }\n\n /**\n * 从上下文中获取解码流程实例,如果没有实例,构造一个\n * @param {string} tag\n * @returns {*}\n */\n\n\n _createClass(Context, [{\n key: 'getInstance',\n value: function getInstance(tag) {\n var instance = this._instanceMap[tag];\n if (instance) {\n return instance;\n } else {\n // throw new Error(`${tag}实例尚未初始化`)\n return null;\n }\n }\n\n /**\n * 初始化具体实例\n * @param {string} tag\n * @param {any[]}args\n */\n\n }, {\n key: 'initInstance',\n value: function initInstance(tag) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var a = args[0],\n b = args[1],\n c = args[2],\n d = args[3];\n\n if (this._clsMap[tag]) {\n var newInstance = new this._clsMap[tag](a, b, c, d);\n this._instanceMap[tag] = newInstance;\n if (newInstance.init) {\n newInstance.init(); // TODO: lifecircle\n }\n return newInstance;\n } else {\n throw new Error(tag + '\\u672A\\u5728context\\u4E2D\\u6CE8\\u518C');\n }\n }\n\n /**\n * 避免大量的initInstance调用,初始化所有的组件\n * @param {*} config\n */\n\n }, {\n key: 'init',\n value: function init(config) {\n if (this._inited) {\n return;\n }\n for (var tag in this._clsMap) {\n // if not inited, init an instance\n if (this._clsMap.hasOwnProperty(tag) && !this._instanceMap[tag]) {\n this.initInstance(tag, config);\n }\n }\n this._inited = true;\n }\n\n /**\n * 注册一个上下文流程,提供安全的事件发送机制\n * @param {string} tag\n * @param {*} cls\n */\n\n }, {\n key: 'registry',\n value: function registry(tag, cls) {\n var _this2 = this;\n\n var emitter = this._emitter;\n var checkMessageName = this._isMessageNameValid.bind(this);\n var self = this;\n var enhanced = function (_cls) {\n _inherits(enhanced, _cls);\n\n function enhanced(a, b, c) {\n _classCallCheck(this, enhanced);\n\n var _this = _possibleConstructorReturn(this, (enhanced.__proto__ || Object.getPrototypeOf(enhanced)).call(this, a, b, c));\n\n _this.listeners = {};\n _this.onceListeners = {};\n _this.TAG = tag;\n _this._context = self;\n return _this;\n }\n\n /**\n * @param {string} messageName\n * @param {function} callback\n */\n\n\n _createClass(enhanced, [{\n key: 'on',\n value: function on(messageName, callback) {\n checkMessageName(messageName);\n\n if (this.listeners[messageName]) {\n this.listeners[messageName].push(callback);\n } else {\n this.listeners[messageName] = [callback];\n }\n\n emitter.on('' + messageName + DIRECT_EMIT_FLAG + tag, callback); // 建立定向通信监听\n return emitter.on(messageName, callback);\n }\n\n /**\n * @param {string} messageName\n * @param {function} callback\n */\n\n }, {\n key: 'before',\n value: function before(messageName, callback) {\n checkMessageName(messageName);\n if (self._hooks[messageName]) {\n self._hooks[messageName].push(callback);\n } else {\n self._hooks[messageName] = [callback];\n }\n }\n\n /**\n * @param {string} messageName\n * @param {function} callback\n */\n\n }, {\n key: 'once',\n value: function once(messageName, callback) {\n checkMessageName(messageName);\n\n if (this.onceListeners[messageName]) {\n this.onceListeners[messageName].push(callback);\n } else {\n this.onceListeners[messageName] = [callback];\n }\n\n emitter.once('' + messageName + DIRECT_EMIT_FLAG + tag, callback);\n return emitter.once(messageName, callback);\n }\n\n /**\n * @param {string} messageName\n * @param {any[]} args\n */\n\n }, {\n key: 'emit',\n value: function emit(messageName) {\n checkMessageName(messageName);\n // console.log('emit ', messageName);\n\n var beforeList = self._hooks ? self._hooks[messageName] : null;\n\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n if (beforeList) {\n for (var i = 0, len = beforeList.length; i < len; i++) {\n var callback = beforeList[i];\n // eslint-disable-next-line standard/no-callback-literal\n callback.apply(undefined, args);\n }\n }\n return emitter.emit.apply(emitter, [messageName].concat(args));\n }\n\n /**\n * 定向发送给某个组件单例的消息\n * @param {string} messageName\n * @param {any[]} args\n */\n\n }, {\n key: 'emitTo',\n value: function emitTo(tag, messageName) {\n checkMessageName(messageName);\n\n for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n args[_key3 - 2] = arguments[_key3];\n }\n\n return emitter.emit.apply(emitter, ['' + messageName + DIRECT_EMIT_FLAG + tag].concat(args));\n }\n\n /**\n * 定向发送给某个组件单例的消息\n * @param {string} messageName\n * @param {function} callback\n */\n\n }, {\n key: 'off',\n value: function off(messageName, callback) {\n checkMessageName(messageName);\n return emitter.off(messageName, callback);\n }\n }, {\n key: 'removeListeners',\n value: function removeListeners() {\n var hasOwn = Object.prototype.hasOwnProperty.bind(this.listeners);\n\n for (var messageName in this.listeners) {\n if (hasOwn(messageName)) {\n var callbacks = this.listeners[messageName] || [];\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n emitter.off(messageName, callback);\n emitter.off('' + messageName + DIRECT_EMIT_FLAG + tag, callback);\n }\n }\n }\n\n for (var _messageName in this.onceListeners) {\n if (hasOwn(_messageName)) {\n var _callbacks = this.onceListeners[_messageName] || [];\n for (var _i = 0; _i < _callbacks.length; _i++) {\n var _callback = _callbacks[_i];\n emitter.off(_messageName, _callback);\n emitter.off('' + _messageName + DIRECT_EMIT_FLAG + tag, _callback);\n }\n }\n }\n }\n\n /**\n * 在组件销毁时,默认将它注册的事件全部卸载,确保不会造成内存泄漏\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n // step1 unlisten events\n this.removeListeners();\n this.listeners = {};\n // step2 release from context\n delete self._instanceMap[tag];\n if (_get(enhanced.prototype.__proto__ || Object.getPrototypeOf(enhanced.prototype), 'destroy', this)) {\n return _get(enhanced.prototype.__proto__ || Object.getPrototypeOf(enhanced.prototype), 'destroy', this).call(this);\n }\n this._context = null;\n }\n }, {\n key: '_player',\n get: function get() {\n if (!this._context) {\n return null;\n }\n return this._context._player;\n },\n set: function set(v) {\n if (this._context) {\n this._context._player = v;\n }\n }\n }, {\n key: '_pluginConfig',\n get: function get() {\n if (!this._context) {\n return null;\n }\n return this._context._configs;\n }\n }]);\n\n return enhanced;\n }(cls);\n this._clsMap[tag] = enhanced;\n\n /**\n * get instance immediately\n * e.g const instance = context.registry(tag, Cls)(config)\n * */\n return function () {\n for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return _this2.initInstance.apply(_this2, [tag].concat(args));\n };\n }\n\n /**\n * 各个模块处理seek\n * @param {number} time\n */\n\n }, {\n key: 'seek',\n value: function seek(time) {\n this._emitter.emit(EVENTS.PLAYER_EVENTS.SEEK, time);\n }\n\n /**\n * 对存在的实例进行\n */\n\n }, {\n key: 'destroyInstances',\n value: function destroyInstances() {\n var _this3 = this;\n\n Object.keys(this._instanceMap).forEach(function (tag) {\n if (_this3._instanceMap[tag].destroy) {\n _this3._instanceMap[tag].destroy();\n }\n });\n }\n\n /**\n * 编解码流程无需关注事件的解绑\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n this.destroyInstances();\n if (this._emitter) {\n this._emitter.removeAllListeners();\n }\n this._emitter = null;\n this.allowedEvents = [];\n this._clsMap = null;\n this._hooks = null;\n this._player = null;\n this._configs = null;\n }\n\n /**\n * 对信道进行收拢\n * @param {string} messageName\n * @private\n */\n\n }, {\n key: '_isMessageNameValid',\n value: function _isMessageNameValid(messageName) {\n if (!this.allowedEvents.indexOf(messageName) < 0) {\n throw new Error('unregistered message name: ' + messageName);\n }\n }\n }]);\n\n return Context;\n}();\n\nexport default Context;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport EVENTS from '../events';\n\nvar MSE_EVENTS = EVENTS.MSE_EVENTS;\n\nvar MSE = function () {\n function MSE(configs, context) {\n _classCallCheck(this, MSE);\n\n if (context) {\n this._context = context;\n this.emit = context._emitter.emit.bind(context._emitter);\n }\n\n this.TAG = 'MSE';\n\n this.configs = Object.assign({}, configs);\n this.container = this.configs.container;\n this.format = this.configs.format; // hls | flv\n this.mediaSource = null;\n this.sourceBuffers = {};\n this.preloadTime = this.configs.preloadTime || 1;\n this.onSourceOpen = this.onSourceOpen.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n this.onUpdateEnd = this.onUpdateEnd.bind(this);\n this.onWaiting = this.onWaiting.bind(this);\n this.opened = false;\n }\n\n _createClass(MSE, [{\n key: 'init',\n value: function init() {\n // eslint-disable-next-line no-undef\n this.mediaSource = new self.MediaSource();\n this.mediaSource.addEventListener('sourceopen', this.onSourceOpen);\n this._url = null;\n this.container.addEventListener('timeupdate', this.onTimeUpdate);\n this.container.addEventListener('waiting', this.onWaiting);\n }\n }, {\n key: 'resetContext',\n value: function resetContext(newCtx, keepBuffer) {\n this._context = newCtx;\n this.emit = newCtx._emitter.emit.bind(newCtx._emitter);\n if (!keepBuffer) {\n for (var i = 0; i < Object.keys(this.sourceBuffers).length; i++) {\n var buffer = this.sourceBuffers[Object.keys(this.sourceBuffers)[i]];\n if (!buffer.updating) {\n MSE.clearBuffer(buffer);\n }\n }\n }\n }\n }, {\n key: 'onTimeUpdate',\n value: function onTimeUpdate() {\n this.emit('TIME_UPDATE', this.container);\n }\n }, {\n key: 'onWaiting',\n value: function onWaiting() {\n this.emit('WAITING', this.container);\n }\n }, {\n key: 'onSourceOpen',\n value: function onSourceOpen() {\n this.opened = true;\n this.addSourceBuffers();\n }\n }, {\n key: 'onUpdateEnd',\n value: function onUpdateEnd() {\n this.emit(MSE_EVENTS.SOURCE_UPDATE_END);\n this.doAppend();\n }\n }, {\n key: 'addSourceBuffers',\n value: function addSourceBuffers() {\n if (!this.mediaSource || this.mediaSource.readyState !== 'open' || !this.opened) {\n return;\n }\n var sources = this._context.getInstance('PRE_SOURCE_BUFFER');\n var tracks = this._context.getInstance('TRACKS');\n var track = void 0;\n if (!sources || !tracks) {\n return;\n }\n\n sources = sources.sources;\n var add = false;\n for (var i = 0, k = Object.keys(sources).length; i < k; i++) {\n var type = Object.keys(sources)[i];\n add = false;\n if (type === 'audio') {\n track = tracks.audioTrack;\n } else if (type === 'video') {\n track = tracks.videoTrack;\n // return;\n }\n if (track && sources[type].init !== null && sources[type].data.length) {\n add = true;\n }\n }\n\n if (add) {\n if (Object.keys(this.sourceBuffers).length > 1) {\n return;\n }\n for (var _i = 0, _k = Object.keys(sources).length; _i < _k; _i++) {\n var _type = Object.keys(sources)[_i];\n if (this.sourceBuffers[_type]) {\n continue;\n }\n var source = sources[_type];\n var mime = _type === 'video' ? 'video/mp4;codecs=' + source.mimetype : 'audio/mp4;codecs=' + source.mimetype;\n\n try {\n // console.log('add sourcebuffer', mime);\n var sourceBuffer = this.mediaSource.addSourceBuffer(mime);\n this.sourceBuffers[_type] = sourceBuffer;\n sourceBuffer.addEventListener('updateend', this.onUpdateEnd);\n } catch (e) {\n if (e.code === 22 && Object.keys(this.sourceBuffers).length > 0) {\n return this.emit(MSE_EVENTS.MSE_WRONG_TRACK_ADD, _type);\n }\n this.emit(MSE_EVENTS.MSE_ERROR, this.TAG, new Error(e.message));\n }\n }\n if (Object.keys(this.sourceBuffers).length === this.sourceBufferLen) {\n this.doAppend();\n }\n }\n }\n }, {\n key: 'doAppend',\n value: function doAppend() {\n if (!this.mediaSource || this.mediaSource.readyState === 'closed') return;\n this._doCleanupSourceBuffer();\n var sources = this._context.getInstance('PRE_SOURCE_BUFFER');\n if (!sources) return;\n if (Object.keys(this.sourceBuffers).length < this.sourceBufferLen) {\n return;\n }\n for (var i = 0; i < Object.keys(this.sourceBuffers).length; i++) {\n var type = Object.keys(this.sourceBuffers)[i];\n var sourceBuffer = this.sourceBuffers[type];\n if (sourceBuffer.updating) continue;\n var source = sources.sources[type];\n if (this['no' + type]) {\n source.data = [];\n source.init.buffer = null;\n continue;\n }\n if (source && !source.inited) {\n try {\n // console.log('append init buffer: ', type)\n sourceBuffer.appendBuffer(source.init.buffer.buffer);\n source.inited = true;\n } catch (e) {\n // DO NOTHING\n }\n } else if (source) {\n var data = source.data.shift();\n if (data) {\n try {\n // console.log('append buffer: ', type);\n sourceBuffer.appendBuffer(data.buffer.buffer);\n } catch (e) {\n source.data.unshift(data);\n }\n }\n }\n }\n }\n }, {\n key: 'endOfStream',\n value: function endOfStream() {\n try {\n var readyState = this.mediaSource.readyState;\n\n if (readyState === 'open') {\n this.mediaSource.endOfStream();\n }\n } catch (e) {}\n }\n }, {\n key: 'remove',\n value: function remove(end) {\n var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n try {\n for (var i = 0; i < Object.keys(this.sourceBuffers).length; i++) {\n var buffer = this.sourceBuffers[Object.keys(this.sourceBuffers)[i]];\n if (!buffer.updating) {\n if (end > start) {\n buffer.remove(start, end);\n }\n }\n }\n } catch (e) {}\n }\n }, {\n key: '_doCleanupSourceBuffer',\n value: function _doCleanupSourceBuffer() {\n var currentTime = this.container.currentTime;\n var autoCleanupMinBackwardDuration = 60 * 3;\n var _pendingRemoveRanges = {\n video: [],\n audio: []\n };\n for (var i = 0; i < Object.keys(this.sourceBuffers).length; i++) {\n var type = Object.keys(this.sourceBuffers)[i];\n var sourceBuffer = this.sourceBuffers[type];\n var buffered = sourceBuffer.buffered;\n var doRemove = false;\n for (var j = 0; j < buffered.length; j++) {\n var start = buffered.start(j);\n var end = buffered.end(j);\n if (start <= currentTime && currentTime < end + 3) {\n if (currentTime - start >= autoCleanupMinBackwardDuration) {\n doRemove = true;\n var removeEnd = currentTime - autoCleanupMinBackwardDuration;\n _pendingRemoveRanges[type].push({ start: start, end: removeEnd });\n }\n } else if (end < currentTime && currentTime - start >= autoCleanupMinBackwardDuration) {\n doRemove = true;\n _pendingRemoveRanges[type].push({ start: start, end: end });\n }\n }\n if (doRemove && !sourceBuffer.updating) {\n this._doRemoveRanges(_pendingRemoveRanges);\n }\n }\n }\n }, {\n key: '_doRemoveRanges',\n value: function _doRemoveRanges(_pendingRemoveRanges) {\n for (var type in _pendingRemoveRanges) {\n if (!this.sourceBuffers[type] || this.sourceBuffers[type].updating) {\n continue;\n }\n var sb = this.sourceBuffers[type];\n var ranges = _pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n var range = ranges.shift();\n try {\n if (range && range.end > range.start) {\n sb.remove(range.start, range.end);\n }\n } catch (e) {}\n }\n }\n }\n }, {\n key: 'cleanBuffers',\n value: function cleanBuffers() {\n var _this = this;\n\n var taskList = [];\n\n var _loop = function _loop(i) {\n var buffer = _this.sourceBuffers[Object.keys(_this.sourceBuffers)[i]];\n\n var task = void 0;\n if (buffer.updating) {\n task = new Promise(function (resolve) {\n var doCleanBuffer = function doCleanBuffer() {\n var retryTime = 3;\n\n var clean = function clean() {\n if (!buffer.updating) {\n MSE.clearBuffer(buffer);\n buffer.addEventListener('updateend', function () {\n resolve();\n });\n } else if (retryTime > 0) {\n setTimeout(clean, 200);\n retryTime--;\n } else {\n resolve();\n }\n };\n\n setTimeout(clean, 200);\n buffer.removeEventListener('updateend', doCleanBuffer);\n };\n buffer.addEventListener('updateend', doCleanBuffer);\n });\n } else {\n task = new Promise(function (resolve) {\n MSE.clearBuffer(buffer);\n buffer.addEventListener('updateend', function () {\n resolve();\n });\n });\n\n // task = Promise.resolve()\n }\n\n taskList.push(task);\n };\n\n for (var i = 0; i < Object.keys(this.sourceBuffers).length; i++) {\n _loop(i);\n }\n\n return Promise.all(taskList);\n }\n }, {\n key: 'removeBuffers',\n value: function removeBuffers() {\n var _this2 = this;\n\n var taskList = [];\n\n var _loop2 = function _loop2(i) {\n var buffer = _this2.sourceBuffers[Object.keys(_this2.sourceBuffers)[i]];\n buffer.removeEventListener('updateend', _this2.onUpdateEnd);\n\n var task = void 0;\n if (buffer.updating) {\n task = new Promise(function (resolve) {\n var doCleanBuffer = function doCleanBuffer() {\n var retryTime = 3;\n\n var clean = function clean() {\n if (!buffer.updating) {\n MSE.clearBuffer(buffer);\n buffer.addEventListener('updateend', function () {\n resolve();\n });\n } else if (retryTime > 0) {\n setTimeout(clean, 200);\n retryTime--;\n } else {\n resolve();\n }\n };\n\n setTimeout(clean, 200);\n buffer.removeEventListener('updateend', doCleanBuffer);\n };\n buffer.addEventListener('updateend', doCleanBuffer);\n });\n } else {\n task = new Promise(function (resolve) {\n MSE.clearBuffer(buffer);\n buffer.addEventListener('updateend', function () {\n resolve();\n });\n });\n\n // task = Promise.resolve()\n }\n\n taskList.push(task);\n };\n\n for (var i = 0; i < Object.keys(this.sourceBuffers).length; i++) {\n _loop2(i);\n }\n\n return Promise.all(taskList);\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n var _this3 = this;\n\n if (!this.container) return Promise.resolve();\n this.container.removeEventListener('timeupdate', this.onTimeUpdate);\n this.container.removeEventListener('waiting', this.onWaiting);\n this.mediaSource.removeEventListener('sourceopen', this.onSourceOpen);\n return this.removeBuffers().then(function () {\n var sources = Object.keys(_this3.sourceBuffers);\n for (var i = 0; i < sources.length; i++) {\n var _buffer = _this3.sourceBuffers[sources[i]];\n delete _this3.sourceBuffers[sources[i]];\n\n if (_this3.mediaSource.readyState === 'open') {\n _this3.mediaSource.removeSourceBuffer(_buffer);\n }\n }\n\n _this3.endOfStream();\n try {\n window.URL.revokeObjectURL(_this3.url);\n } catch (e) {}\n\n _this3.url = null;\n _this3.configs = {};\n _this3.container = null;\n _this3.mediaSource = null;\n _this3.sourceBuffers = {};\n _this3.preloadTime = 1;\n\n _this3.onSourceOpen = null;\n _this3.onTimeUpdate = null;\n _this3.onUpdateEnd = null;\n _this3.onWaiting = null;\n _this3.noaudio = undefined;\n _this3.novideo = undefined;\n });\n }\n }, {\n key: 'sourceBufferLen',\n get: function get() {\n if (!this._context.mediaInfo) {\n if (this.noaudio || this.novideo) return 1;\n return 2;\n }\n return (!!this._context.mediaInfo.hasVideo && !this.novideo) + (!!this._context.mediaInfo.hasAudio && !this.noaudio);\n }\n }, {\n key: 'url',\n set: function set(val) {\n this._url = val;\n },\n get: function get() {\n if (!this._url) {\n try {\n this._url = window.URL.createObjectURL(this.mediaSource);\n } catch (e) {}\n }\n return this._url;\n }\n }], [{\n key: 'clearBuffer',\n value: function clearBuffer(buffer) {\n try {\n var buffered = buffer.buffered;\n var bEnd = 0.1;\n for (var i = 0, len = buffered.length; i < len; i++) {\n bEnd = buffered.end(i);\n }\n buffer.remove(0, bEnd);\n } catch (e) {\n // DO NOTHING\n }\n }\n }]);\n\n return MSE;\n}();\n\nexport default MSE;","import _PageVisibility from './page-visibility';\n\nvar le = function () {\n var buf = new ArrayBuffer(2);\n new DataView(buf).setInt16(0, 256, true); // little-endian write\n return new Int16Array(buf)[0] === 256; // platform-spec read, if equal then LE\n}();\n\nvar sniffer = {\n /**\n * get device type\n * @return {'pc'|'mobile'|'tablet'}\n */\n get device() {\n var r = sniffer.os;\n return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile';\n },\n\n get browser() {\n var ua = navigator.userAgent.toLowerCase();\n var reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firfox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n };\n return [].concat(Object.keys(reg).filter(function (key) {\n return reg[key].test(ua);\n }))[0];\n },\n get os() {\n var ua = navigator.userAgent;\n var isWindowsPhone = /(?:Windows Phone)/.test(ua);\n var isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone;\n var isAndroid = /(?:Android)/.test(ua);\n var isFireFox = /(?:Firefox)/.test(ua);\n var isTablet = /(?:iPad|PlayBook)/.test(ua) || isAndroid && !/(?:Mobile)/.test(ua) || isFireFox && /(?:Tablet)/.test(ua);\n var isPhone = /(?:iPhone)/.test(ua) && !isTablet;\n var isPc = !isPhone && !isAndroid && !isSymbian;\n return {\n isTablet: isTablet,\n isPhone: isPhone,\n isAndroid: isAndroid,\n isPc: isPc,\n isSymbian: isSymbian,\n isWindowsPhone: isWindowsPhone,\n isFireFox: isFireFox\n };\n },\n\n get isLe() {\n return le;\n }\n};\n\nexport var PageVisibility = _PageVisibility;\nexport default sniffer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Speed = function () {\n function Speed() {\n _classCallCheck(this, Speed);\n\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._lastSamplingBytes = 0;\n\n this._now = Date.now;\n }\n\n _createClass(Speed, [{\n key: \"reset\",\n value: function reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._lastSamplingBytes = 0;\n }\n }, {\n key: \"addBytes\",\n value: function addBytes(bytes) {\n var duration = this._now() - this._lastCheckpoint;\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n } else if (duration < 5000) {\n this._intervalBytes += bytes;\n } else {\n // duration >= 1000\n this._lastSamplingBytes = this._intervalBytes / (duration / 1000);\n this._intervalBytes = bytes;\n this._lastCheckpoint = this._now();\n }\n }\n }, {\n key: \"currentKBps\",\n get: function get() {\n this.addBytes(0);\n\n var durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds === 0) durationSeconds = 1;\n return this._intervalBytes / durationSeconds / 1024;\n }\n }, {\n key: \"lastSamplingKBps\",\n get: function get() {\n this.addBytes(0);\n\n if (this._lastSamplingBytes !== 0) {\n return this._lastSamplingBytes / 1024;\n } else {\n // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n }]);\n\n return Speed;\n}();\n\nexport default Speed;","var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport EVENTS from '../events';\nimport Speed from './speed';\n\nvar LOADER_EVENTS = EVENTS.LOADER_EVENTS;\nvar READ_STREAM = 0;\nvar READ_TEXT = 1;\nvar READ_JSON = 2;\nvar READ_BUFFER = 3;\n\nvar FetchLoader = function () {\n function FetchLoader(configs) {\n _classCallCheck(this, FetchLoader);\n\n this.configs = Object.assign({}, configs);\n this.url = null;\n this.status = 0;\n this.error = null;\n this._reader = null;\n this._canceled = false;\n this._destroyed = false;\n this.readtype = this.configs.readtype;\n this.buffer = this.configs.buffer || 'LOADER_BUFFER';\n this._loaderTaskNo = 0;\n this._ttfb = 0;\n this._speed = new Speed();\n if (window.AbortController) {\n this.abortControllerEnabled = true;\n }\n }\n\n _createClass(FetchLoader, [{\n key: 'init',\n value: function init() {\n this.on(LOADER_EVENTS.LADER_START, this.load.bind(this));\n }\n }, {\n key: 'fetch',\n\n\n /**\n * @param {string} url\n * @param {RequestInit} params\n * @param {number} timeout\n * @return {Promise}\n */\n value: function (_fetch) {\n function fetch(_x, _x2, _x3) {\n return _fetch.apply(this, arguments);\n }\n\n fetch.toString = function () {\n return _fetch.toString();\n };\n\n return fetch;\n }(function (url, params, timeout) {\n var _this2 = this;\n\n var timer = null;\n if (this.abortControllerEnabled) {\n this.abortController = new window.AbortController();\n }\n Object.assign(params, { signal: this.abortController ? this.abortController.signal : undefined });\n var start = new Date().getTime();\n return Promise.race([fetch(url, params), new Promise(function (resolve, reject) {\n timer = setTimeout(function () {\n /* eslint-disable-next-line */\n reject({\n code: 999,\n message: 'fetch timeout'\n });\n if (_this2.abortController) {\n _this2.abortController.abort();\n }\n }, timeout || 1e4); // 10s\n })]).then(function (response) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n var end = new Date().getTime();\n _this2.emit(LOADER_EVENTS.LOADER_TTFB, {\n start: start,\n end: end,\n elapsed: end - start\n });\n return response;\n });\n })\n\n /**\n * @param {string} url\n * @param {RequestInit} params\n * @param {number} retryTimes\n * @param {number} totalRetry\n * @param {number} delayTime\n * @return {Promise<{ok} | minimist.Opts.unknown>}\n */\n\n }, {\n key: 'internalLoad',\n value: function internalLoad(url, params, retryTimes, totalRetry) {\n var _this3 = this;\n\n var delayTime = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n var loadTimeout = arguments[5];\n\n if (this._destroyed) return;\n this.loading = true;\n return this.fetch(this.url, params, loadTimeout).then(function (response) {\n !_this3._destroyed && _this3.emit(LOADER_EVENTS.LOADER_RESPONSE_HEADERS, _this3.TAG, response.headers);\n\n if (response.ok) {\n _this3.status = response.status;\n Promise.resolve().then(function () {\n _this3._onFetchResponse(response);\n });\n\n return Promise.resolve(response);\n }\n\n if (retryTimes-- > 0) {\n _this3._retryTimer = setTimeout(function () {\n _this3.emit(LOADER_EVENTS.LOADER_RETRY, _this3.TAG, {\n response: response,\n reason: 'response not ok',\n retryTime: totalRetry - retryTimes\n });\n return _this3.internalLoad(url, params, retryTimes, totalRetry, delayTime, loadTimeout);\n }, delayTime);\n } else {\n _this3.loading = false;\n _this3.emit(LOADER_EVENTS.LOADER_ERROR, _this3.TAG, {\n code: response.status || 21,\n message: response.status + ' (' + response.statusText + ')'\n });\n }\n }).catch(function (error) {\n if (_this3._destroyed) {\n _this3.loading = false;\n return;\n }\n\n if (retryTimes-- > 0) {\n _this3._retryTimer = setTimeout(function () {\n _this3.emit(LOADER_EVENTS.LOADER_RETRY, _this3.TAG, {\n error: error,\n reason: 'fetch error',\n retryTime: totalRetry - retryTimes\n });\n return _this3.internalLoad(url, params, retryTimes, totalRetry, delayTime, loadTimeout);\n }, delayTime);\n } else {\n _this3.loading = false;\n if (error && error.name === 'AbortError') {\n return;\n }\n _this3.emit(LOADER_EVENTS.LOADER_ERROR, _this3.TAG, Object.assign({ code: 21 }, error));\n }\n });\n }\n\n /**\n * @param {string} url\n * @param {RequestInit} opts\n * @param {retryCount, retryDelay, loadTimeout} pluginConfig\n * @return {Promise<{ok} | minimist.Opts.unknown>}\n */\n\n }, {\n key: 'load',\n value: function load(url) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n retryCount = _ref.retryCount,\n retryDelay = _ref.retryDelay,\n loadTimeout = _ref.loadTimeout;\n\n retryCount = retryCount === undefined ? 3 : retryCount;\n this.url = url;\n this._canceled = false;\n\n // TODO: Add Ranges\n var params = this.getParams(opts);\n\n return this.internalLoad(url, params, retryCount, retryCount, retryDelay, loadTimeout);\n }\n }, {\n key: '_onFetchResponse',\n value: function _onFetchResponse(response) {\n var _this4 = this;\n\n var _this = this;\n var buffer = this._context.getInstance(this.buffer);\n this._loaderTaskNo++;\n var taskno = this._loaderTaskNo;\n if (response.ok === true) {\n switch (this.readtype) {\n case READ_JSON:\n response.json().then(function (data) {\n _this.loading = false;\n if (!_this._canceled && !_this._destroyed) {\n if (buffer) {\n buffer.push(data);\n _this.emit(LOADER_EVENTS.LOADER_COMPLETE, buffer);\n } else {\n _this.emit(LOADER_EVENTS.LOADER_COMPLETE, data);\n }\n }\n });\n break;\n case READ_TEXT:\n response.text().then(function (data) {\n _this.loading = false;\n if (!_this._canceled && !_this._destroyed) {\n if (buffer) {\n buffer.push(data);\n _this.emit(LOADER_EVENTS.LOADER_COMPLETE, buffer);\n } else {\n _this.emit(LOADER_EVENTS.LOADER_COMPLETE, data);\n }\n }\n });\n break;\n case READ_BUFFER:\n response.arrayBuffer().then(function (data) {\n _this.loading = false;\n if (!_this._canceled && !_this._destroyed) {\n if (buffer) {\n buffer.push(new Uint8Array(data));\n _this4._speed.addBytes(data.byteLength);\n _this.emit(LOADER_EVENTS.LOADER_COMPLETE, buffer);\n } else {\n _this.emit(LOADER_EVENTS.LOADER_COMPLETE, data);\n }\n }\n }).catch(function () {});\n break;\n case READ_STREAM:\n default:\n return this._onReader(response.body.getReader(), taskno);\n }\n }\n }\n }, {\n key: '_onReader',\n value: function _onReader(reader, taskno) {\n var _this5 = this;\n\n var buffer = this._context.getInstance(this.buffer);\n if (!buffer && this._reader || this._destroyed) {\n try {\n this._reader.cancel();\n } catch (e) {\n // DO NOTHING\n }\n }\n\n this._reader = reader;\n if (this.loading === false) {\n return;\n }\n\n // reader read function returns a Promise. get data when callback and has value.done when disconnected.\n // read方法返回一个Promise. 回调中可以获取到数据。当value.done存在时,说明链接断开。\n this._noDataTimer = setTimeout(function () {\n if (_this5.loading === false) return;\n _this5.emit(LOADER_EVENTS.LOADER_COMPLETE);\n }, 3000);\n this._reader && this._reader.read().then(function (val) {\n clearTimeout(_this5._noDataTimer);\n if (_this5._canceled || _this5._destroyed) {\n if (_this5._reader) {\n try {\n _this5._reader.cancel();\n } catch (e) {\n // DO NOTHING\n }\n }\n return;\n }\n if (val.done) {\n _this5.loading = false;\n _this5.status = 0;\n Promise.resolve().then(function () {\n _this5.emit(LOADER_EVENTS.LOADER_COMPLETE, buffer);\n });\n return;\n }\n\n buffer.push(val.value);\n _this5._speed.addBytes(val.value.byteLength);\n Promise.resolve().then(function () {\n _this5.emit(LOADER_EVENTS.LOADER_DATALOADED, buffer);\n });\n return _this5._onReader(reader, taskno);\n }).catch(function (error) {\n clearTimeout(_this5._noDataTimer);\n _this5.loading = false;\n if (error && error.name === 'AbortError') return;\n _this5.emit(LOADER_EVENTS.LOADER_ERROR, _this5.TAG, error);\n });\n }\n\n /**\n *\n * @param {RequestInit} opts\n * @return {{mode: string, headers: Headers, cache: string, method: string}}\n */\n\n }, {\n key: 'getParams',\n value: function getParams(opts) {\n var options = Object.assign({}, opts);\n var headers = new Headers();\n\n var params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default'\n\n // add custmor headers\n // 添加自定义头\n };if (_typeof(this.configs.headers) === 'object') {\n var configHeaders = this.configs.headers;\n for (var key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n if (_typeof(options.headers) === 'object') {\n var optHeaders = options.headers;\n for (var _key in optHeaders) {\n if (optHeaders.hasOwnProperty(_key)) {\n headers.append(_key, optHeaders[_key]);\n }\n }\n }\n\n if (options.cors === false) {\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n // withCredentials 在默认情况下不被使用。\n if (options.withCredentials) {\n params.credentials = 'include';\n }\n\n // TODO: Add ranges;\n return params;\n }\n\n // in KB/s\n\n }, {\n key: 'cancel',\n value: function cancel() {\n if (this._reader) {\n try {\n this._reader.cancel();\n } catch (e) {\n // 防止failed: 200错误被打印到控制台上\n }\n this._reader = null;\n this.loading = false;\n }\n clearTimeout(this._noDataTimer);\n this._canceled = true;\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this._destroyed = true;\n clearTimeout(this._retryTimer);\n clearTimeout(this._noDataTimer);\n this.cancel();\n this._speed.reset();\n }\n }, {\n key: 'currentSpeed',\n get: function get() {\n return this._speed.lastSamplingKBps;\n }\n }], [{\n key: 'isSupported',\n value: function isSupported() {\n return !!window.fetch;\n }\n }, {\n key: 'type',\n get: function get() {\n return 'loader';\n }\n }]);\n\n return FetchLoader;\n}();\n\nexport default FetchLoader;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DevLogger = function () {\n function DevLogger() {\n var _this = this;\n\n _classCallCheck(this, DevLogger);\n\n try {\n var matched = /xgd=(\\d)/.exec(document.cookie);\n this._status = !!matched;\n this._level = matched && matched[1];\n } catch (e) {\n this._status = false;\n }\n\n ['group', 'groupEnd', 'log', 'warn', 'error'].forEach(function (funName) {\n _this[funName] = function (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) {\n var _console;\n\n if (!_this._status) return;\n var tagName = arg1;\n var args = [arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10].filter(function (x) {\n return x !== undefined;\n });\n (_console = console)[funName].apply(_console, ['[' + tagName + ']:'].concat(_toConsumableArray(args)));\n };\n });\n }\n\n /**\n * @return {*|boolean|boolean}\n */\n\n\n _createClass(DevLogger, [{\n key: 'enable',\n get: function get() {\n return this._status;\n }\n\n /**\n * @return {boolean}\n */\n\n }, {\n key: 'long',\n get: function get() {\n return this._level === '2';\n }\n }]);\n\n return DevLogger;\n}();\n\nexport default new DevLogger();","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar AAC = function () {\n function AAC() {\n _classCallCheck(this, AAC);\n }\n\n _createClass(AAC, null, [{\n key: 'getSilentFrame',\n value: function getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 2) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 3) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n }\n }\n return null;\n }\n }]);\n\n return AAC;\n}();\n\nexport default AAC;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Golomb = function () {\n /**\n * @param {Uint8Array} uint8array\n */\n function Golomb(uint8array) {\n _classCallCheck(this, Golomb);\n\n this.TAG = 'Golomb';\n this._buffer = uint8array;\n this._bufferIndex = 0;\n this._totalBytes = uint8array.byteLength;\n this._totalBits = uint8array.byteLength * 8;\n this._currentWord = 0;\n this._currentWordBitsLeft = 0;\n }\n\n _createClass(Golomb, [{\n key: 'destroy',\n value: function destroy() {\n this._buffer = null;\n }\n }, {\n key: '_fillCurrentWord',\n value: function _fillCurrentWord() {\n var bufferBytesLeft = this._totalBytes - this._bufferIndex;\n if (bufferBytesLeft <= 0) {\n // TODO 异常处理\n }\n\n var bytesRead = Math.min(4, bufferBytesLeft);\n var word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._bufferIndex, this._bufferIndex + bytesRead));\n this._currentWord = new DataView(word.buffer).getUint32(0);\n\n this._bufferIndex += bytesRead;\n this._currentWordBitsLeft = bytesRead * 8;\n }\n\n /**\n * @param size\n * @return {number|*|number}\n */\n\n }, {\n key: 'readBits',\n value: function readBits(size) {\n var bits = Math.min(this._currentWordBitsLeft, size); // :uint\n var valu = this._currentWord >>> 32 - bits;\n if (size > 32) {\n throw new Error('Cannot read more than 32 bits at a time');\n }\n this._currentWordBitsLeft -= bits;\n if (this._currentWordBitsLeft > 0) {\n this._currentWord <<= bits;\n } else if (this._totalBytes - this._bufferIndex > 0) {\n this._fillCurrentWord();\n }\n\n bits = size - bits;\n if (bits > 0 && this._currentWordBitsLeft) {\n return valu << bits | this.readBits(bits);\n } else {\n return valu;\n }\n }\n\n /**\n * @return {boolean}\n */\n\n }, {\n key: 'readBool',\n value: function readBool() {\n return this.readBits(1) === 1;\n }\n\n /**\n * @return {*|number}\n */\n\n }, {\n key: 'readByte',\n value: function readByte() {\n return this.readBits(8);\n }\n }, {\n key: '_skipLeadingZero',\n value: function _skipLeadingZero() {\n var zeroCount = void 0;\n for (zeroCount = 0; zeroCount < this._currentWordBitsLeft; zeroCount++) {\n if ((this._currentWord & 0x80000000 >>> zeroCount) !== 0) {\n this._currentWord <<= zeroCount;\n this._currentWordBitsLeft -= zeroCount;\n return zeroCount;\n }\n }\n this._fillCurrentWord();\n return zeroCount + this._skipLeadingZero();\n }\n\n /**\n * @return {number}\n */\n\n }, {\n key: 'readUEG',\n value: function readUEG() {\n // unsigned exponential golomb\n var leadingZeros = this._skipLeadingZero();\n return this.readBits(leadingZeros + 1) - 1;\n }\n\n /**\n * @return {number}\n */\n\n }, {\n key: 'readSEG',\n value: function readSEG() {\n // signed exponential golomb\n var value = this.readUEG();\n if (value & 0x01) {\n return value + 1 >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n }, {\n key: 'readSliceType',\n value: function readSliceType() {\n // skip NALu type Nal unit header 8bit\n this.readByte();\n // discard first_mb_in_slice\n this.readUEG();\n // return slice_type\n return this.readUEG();\n }\n }]);\n\n return Golomb;\n}();\n\nexport default Golomb;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport Golomb from './golomb';\n\nvar SPSParser = function () {\n function SPSParser() {\n _classCallCheck(this, SPSParser);\n }\n\n _createClass(SPSParser, null, [{\n key: '_ebsp2rbsp',\n\n /**\n * 0x00000300 -> 0x000000\n * 0x00000301 -> 0x000001\n * 0x00000302 -> 0x000002\n * 0x00000303 -> 0x000003\n */\n value: function _ebsp2rbsp(uint8array) {\n var src = uint8array;\n var srcLength = src.byteLength;\n var dst = new Uint8Array(srcLength);\n var dstIdx = 0;\n\n for (var i = 0; i < srcLength; i++) {\n if (i >= 2) {\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dstIdx] = src[i];\n dstIdx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dstIdx);\n }\n }, {\n key: 'parseSPS',\n value: function parseSPS(uint8array) {\n var rbsp = SPSParser._ebsp2rbsp(uint8array);\n var gb = new Golomb(rbsp);\n\n gb.readByte();\n var profileIdc = gb.readByte();\n gb.readByte();\n var levelIdc = gb.readByte();\n gb.readUEG();\n\n var profile_string = SPSParser.getProfileString(profileIdc);\n var level_string = SPSParser.getLevelString(levelIdc);\n var chroma_format_idc = 1;\n var chroma_format = 420;\n var chroma_format_table = [0, 420, 422, 444];\n var bit_depth = 8;\n\n if (profileIdc === 100 || profileIdc === 110 || profileIdc === 122 || profileIdc === 244 || profileIdc === 44 || profileIdc === 83 || profileIdc === 86 || profileIdc === 118 || profileIdc === 128 || profileIdc === 138 || profileIdc === 144) {\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1);\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8;\n gb.readUEG();\n gb.readBits(1);\n if (gb.readBool()) {\n var scaling_list_count = chroma_format_idc !== 3 ? 8 : 12;\n for (var i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) {\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG();\n var pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG();\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1);\n gb.readSEG();\n gb.readSEG();\n var num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (var _i = 0; _i < num_ref_frames_in_pic_order_cnt_cycle; _i++) {\n gb.readSEG();\n }\n }\n gb.readUEG();\n gb.readBits(1);\n\n var pic_width_in_mbs_minus1 = gb.readUEG();\n var pic_height_in_map_units_minus1 = gb.readUEG();\n\n var frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1);\n }\n gb.readBits(1);\n\n var frame_crop_left_offset = 0;\n var frame_crop_right_offset = 0;\n var frame_crop_top_offset = 0;\n var frame_crop_bottom_offset = 0;\n\n var frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n var par_width = 1;var par_height = 1;\n var fps = 0;var fps_fixed = true;var fps_num = 0;var fps_den = 0;\n\n var vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) {\n // aspect_ratio_info_present_flag\n var aspect_ratio_idc = gb.readByte();\n var par_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n var par_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n par_width = par_w_table[aspect_ratio_idc - 1];\n par_height = par_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n par_width = gb.readByte() << 8 | gb.readByte();\n par_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) {\n gb.readBool();\n }\n if (gb.readBool()) {\n gb.readBits(4);\n if (gb.readBool()) {\n gb.readBits(24);\n }\n }\n if (gb.readBool()) {\n gb.readUEG();\n gb.readUEG();\n }\n if (gb.readBool()) {\n var num_units_in_tick = gb.readBits(32);\n var time_scale = gb.readBits(32);\n fps_fixed = gb.readBool();\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n var parScale = 1;\n if (par_width !== 1 || par_height !== 1) {\n parScale = par_width / par_height;\n }\n\n var crop_unit_x = 0;var crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n var sub_wc = chroma_format_idc === 3 ? 1 : 2;\n var sub_hc = chroma_format_idc === 1 ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n var codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n var codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n var present_width = Math.ceil(codec_width * parScale);\n\n gb.destroy();\n gb = null;\n\n return {\n profile_string: profile_string,\n level_string: level_string,\n bit_depth: bit_depth,\n chroma_format: chroma_format,\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n par_ratio: {\n width: par_width,\n height: par_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n }, {\n key: '_skipScalingList',\n value: function _skipScalingList(gb, count) {\n var lastScale = 8;\n var nextScale = 8;\n var deltaScale = 0;\n for (var i = 0; i < count; i++) {\n if (nextScale !== 0) {\n deltaScale = gb.readSEG();\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = nextScale === 0 ? lastScale : nextScale;\n }\n }\n }, {\n key: 'getProfileString',\n value: function getProfileString(profileIdc) {\n switch (profileIdc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n }, {\n key: 'getLevelString',\n value: function getLevelString(levelIdc) {\n return (levelIdc / 10).toFixed(1);\n }\n }, {\n key: 'getChromaFormatString',\n value: function getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n }, {\n key: 'toVideoMeta',\n value: function toVideoMeta(spsConfig) {\n var meta = {};\n if (spsConfig && spsConfig.codec_size) {\n meta.codecWidth = spsConfig.codec_size.width;\n meta.codecHeight = spsConfig.codec_size.height;\n meta.presentWidth = spsConfig.present_size.width;\n meta.presentHeight = spsConfig.present_size.height;\n }\n\n meta.profile = spsConfig.profile_string;\n meta.level = spsConfig.level_string;\n meta.bitDepth = spsConfig.bit_depth;\n meta.chromaFormat = spsConfig.chroma_format;\n\n meta.parRatio = {\n width: spsConfig.par_ratio.width,\n height: spsConfig.par_ratio.height\n };\n\n meta.frameRate = spsConfig.frame_rate;\n\n var fpsDen = meta.frameRate.fps_den;\n var fpsNum = meta.frameRate.fps_num;\n meta.refSampleDuration = Math.floor(meta.timescale * (fpsDen / fpsNum));\n return meta;\n }\n }]);\n\n return SPSParser;\n}();\n\nexport default SPSParser;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar RBSP = function () {\n function RBSP() {\n _classCallCheck(this, RBSP);\n }\n\n _createClass(RBSP, null, [{\n key: \"EBSP2RBSP\",\n\n /**\n * convert EBSP to RBSP\n * @param data {Uint8Array}\n * @returns {Uint8Array}\n * @constructor\n */\n value: function EBSP2RBSP(data) {\n return data.filter(function (el, idx) {\n if (idx < 2) {\n return true;\n } else {\n return !(data[idx - 2] === 0 && data[idx - 1] === 0 && el === 3);\n }\n });\n }\n\n /**\n * EBSP = SODB + '10000000'\n * @param data {Uint8Array}\n * @constructor\n */\n\n }, {\n key: \"EBSP2SODB\",\n value: function EBSP2SODB(data) {\n var lastByte = data[data.byteLength - 1];\n if (lastByte && lastByte === 128) {\n return data.slice(0, data.byteLength - 1);\n }\n\n return data;\n }\n }]);\n\n return RBSP;\n}();\n\nexport default RBSP;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport RBSP from './rbsp';\n\nvar u8aToString = function u8aToString(data) {\n var result = '';\n for (var i = 0; i < data.byteLength; i++) {\n result += String.fromCharCode(data[i]);\n }\n return result;\n};\n\nvar SEIParser = function () {\n function SEIParser() {\n _classCallCheck(this, SEIParser);\n }\n\n _createClass(SEIParser, null, [{\n key: '_resolveNalu',\n value: function _resolveNalu(data) {\n if (data.length >= 1) {\n return RBSP.EBSP2SODB(RBSP.EBSP2RBSP(data.slice(1)));\n }\n return null;\n }\n /**\n *\n * @param data {Uint8Array}\n */\n\n }, {\n key: 'parse',\n value: function parse(data) {\n var sodb = SEIParser._resolveNalu(data);\n\n var _SEIParser$switchPayl = SEIParser.switchPayloadType(sodb),\n payloadType = _SEIParser$switchPayl.payloadType,\n offset = _SEIParser$switchPayl.offset;\n\n var content = sodb.slice(offset);\n\n switch (payloadType) {\n case 5:\n return SEIParser.user_data_unregistered(content);\n default:\n return {\n code: payloadType,\n content: content\n };\n }\n }\n\n /**\n *\n * @param data\n * @returns {{payloadType: number, offset: number}}\n */\n\n }, {\n key: 'switchPayloadType',\n value: function switchPayloadType(data) {\n var dv = new DataView(data.buffer);\n var payloadType = 0;\n var offset = 0;\n while (dv.getUint8(offset) === 255) {\n offset++;\n payloadType += 255;\n }\n payloadType += dv.getUint8(offset++);\n\n return {\n payloadType: payloadType,\n offset: offset\n };\n }\n\n /**\n *\n * @param data {Uint8Array}\n * @return {{ payloadLength: number, offset: number }}\n */\n\n }, {\n key: 'getPayloadLength',\n value: function getPayloadLength(data) {\n var dv = new DataView(data.buffer);\n\n var payloadLength = 0;\n var offset = 0;\n while (dv.getUint8(offset) === 255) {\n offset++;\n payloadLength += 255;\n }\n payloadLength += dv.getUint8(offset++);\n\n return {\n payloadLength: payloadLength,\n offset: offset\n };\n }\n\n /**\n * resolve 0x05 user data unregistered\n * @param data {Uint8Array}\n */\n // eslint-disable-next-line camelcase\n\n }, {\n key: 'user_data_unregistered',\n value: function user_data_unregistered(data) {\n var _SEIParser$getPayload = SEIParser.getPayloadLength(data),\n payloadLength = _SEIParser$getPayload.payloadLength,\n offset = _SEIParser$getPayload.offset;\n\n if (payloadLength < 16) {\n return {\n uuid: '',\n content: null\n };\n }\n var payload = data.slice(offset);\n\n var uuid = u8aToString(payload.slice(0, 16));\n var content = u8aToString(payload.slice(16, payloadLength));\n\n return {\n code: 5, // for user data unregistered\n uuid: uuid,\n content: content\n };\n }\n }]);\n\n return SEIParser;\n}();\n\nexport default SEIParser;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport SpsParser from './sps';\nimport SEIParser from './sei';\n\nvar Nalunit = function () {\n function Nalunit() {\n _classCallCheck(this, Nalunit);\n }\n\n _createClass(Nalunit, null, [{\n key: 'getNalunits',\n\n // https://en.wikipedia.org/wiki/Network_Abstraction_Layer\n value: function getNalunits(buffer) {\n if (buffer.length - buffer.position < 4) {\n return [];\n }\n\n var buf = buffer.dataview;\n var position = buffer.position;\n // 0x001 || 0x0001\n if (buf.getInt32(position) === 1 || buf.getInt16(position) === 0 && buf.getInt8(position + 2) === 1) {\n return Nalunit.getAnnexbNals(buffer);\n } else {\n return Nalunit.getAvccNals(buffer);\n }\n }\n }, {\n key: 'getAnnexbNals',\n value: function getAnnexbNals(buffer) {\n var nals = [];\n var position = Nalunit.getHeaderPositionAnnexB(buffer);\n var start = position.pos;\n var end = start;\n while (start < buffer.length - 4) {\n var header = buffer.buffer.slice(start, start + position.headerLength);\n if (position.pos === buffer.position) {\n buffer.skip(position.headerLength);\n }\n position = Nalunit.getHeaderPositionAnnexB(buffer);\n end = position.pos;\n var body = new Uint8Array(buffer.buffer.slice(start + header.byteLength, end));\n var unit = { header: header, body: body };\n Nalunit.analyseNal(unit);\n if (unit.type <= 9 && unit.type !== 0) {\n nals.push(unit);\n }\n buffer.skip(end - buffer.position);\n start = end;\n }\n return nals;\n }\n }, {\n key: 'getAvccNals',\n value: function getAvccNals(buffer) {\n // buffer.buffer = RBSP.EBSP2RBSP(new Uint8Array(buffer.buffer)).buffer;\n // buffer.dataview = new DataView(buffer.buffer)\n // buffer.dataview.position = 0;\n var nals = [];\n while (buffer.position < buffer.length - 4) {\n var length = buffer.dataview.getInt32(buffer.dataview.position);\n if (buffer.length - buffer.position >= length) {\n var header = buffer.buffer.slice(buffer.position, buffer.position + 4);\n buffer.skip(4);\n var body = new Uint8Array(buffer.buffer.slice(buffer.position, buffer.position + length));\n buffer.skip(length);\n var unit = { header: header, body: body };\n Nalunit.analyseNal(unit);\n if (unit.type <= 9 && unit.type !== 0) {\n nals.push(unit);\n }\n } else {\n break;\n }\n }\n return nals;\n }\n\n // * ISO-14496-10 7.3.1\n // * forbidden_zero_bit 1bit\n // * nal_ref_idc 2bit\n // * nal_unit_type 5bit\n\n }, {\n key: 'analyseNal',\n value: function analyseNal(unit) {\n var type = unit.body[0] & 0x1f;\n unit.type = type;\n switch (type) {\n case 1:\n // NDR\n unit.ndr = true;\n break;\n case 5:\n // IDR\n unit.idr = true;\n break;\n case 6:\n // SEI\n try {\n unit.sei = SEIParser.parse(unit.body);\n } catch (e) {}\n break;\n case 7:\n // SPS\n unit.sps = SpsParser.parseSPS(unit.body);\n break;\n case 8:\n // PPS\n unit.pps = true;\n break;\n case 9:\n // AUD\n break;\n default:\n break;\n }\n }\n }, {\n key: 'getHeaderPositionAnnexB',\n value: function getHeaderPositionAnnexB(buffer) {\n // seperate\n var pos = buffer.position;\n var headerLength = 0;\n var bufferLen = buffer.length;\n while (headerLength !== 3 && headerLength !== 4 && pos < bufferLen - 4) {\n if (buffer.dataview.getInt16(pos) === 0) {\n if (buffer.dataview.getInt16(pos + 2) === 1) {\n // 0x000001\n headerLength = 4;\n } else if (buffer.dataview.getInt8(pos + 2) === 1) {\n headerLength = 3;\n } else {\n pos++;\n }\n } else {\n pos++;\n }\n }\n\n if (pos === bufferLen - 4) {\n if (buffer.dataview.getInt16(pos) === 0) {\n if (buffer.dataview.getInt16(pos + 2) === 1) {\n // 0x000001\n headerLength = 4;\n } else {\n pos = bufferLen;\n }\n } else {\n pos++;\n if (buffer.dataview.getInt16(pos) === 0 && buffer.dataview.getInt8(pos) === 1) {\n // 0x0000001\n headerLength = 3;\n } else {\n pos = bufferLen;\n }\n }\n }\n return { pos: pos, headerLength: headerLength };\n }\n\n // 组装AvcDecoderConfigurationRecord\n // * configurationVerison = 1 uint(8)\n // * avcProfileIndication uint(8)\n // * profile_compatibility uint(8)\n // * avcLevelIndication uint(8)\n // * reserved `111111` bit(6)\n // * lengthSizeMinusOne uint(2)\n // * reserved `111` bit(3)\n // * numOfSPS uint(5)\n // * for(numOfSPS)\n // * spsLength uint(16)\n // * spsNALUnit spsLength个字节\n // * numOfPPS uint(8)\n // * for(numOfPPS)\n // * ppsLength uint(16)\n // * ppsNALUnit ppsLength个字节\n\n }, {\n key: 'getAvcc',\n value: function getAvcc(sps, pps) {\n var ret = new Uint8Array(sps.byteLength + pps.byteLength + 11);\n ret[0] = 0x01;\n ret[1] = sps[1];\n ret[2] = sps[2];\n ret[3] = sps[3];\n ret[4] = 255;\n ret[5] = 225; // 11100001\n\n var offset = 6;\n\n ret.set(new Uint8Array([sps.byteLength >>> 8 & 0xff, sps.byteLength & 0xff]), offset);\n offset += 2;\n ret.set(sps, offset);\n offset += sps.byteLength;\n\n ret[offset] = 1;\n offset++;\n\n ret.set(new Uint8Array([pps.byteLength >>> 8 & 0xff, pps.byteLength & 0xff]), offset);\n offset += 2;\n ret.set(pps, offset);\n return ret;\n }\n }]);\n\n return Nalunit;\n}();\n\nexport default Nalunit;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Golomb = function () {\n /**\n * @param {Uint8Array} uint8array\n */\n function Golomb(uint8array) {\n _classCallCheck(this, Golomb);\n\n this.TAG = 'Golomb';\n this._buffer = uint8array;\n this._bufferIndex = 0;\n this._totalBytes = uint8array.byteLength;\n this._totalBits = uint8array.byteLength * 8;\n this._currentWord = 0;\n this._currentWordBitsLeft = 0;\n }\n\n _createClass(Golomb, [{\n key: 'destroy',\n value: function destroy() {\n this._buffer = null;\n }\n }, {\n key: '_fillCurrentWord',\n value: function _fillCurrentWord() {\n var bufferBytesLeft = this._totalBytes - this._bufferIndex;\n if (bufferBytesLeft <= 0) {\n // TODO 异常处理\n }\n\n var bytesRead = Math.min(4, bufferBytesLeft);\n var word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._bufferIndex, this._bufferIndex + bytesRead));\n this._currentWord = new DataView(word.buffer).getUint32(0);\n\n this._bufferIndex += bytesRead;\n this._currentWordBitsLeft = bytesRead * 8;\n }\n\n /**\n * @param size\n * @return {number|*|number}\n */\n\n }, {\n key: 'readBits',\n value: function readBits(size) {\n var bits = Math.min(this._currentWordBitsLeft, size); // :uint\n var valu = this._currentWord >>> 32 - bits;\n if (size > 32) {\n throw new Error('Cannot read more than 32 bits at a time');\n }\n this._currentWordBitsLeft -= bits;\n if (this._currentWordBitsLeft > 0) {\n this._currentWord <<= bits;\n } else if (this._totalBytes - this._bufferIndex > 0) {\n this._fillCurrentWord();\n }\n\n bits = size - bits;\n if (bits > 0 && this._currentWordBitsLeft) {\n return valu << bits | this.readBits(bits);\n } else {\n return valu;\n }\n }\n\n /**\n * @return {boolean}\n */\n\n }, {\n key: 'readBool',\n value: function readBool() {\n return this.readBits(1) === 1;\n }\n\n /**\n * @return {*|number}\n */\n\n }, {\n key: 'readByte',\n value: function readByte() {\n return this.readBits(8);\n }\n }, {\n key: '_skipLeadingZero',\n value: function _skipLeadingZero() {\n var zeroCount = void 0;\n for (zeroCount = 0; zeroCount < this._currentWordBitsLeft; zeroCount++) {\n if ((this._currentWord & 0x80000000 >>> zeroCount) !== 0) {\n this._currentWord <<= zeroCount;\n this._currentWordBitsLeft -= zeroCount;\n return zeroCount;\n }\n }\n this._fillCurrentWord();\n return zeroCount + this._skipLeadingZero();\n }\n\n /**\n * @return {number}\n */\n\n }, {\n key: 'readUEG',\n value: function readUEG() {\n // unsigned exponential golomb\n var leadingZeros = this._skipLeadingZero();\n return this.readBits(leadingZeros + 1) - 1;\n }\n\n /**\n * @return {number}\n */\n\n }, {\n key: 'readSEG',\n value: function readSEG() {\n // signed exponential golomb\n var value = this.readUEG();\n if (value & 0x01) {\n return value + 1 >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n }, {\n key: 'readSliceType',\n value: function readSliceType() {\n // skip NALu type Nal unit header 8bit\n this.readByte();\n // discard first_mb_in_slice\n this.readUEG();\n // return slice_type\n return this.readUEG();\n }\n }]);\n\n return Golomb;\n}();\n\nexport default Golomb;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport Golomb from './golomb';\n\nvar SPSParser = function () {\n function SPSParser() {\n _classCallCheck(this, SPSParser);\n }\n\n _createClass(SPSParser, null, [{\n key: '_ebsp2rbsp',\n\n /**\n *\n * @param {Uint8Array} uint8array\n * @return {Uint8Array}\n */\n value: function _ebsp2rbsp(uint8array) {\n var src = uint8array;\n var srcLength = src.byteLength;\n var dst = new Uint8Array(srcLength);\n var dstIdx = 0;\n\n for (var i = 0; i < srcLength; i++) {\n if (i >= 2) {\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dstIdx] = src[i];\n dstIdx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dstIdx);\n }\n\n /**\n * @param {Uint8Array} uint8array\n * @return {{width: *, general_profile_idc: number, chromaFormatIdc: *, general_level_idc: number, general_tier_flag: number, bitDepthLumaMinus8: (*|number), bitDepthChromaMinus8: (*|number), general_profile_space: number, height: *}}\n */\n\n }, {\n key: 'parseSPS',\n value: function parseSPS(uint8array) {\n var rbsp = SPSParser._ebsp2rbsp(uint8array);\n var gb = new Golomb(rbsp);\n\n var vpsId = 0;\n var maxSubLayersMinus1 = 0;\n var tINf = 0;\n var spsId = 0;\n var separate_colour_plane_flag = 0;\n var chromaFormatIdc = 0;\n var width = 0;\n var height = 0;\n var conf_win_left_offset = 0;\n var conf_win_right_offset = 0;\n var conf_win_top_offset = 0;\n var conf_win_bottom_offset = 0;\n var conformanceWindowFlag = 0;\n var bitDepthLumaMinus8 = 0;\n var bitDepthChromaMinus8 = 0;\n var sub_width_c = 0;\n var sub_height_c = 0;\n var profileTierLevel = {};\n\n gb.readByte(); // NAL header\n gb.readByte();\n\n vpsId = gb.readBits(4); // vps_id\n maxSubLayersMinus1 = gb.readBits(3); // max_sub_layers_minus1\n tINf = gb.readBits(1); // temporal_id_nesting_flag\n\n profileTierLevel = SPSParser._readProfileTierLevel(gb, maxSubLayersMinus1);\n\n spsId = gb.readUEG(); // sps id\n chromaFormatIdc = gb.readUEG();\n if (chromaFormatIdc === 3) {\n separate_colour_plane_flag = gb.readBits(1); // separate_colour_plane_flag\n }\n\n width = gb.readUEG(); // pic_width_in_luma_samples\n height = gb.readUEG(); // pic_height_in_luma_samples\n\n conformanceWindowFlag = gb.readBits(1);\n if (conformanceWindowFlag === 1) {\n conf_win_left_offset = gb.readUEG(); // conf_win_left_offset\n conf_win_right_offset = gb.readUEG(); // conf_win_right_offset\n conf_win_top_offset = gb.readUEG(); // conf_win_top_offset\n conf_win_bottom_offset = gb.readUEG(); // conf_win_bottom_offset\n }\n\n bitDepthLumaMinus8 = gb.readUEG(); // bit_depth_luma_minus8\n bitDepthChromaMinus8 = gb.readUEG(); // bit_depth_chroma_minus8\n\n if (conformanceWindowFlag === 1) {\n sub_width_c = (chromaFormatIdc === 1 || chromaFormatIdc === 2) && separate_colour_plane_flag === 0 ? 2 : 1;\n sub_height_c = chromaFormatIdc === 1 && separate_colour_plane_flag === 0 ? 2 : 1;\n width -= sub_width_c * conf_win_right_offset + sub_width_c * conf_win_left_offset;\n height -= sub_height_c * conf_win_bottom_offset + sub_height_c * conf_win_top_offset;\n }\n\n gb.destroy();\n gb = null;\n\n return { width: width,\n height: height,\n general_profile_space: profileTierLevel.general_profile_space,\n general_tier_flag: profileTierLevel.general_tier_flag,\n general_profile_idc: profileTierLevel.general_profile_idc,\n general_level_idc: profileTierLevel.general_level_idc,\n chromaFormatIdc: chromaFormatIdc,\n bitDepthLumaMinus8: bitDepthLumaMinus8,\n bitDepthChromaMinus8: bitDepthChromaMinus8 };\n }\n\n // static parseSPS (uint8array) {\n // let rbsp = SPSParser._ebsp2rbsp(uint8array)\n // let gb = new Golomb(rbsp)\n //\n // gb.readByte()\n // let profileIdc = gb.readByte()\n // gb.readByte()\n // let levelIdc = gb.readByte()\n // gb.readUEG()\n //\n // let profile_string = SPSParser.getProfileString(profileIdc)\n // let level_string = SPSParser.getLevelString(levelIdc)\n // let chroma_format_idc = 1\n // let chroma_format = 420\n // let chroma_format_table = [0, 420, 422, 444]\n // let bit_depth = 8\n //\n // if (profileIdc === 100 || profileIdc === 110 || profileIdc === 122 ||\n // profileIdc === 244 || profileIdc === 44 || profileIdc === 83 ||\n // profileIdc === 86 || profileIdc === 118 || profileIdc === 128 ||\n // profileIdc === 138 || profileIdc === 144) {\n // chroma_format_idc = gb.readUEG()\n // if (chroma_format_idc === 3) {\n // gb.readBits(1)\n // }\n // if (chroma_format_idc <= 3) {\n // chroma_format = chroma_format_table[chroma_format_idc]\n // }\n //\n // bit_depth = gb.readUEG() + 8\n // gb.readUEG()\n // gb.readBits(1)\n // if (gb.readBool()) {\n // let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12\n // for (let i = 0; i < scaling_list_count; i++) {\n // if (gb.readBool()) {\n // if (i < 6) {\n // SPSParser._skipScalingList(gb, 16)\n // } else {\n // SPSParser._skipScalingList(gb, 64)\n // }\n // }\n // }\n // }\n // }\n // gb.readUEG()\n // let pic_order_cnt_type = gb.readUEG()\n // if (pic_order_cnt_type === 0) {\n // gb.readUEG()\n // } else if (pic_order_cnt_type === 1) {\n // gb.readBits(1)\n // gb.readSEG()\n // gb.readSEG()\n // let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG()\n // for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n // gb.readSEG()\n // }\n // }\n // gb.readUEG()\n // gb.readBits(1)\n //\n // let pic_width_in_mbs_minus1 = gb.readUEG()\n // let pic_height_in_map_units_minus1 = gb.readUEG()\n //\n // let frame_mbs_only_flag = gb.readBits(1)\n // if (frame_mbs_only_flag === 0) {\n // gb.readBits(1)\n // }\n // gb.readBits(1)\n //\n // let frame_crop_left_offset = 0\n // let frame_crop_right_offset = 0\n // let frame_crop_top_offset = 0\n // let frame_crop_bottom_offset = 0\n //\n // let frame_cropping_flag = gb.readBool()\n // if (frame_cropping_flag) {\n // frame_crop_left_offset = gb.readUEG()\n // frame_crop_right_offset = gb.readUEG()\n // frame_crop_top_offset = gb.readUEG()\n // frame_crop_bottom_offset = gb.readUEG()\n // }\n //\n // let par_width = 1, par_height = 1\n // let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0\n //\n // let vui_parameters_present_flag = gb.readBool()\n // if (vui_parameters_present_flag) {\n // if (gb.readBool()) { // aspect_ratio_info_present_flag\n // let aspect_ratio_idc = gb.readByte()\n // let par_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2]\n // let par_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1]\n //\n // if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n // par_width = par_w_table[aspect_ratio_idc - 1]\n // par_height = par_h_table[aspect_ratio_idc - 1]\n // } else if (aspect_ratio_idc === 255) {\n // par_width = gb.readByte() << 8 | gb.readByte()\n // par_height = gb.readByte() << 8 | gb.readByte()\n // }\n // }\n //\n // if (gb.readBool()) {\n // gb.readBool()\n // }\n // if (gb.readBool()) {\n // gb.readBits(4)\n // if (gb.readBool()) {\n // gb.readBits(24)\n // }\n // }\n // if (gb.readBool()) {\n // gb.readUEG()\n // gb.readUEG()\n // }\n // if (gb.readBool()) {\n // let num_units_in_tick = gb.readBits(32)\n // let time_scale = gb.readBits(32)\n // fps_fixed = gb.readBool()\n //\n // fps_num = time_scale\n // fps_den = num_units_in_tick * 2\n // fps = fps_num / fps_den\n // }\n // }\n //\n // let parScale = 1\n // if (par_width !== 1 || par_height !== 1) {\n // parScale = par_width / par_height\n // }\n //\n // let crop_unit_x = 0, crop_unit_y = 0\n // if (chroma_format_idc === 0) {\n // crop_unit_x = 1\n // crop_unit_y = 2 - frame_mbs_only_flag\n // } else {\n // let sub_wc = (chroma_format_idc === 3) ? 1 : 2\n // let sub_hc = (chroma_format_idc === 1) ? 2 : 1\n // crop_unit_x = sub_wc\n // crop_unit_y = sub_hc * (2 - frame_mbs_only_flag)\n // }\n //\n // let codec_width = (pic_width_in_mbs_minus1 + 1) * 16\n // let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16)\n //\n // codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x\n // codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y\n //\n // let present_width = Math.ceil(codec_width * parScale)\n //\n // gb.destroy()\n // gb = null\n //\n // return {\n // profile_string: profile_string,\n // level_string: level_string,\n // bit_depth: bit_depth,\n // chroma_format: chroma_format,\n // chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n //\n // frame_rate: {\n // fixed: fps_fixed,\n // fps: fps,\n // fps_den: fps_den,\n // fps_num: fps_num\n // },\n //\n // par_ratio: {\n // width: par_width,\n // height: par_height\n // },\n //\n // codec_size: {\n // width: codec_width,\n // height: codec_height\n // },\n //\n // present_size: {\n // width: present_width,\n // height: codec_height\n // }\n // }\n // }\n /**\n * @param gb\n * @param maxSubLayersMinus1\n * @return {{general_profile_idc: (*|number), general_level_idc: (*|number), general_tier_flag: (*|number), general_profile_space: (*|number)}}\n */\n\n }, {\n key: '_readProfileTierLevel',\n value: function _readProfileTierLevel(gb, maxSubLayersMinus1) {\n var general_profile_space = 0;\n var general_tier_flag = 0;\n var general_profile_idc = 0;\n var general_level_idc = 0;\n general_profile_space = gb.readBits(2) || 0; // profile_space\n general_tier_flag = gb.readBits(1) || 0; // tierFlag\n general_profile_idc = gb.readBits(5) || 0; // profileIdc\n\n gb.readBits(16); // some 32bits\n gb.readBits(16);\n\n gb.readBits(1); // progressiveSourceFlag\n gb.readBits(1); // interlacedSourceFlag\n gb.readBits(1); // nonPackedConstraintFlag\n gb.readBits(1); // frameOnlyConstraintFlag\n\n gb.readBits(16); // reserved zero bits\n gb.readBits(16);\n gb.readBits(12);\n\n general_level_idc = gb.readBits(8) || 0; // level_idc\n\n var subLayerProfilePresentFlag = [];\n var subLayerLevelPresentFlag = [];\n for (var j = 0; j < maxSubLayersMinus1; j++) {\n subLayerProfilePresentFlag[j] = gb.readBits(1);\n subLayerLevelPresentFlag[j] = gb.readBits(1);\n }\n\n if (maxSubLayersMinus1 > 0) {\n gb.readBits((8 - maxSubLayersMinus1) * 2);\n }\n\n for (var i = 0; i < maxSubLayersMinus1; i++) {\n if (subLayerProfilePresentFlag[i] !== 0) {\n gb.readBits(2);\n gb.readBits(1);\n gb.readBits(5);\n\n gb.readBits(16);\n gb.readBits(16);\n\n gb.readBits(4);\n\n gb.readBits(16);\n gb.readBits(16);\n gb.readBits(12);\n }\n if (subLayerLevelPresentFlag[i] !== 0) {\n gb.readBits(8);\n }\n }\n\n return {\n general_profile_space: general_profile_space,\n general_tier_flag: general_tier_flag,\n general_profile_idc: general_profile_idc,\n general_level_idc: general_level_idc\n };\n }\n\n /**\n *\n * @param {any} gb\n * @param {number}count\n */\n\n }, {\n key: '_skipScalingList',\n value: function _skipScalingList(gb, count) {\n var lastScale = 8;\n var nextScale = 8;\n var deltaScale = 0;\n for (var i = 0; i < count; i++) {\n if (nextScale !== 0) {\n deltaScale = gb.readSEG();\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = nextScale === 0 ? lastScale : nextScale;\n }\n }\n\n /**\n *\n * @param {number} profileIdc\n * @return {string}\n */\n\n }, {\n key: 'getProfileString',\n value: function getProfileString(profileIdc) {\n switch (profileIdc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n /**\n * @param {number} levelIdc\n * @return {string}\n */\n\n }, {\n key: 'getLevelString',\n value: function getLevelString(levelIdc) {\n return (levelIdc / 10).toFixed(1);\n }\n\n /**\n * @param {number} chroma\n * @return {string}\n */\n\n }, {\n key: 'getChromaFormatString',\n value: function getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n /**\n * @param {any} spsConfig\n * @return {any}\n */\n\n }, {\n key: 'toVideoMeta',\n value: function toVideoMeta(spsConfig) {\n var meta = {};\n if (spsConfig && spsConfig.codec_size) {\n meta.codecWidth = spsConfig.codec_size.width;\n meta.codecHeight = spsConfig.codec_size.height;\n meta.presentWidth = spsConfig.present_size.width;\n meta.presentHeight = spsConfig.present_size.height;\n } else if (spsConfig.width && spsConfig.height) {\n meta.codecWidth = spsConfig.width;\n meta.codecHeight = spsConfig.height;\n meta.presentWidth = spsConfig.width;\n meta.presentHeight = spsConfig.height;\n }\n\n meta.profile = spsConfig.profile_string;\n meta.level = spsConfig.level_string;\n meta.bitDepth = spsConfig.bit_depth;\n meta.chromaFormat = spsConfig.chroma_format;\n\n // meta.parRatio = {\n // width: spsConfig.par_ratio.width,\n // height: spsConfig.par_ratio.height\n // }\n\n // meta.frameRate = spsConfig.frame_rate\n\n // let fpsDen = meta.frameRate.fps_den\n // let fpsNum = meta.frameRate.fps_num\n // meta.refSampleDuration = Math.floor(meta.timescale * (fpsDen / fpsNum))\n return meta;\n }\n }]);\n\n return SPSParser;\n}();\n\nexport default SPSParser;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar RBSP = function () {\n function RBSP() {\n _classCallCheck(this, RBSP);\n }\n\n _createClass(RBSP, null, [{\n key: \"EBSP2RBSP\",\n\n /**\n * convert EBSP to RBSP\n * @param {Uint8Array} data\n * @returns {Uint8Array}\n * @constructor\n */\n value: function EBSP2RBSP(data) {\n return data.filter(function (el, idx) {\n if (idx < 2) {\n return true;\n } else {\n return !(data[idx - 2] === 0 && data[idx - 1] === 0 && el === 3);\n }\n });\n }\n\n /**\n * @param {Uint8Array} data\n * @constructor\n */\n\n }, {\n key: \"EBSP2SODB\",\n value: function EBSP2SODB(data) {\n var lastByte = data[data.byteLength - 1];\n if (lastByte && lastByte === 128) {\n return data.slice(0, data.byteLength - 1);\n }\n\n return data;\n }\n }]);\n\n return RBSP;\n}();\n\nexport default RBSP;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport RBSP from './rbsp';\n\n/**\n * @param {Uint8Array} data\n * @return {string}\n */\nvar u8aToString = function u8aToString(data) {\n var result = '';\n for (var i = 0; i < data.byteLength; i++) {\n result += String.fromCharCode(data[i]);\n }\n return result;\n};\n\nvar SEIParser = function () {\n function SEIParser() {\n _classCallCheck(this, SEIParser);\n }\n\n _createClass(SEIParser, null, [{\n key: '_resolveNalu',\n value: function _resolveNalu(data) {\n if (data.length >= 1) {\n return RBSP.EBSP2SODB(RBSP.EBSP2RBSP(data.slice(1)));\n }\n return null;\n }\n\n /**\n * @param {Uint8Array} data\n * @return {{uuid: string, content: null}|{code: number, uuid: string, content: string}|{code: number, content: Uint8Array}}\n */\n\n }, {\n key: 'parse',\n value: function parse(data) {\n var sodb = SEIParser._resolveNalu(data);\n\n var _SEIParser$switchPayl = SEIParser.switchPayloadType(sodb),\n payloadType = _SEIParser$switchPayl.payloadType,\n offset = _SEIParser$switchPayl.offset;\n\n var content = sodb.slice(offset);\n\n switch (payloadType) {\n case 5:\n return SEIParser.user_data_unregistered(content);\n default:\n return {\n code: payloadType,\n content: content\n };\n }\n }\n\n /**\n *\n * @param {Uint8Array} data\n * @returns {{payloadType: number, offset: number}}\n */\n\n }, {\n key: 'switchPayloadType',\n value: function switchPayloadType(data) {\n var dv = new DataView(data.buffer);\n var payloadType = 0;\n var offset = 0;\n while (dv.getUint8(offset) === 255) {\n offset++;\n payloadType += 255;\n }\n payloadType += dv.getUint8(offset++);\n\n return {\n payloadType: payloadType,\n offset: offset\n };\n }\n\n /**\n *\n * @param {Uint8Array} data\n * @return {{ payloadLength: number, offset: number }}\n */\n\n }, {\n key: 'getPayloadLength',\n value: function getPayloadLength(data) {\n var dv = new DataView(data.buffer);\n\n var payloadLength = 0;\n var offset = 0;\n while (dv.getUint8(offset) === 255) {\n offset++;\n payloadLength += 255;\n }\n payloadLength += dv.getUint8(offset++);\n\n return {\n payloadLength: payloadLength,\n offset: offset\n };\n }\n\n /**\n * resolve 0x05 user data unregistered\n * @param {Uint8Array} data\n */\n // eslint-disable-next-line camelcase\n\n }, {\n key: 'user_data_unregistered',\n value: function user_data_unregistered(data) {\n var _SEIParser$getPayload = SEIParser.getPayloadLength(data),\n payloadLength = _SEIParser$getPayload.payloadLength,\n offset = _SEIParser$getPayload.offset;\n\n if (payloadLength < 16) {\n return {\n uuid: '',\n content: null\n };\n }\n var payload = data.slice(offset);\n\n var uuid = u8aToString(payload.slice(0, 16));\n var content = u8aToString(payload.slice(16, payloadLength));\n\n return {\n code: 5, // for user data unregistered\n uuid: uuid,\n content: content\n };\n }\n }]);\n\n return SEIParser;\n}();\n\nexport default SEIParser;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport SpsParser from './sps';\nimport SEIParser from './sei';\n\nvar Nalunit = function () {\n function Nalunit() {\n _classCallCheck(this, Nalunit);\n }\n\n _createClass(Nalunit, null, [{\n key: 'getNalunits',\n\n /**\n * @param {any} buffer\n * @return {[]|*[]}\n */\n value: function getNalunits(buffer) {\n if (buffer.length - buffer.position < 4) {\n return [];\n }\n\n var buf = buffer.dataview;\n var position = buffer.position;\n\n if (buf.getInt32(position) === 1 || buf.getInt16(position) === 0 && buf.getInt8(position + 2) === 1) {\n return Nalunit.getAnnexbNals(buffer);\n } else {\n return Nalunit.getHvccNals(buffer);\n }\n }\n\n /**\n * @param {any} buffer\n * @return {[]}\n */\n\n }, {\n key: 'getAnnexbNals',\n value: function getAnnexbNals(buffer) {\n var nals = [];\n var position = Nalunit.getHeaderPositionAnnexB(buffer);\n var start = position.pos;\n var end = start;\n while (start < buffer.length - 4) {\n var header = buffer.buffer.slice(start, start + position.headerLength);\n if (position.pos === buffer.position) {\n buffer.skip(position.headerLength);\n }\n position = Nalunit.getHeaderPositionAnnexB(buffer);\n end = position.pos;\n var body = new Uint8Array(buffer.buffer.slice(start + header.byteLength, end));\n var unit = { header: header, body: body };\n Nalunit.analyseNal(unit);\n if (unit.type <= 40) {\n nals.push(unit);\n }\n buffer.skip(end - buffer.position);\n start = end;\n }\n return nals;\n }\n\n // |四字节 nalSize| nalUnit |\n /**\n * @param {any} buffer\n * @return {[]}\n */\n\n }, {\n key: 'getHvccNals',\n value: function getHvccNals(buffer) {\n // console.log('getHvccNals')\n var nals = [];\n while (buffer.position < buffer.length - 4) {\n // console.log('buffer')\n // console.log(buffer)\n // console.log(buffer.position)\n // console.log(buffer.length)\n // console.log(buffer.dataview)\n // let length = buffer.dataview.getInt32();\n var length = buffer.dataview.getInt32(buffer.dataview.position);\n if (buffer.length - buffer.position >= length) {\n var header = buffer.buffer.slice(buffer.position, buffer.position + 4);\n buffer.skip(4);\n var body = new Uint8Array(buffer.buffer.slice(buffer.position, buffer.position + length));\n buffer.skip(length);\n var unit = { header: header, body: body };\n try {\n Nalunit.analyseNal(unit);\n } catch (e) {\n continue;\n }\n if (unit.type <= 40) {\n nals.push(unit);\n }\n } else {\n break;\n }\n }\n return nals;\n }\n\n /**\n * @param {any} unit\n */\n\n }, {\n key: 'analyseNal',\n value: function analyseNal(unit) {\n var type = unit.body[0] >>> 1 & 0x3f;\n unit.type = type;\n switch (type) {\n case 0:\n // SLICE_TRAIL_N\n unit.slice_trail_n = true;\n break;\n case 1:\n // SLICE_TRAIL_R\n unit.slice_trail_r = true;\n unit.key = true;\n break;\n case 2:\n // SLICE_TSA_N\n unit.slice_tsa_n = true;\n break;\n case 3:\n // SLICE_TSA_R\n unit.slice_tsa_r = true;\n unit.key = true;\n break;\n case 4:\n // SLICE_STSA_N\n unit.slice_stsa_n = true;\n break;\n case 5:\n // SLICE_STSA_R\n unit.slice_stsa_r = true;\n unit.key = true;\n break;\n case 6:\n // SLICE_RADL_N\n unit.slice_radl_n = true;\n break;\n case 7:\n // SLICE_RADL_R\n unit.slice_radl_r = true;\n unit.key = true;\n break;\n case 8:\n // SLICE_RASL_N\n unit.slice_rasl_n = true;\n break;\n case 9:\n // SLICE_RASL_R\n unit.slice_rasl_r = true;\n unit.key = true;\n break;\n case 16:\n // SLICE_BLA_W_LP\n unit.slice_bla_w_lp = true;\n break;\n case 17:\n // SLICE_BLA_W_RADL\n unit.slice_bla_w_radl = true;\n break;\n case 18:\n // SLICE_BLA_N_LP\n unit.slice_bla_n_lp = true;\n break;\n case 19:\n // SLICE_IDR_W_RADL\n unit.slice_idl_w_radl = true;\n unit.key = true;\n break;\n case 20:\n // SLICE_IDR_N_LP\n unit.slice_idr_n_lp = true;\n unit.key = true;\n break;\n case 21:\n // SLICE_CRA_NUT\n unit.slice_cra_nut = true;\n unit.key = true;\n break;\n case 32:\n // VPS\n unit.vps = true;\n break;\n case 33:\n // SPS\n unit.sps = SpsParser.parseSPS(unit.body);\n break;\n case 34:\n // PPS\n unit.pps = true;\n break;\n case 35:\n // AUD\n break;\n case 36:\n // EOS\n unit.aud = true;\n break;\n case 37:\n // EOB\n unit.eob = true;\n break;\n case 38:\n // FD\n unit.fd = true;\n break;\n case 39:\n // PREFIX_SEI\n // unit.prefix_sei = true;\n try {\n unit.sei = SEIParser.parse(unit.body.slice(1));\n } catch (e) {}\n break;\n case 40:\n // SUFFIX_SEI\n unit.sei = SEIParser.parse(unit.body.slice(1));\n break;\n default:\n break;\n }\n }\n }, {\n key: 'getHeaderPositionAnnexB',\n value: function getHeaderPositionAnnexB(buffer) {\n // seperate\n var pos = buffer.position;\n var headerLength = 0;\n var bufferLen = buffer.length;\n while (headerLength !== 3 && headerLength !== 4 && pos < bufferLen - 4) {\n if (buffer.dataview.getInt16(pos) === 0) {\n if (buffer.dataview.getInt16(pos + 2) === 1) {\n // 0x00000001\n headerLength = 4;\n } else if (buffer.dataview.getInt8(pos + 2) === 1) {\n headerLength = 3;\n } else {\n pos++;\n }\n } else {\n pos++;\n }\n }\n\n if (pos === bufferLen - 4) {\n if (buffer.dataview.getInt16(pos) === 0) {\n if (buffer.dataview.getInt16(pos + 2) === 1) {\n // 0x00000001\n headerLength = 4;\n }\n } else {\n pos++;\n if (buffer.dataview.getInt16(pos) === 0 && buffer.dataview.getInt8(pos) === 1) {\n // 0x000001\n headerLength = 3;\n } else {\n pos = bufferLen;\n }\n }\n }\n return { pos: pos, headerLength: headerLength };\n }\n }]);\n\n return Nalunit;\n}();\n\nexport default Nalunit;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { EVENTS, common, logger } from 'xgplayer-helper-utils';\nimport AAC from '../aac';\n\nvar REMUX_EVENTS = EVENTS.REMUX_EVENTS;\nvar caculate = common.caculate;\n\nvar Compatibility = function () {\n function Compatibility() {\n var _this = this;\n\n _classCallCheck(this, Compatibility);\n\n this.TAG = 'Compatibility';\n this.nextAudioDts = 0; // 模拟下一段音频数据的dts\n this.nextVideoDts = 0; // 模拟下一段视频数据的dts\n\n this.lastAudioSamplesLen = 0; // 上一段音频数据的长度\n this.lastVideoSamplesLen = 0; // 上一段视频数据的长度\n\n this.lastVideoDts = undefined; // 上一段音频数据的长度\n this.lastAudioDts = undefined; // 上一段视频数据的长度\n\n this.allAudioSamplesCount = 0; // 音频总数据量(原始帧)\n this.allVideoSamplesCount = 0; // 视频总数据量(原始帧)\n\n this._firstAudioSample = null;\n this._firstVideoSample = null;\n\n this.filledAudioSamples = []; // 补充音频帧()\n this.filledVideoSamples = []; // 补充视频帧()\n\n this.videoLastSample = null;\n this.audioLastSample = null; // stash last sample for duration compat\n\n Object.defineProperties(this, {\n _videoLargeGap: {\n set: function set(value) {\n _this.___videoLargeGap = value;\n if (value !== 0) {\n _this.emit(REMUX_EVENTS.DETECT_LARGE_GAP, 'video', value);\n }\n },\n get: function get() {\n return _this.___videoLargeGap || 0;\n }\n },\n _audioLargeGap: {\n set: function set(value) {\n _this.___audioLargeGap = value;\n if (value !== 0) {\n _this.emit(REMUX_EVENTS.DETECT_LARGE_GAP, 'audio', value);\n }\n },\n get: function get() {\n return _this.___audioLargeGap || 0;\n }\n }\n });\n this.audioUnsyncTime = 0;\n }\n\n _createClass(Compatibility, [{\n key: 'init',\n value: function init() {\n this.before(REMUX_EVENTS.REMUX_MEDIA, this.doFix.bind(this));\n }\n }, {\n key: 'reset',\n value: function reset() {\n this.nextAudioDts = null; // 估算下一段音频数据的dts\n this.nextVideoDts = null; // 估算下一段视频数据的dts\n\n this.lastAudioSamplesLen = 0; // 上一段音频数据的长度\n this.lastVideoSamplesLen = 0; // 上一段视频数据的长度\n\n this.lastVideoDts = undefined; // 上一段音频数据的dts\n this.lastAudioDts = undefined; // 上一段视频数据的dts\n this.lastVideoDuration = undefined;\n\n // this.allAudioSamplesCount = 0 // 音频总数据量(原始帧)\n // this.allVideoSamplesCount = 0 // 视频总数据量(原始帧)\n\n this._audioLargeGap = 0;\n this._videoLargeGap = 0;\n\n // this._firstAudioSample = null\n // this._firstVideoSample = null\n // this._firstAudioSample = null\n // this._firstVideoSample = null\n this.videoLastSample = null;\n this.audioLastSample = null;\n\n this.filledAudioSamples = []; // 补充音频帧()\n this.filledVideoSamples = []; // 补充视频帧()\n\n this.audioUnsyncTime = 0;\n }\n }, {\n key: 'doFix',\n value: function doFix() {\n var _getFirstSample = this.getFirstSample(),\n isFirstAudioSamples = _getFirstSample.isFirstAudioSamples,\n isFirstVideoSamples = _getFirstSample.isFirstVideoSamples;\n\n this.recordSamplesCount();\n\n if (this._firstVideoSample) {\n this.fixVideoRefSampleDuration(this.videoTrack.meta, this.videoTrack.samples);\n }\n\n var _Compatibility$detect = Compatibility.detectChangeStream(this.videoTrack.samples, isFirstVideoSamples),\n videoChanged = _Compatibility$detect.changed,\n videoChangedIdxes = _Compatibility$detect.changedIdxes;\n\n if (videoChanged) {\n var disContinue = false;\n for (var i = 0; i < videoChangedIdxes.length; i++) {\n if (this.fixChangeStreamVideo(videoChangedIdxes[i], isFirstVideoSamples)) {\n disContinue = true;\n }\n }\n if (!disContinue) {\n this.doFixVideo(isFirstVideoSamples);\n }\n } else {\n this.doFixVideo(isFirstVideoSamples);\n }\n\n var _Compatibility$detect2 = Compatibility.detectChangeStream(this.audioTrack.samples, isFirstAudioSamples),\n audioChanged = _Compatibility$detect2.changed,\n audioChangedIdxes = _Compatibility$detect2.changedIdxes;\n\n if (audioChanged) {\n var _disContinue = false;\n for (var _i = 0; _i < audioChangedIdxes.length; _i++) {\n if (this.fixChangeStreamAudio(audioChangedIdxes[_i], isFirstAudioSamples)) {\n _disContinue = true;\n }\n }\n if (!_disContinue) {\n this.doFixAudio(isFirstAudioSamples);\n } else {\n return;\n }\n } else {\n this.doFixAudio(isFirstAudioSamples);\n }\n\n this.removeInvalidSamples();\n }\n }, {\n key: 'doFixVideo',\n value: function doFixVideo(first, streamChangeStart) {\n var _videoTrack = this.videoTrack,\n videoSamples = _videoTrack.samples,\n meta = _videoTrack.meta;\n\n var len = videoSamples.length;\n\n for (var i = 0; i < len; i++) {\n var sample = videoSamples[i];\n sample.originDts = sample.dts;\n sample.originPts = sample.pts;\n }\n\n if (!videoSamples || !len || !this._firstVideoSample) {\n return;\n }\n\n var firstSample = videoSamples[0];\n\n logger.log(this.TAG, 'doFixVideo:: lastVideoDts: ' + this.lastVideoDts + ' , _videoLargeGap: ' + this._videoLargeGap + ' ,streamChangeStart:' + streamChangeStart + ', lastVideoSample:[dts=' + (this.videoLastSample && this.videoLastSample.dts) + ' , pts=' + (this.videoLastSample && this.videoLastSample.pts) + '] , firstDTS:' + firstSample.dts + ' ,firstPTS:' + firstSample.pts + ' ,lastDTS:' + videoSamples[len - 1].dts + ' , lastPTS: ' + videoSamples[len - 1].pts);\n\n // !first: 非首次加载的分片\n if (!first && this.videoLastSample === null && firstSample.options && firstSample.options.start) {\n if (streamChangeStart !== undefined) {\n streamChangeStart = firstSample.options.start;\n }\n }\n if (!first && streamChangeStart === undefined && this.videoLastSample && Compatibility.detectVideoLargeGap(this.videoLastSample ? this.videoLastSample.dts : 0, firstSample.dts + this._videoLargeGap)) {\n // large gap 不准确,出现了非换流场景的时间戳跳变\n this._videoLargeGap = this.videoLastSample.dts + meta.refSampleDuration - firstSample.dts;\n }\n // step0.修复hls流出现巨大gap,需要强制重定位的问题。\n if (this._videoLargeGap !== 0) {\n Compatibility.doFixLargeGap(videoSamples, this._videoLargeGap);\n if (this._videoLargeGap !== this.preVideoGap) {\n this.preVideoGap = this._videoLargeGap;\n this.emit(REMUX_EVENTS.DETECT_CHANGE_STREAM_DISCONTINUE, 'video', { prevDts: this.videoLastSample && this.videoLastSample.originDts, curDts: firstSample.originDts, duration: meta.refSampleDuration });\n }\n }\n\n if (!first && streamChangeStart !== undefined) {\n this._videoLargeGap = streamChangeStart - firstSample.dts;\n Compatibility.doFixLargeGap(videoSamples, this._videoLargeGap);\n }\n\n // step1. 修复与audio首帧差距太大的问题\n if (first && this._firstAudioSample) {\n var videoFirstDts = this._firstVideoSample.originDts;\n var audioFirstDts = this._firstAudioSample.originDts || this._firstAudioSample.dts;\n var gap = videoFirstDts - audioFirstDts;\n if (gap > 2 * meta.refSampleDuration && gap < 10 * meta.refSampleDuration) {\n var fillCount = Math.floor(gap / meta.refSampleDuration);\n\n for (var _i2 = 0; _i2 < fillCount; _i2++) {\n var clonedFirstSample = Object.assign({}, firstSample); // 视频头部帧缺失需要复制第一帧\n // 重新计算sample的dts和pts\n clonedFirstSample.dts = videoFirstDts - (_i2 + 1) * meta.refSampleDuration;\n clonedFirstSample.pts = clonedFirstSample.dts + clonedFirstSample.cts;\n\n videoSamples.unshift(clonedFirstSample);\n\n this.filledVideoSamples.push({\n dts: clonedFirstSample.dts,\n size: clonedFirstSample.data.byteLength\n });\n }\n this._firstVideoSample = this.filledVideoSamples[0] || this._firstVideoSample;\n } else if (Math.abs(gap) > 2 * meta.refSampleDuration && !this._videoLargeGap) {\n this._videoLargeGap = -1 * gap;\n Compatibility.doFixLargeGap(videoSamples, -1 * gap);\n }\n }\n\n var curLastSample = videoSamples.pop();\n if (videoSamples.length) {\n videoSamples[videoSamples.length - 1].duration = curLastSample.dts - videoSamples[videoSamples.length - 1].dts;\n }\n\n if (this.videoLastSample) {\n var videoLastSample = this.videoLastSample;\n videoLastSample.duration = firstSample.dts - videoLastSample.dts;\n videoSamples.unshift(this.videoLastSample);\n }\n\n // videoSamples.forEach((sample, idx) => {\n // if (idx !== 0 && idx !== videoSamples.length - 1) {\n // const pre = videoSamples[idx - 1];\n // const next = videoSamples[idx + 1];\n // if (sample.dts - pre.dts < 5) {\n // sample.dts = (pre.dts + next.dts) / 2\n // sample.pts = (pre.pts + next.pts) / 2\n // }\n // }\n // })\n\n this.videoLastSample = curLastSample;\n if (videoSamples[videoSamples.length - 1]) {\n this.lastVideoDuration = videoSamples[videoSamples.length - 1].duration;\n this.lastVideoDts = videoSamples[videoSamples.length - 1].dts;\n }\n this.videoTrack.samples = videoSamples;\n }\n }, {\n key: 'doFixAudio',\n value: function doFixAudio(first, streamChangeStart) {\n var _this2 = this;\n\n var _audioTrack = this.audioTrack,\n audioSamples = _audioTrack.samples,\n meta = _audioTrack.meta;\n\n\n if (!audioSamples || !audioSamples.length) {\n return;\n }\n\n this.fixAudioRefSampleDuration(meta);\n\n for (var i = 0, len = audioSamples.length; i < len; i++) {\n var sample = audioSamples[i];\n sample.originDts = sample.dts;\n }\n\n // console.log(`audio lastSample, ${audioSamples[audioSamples.length - 1].dts}`)\n\n var samplesLen = audioSamples.length;\n var silentFrame = AAC.getSilentFrame(meta.codec, meta.channelCount);\n var iRefSampleDuration = Math.floor(meta.refSampleDuration);\n\n var firstSample = this._firstAudioSample;\n\n var _firstSample = audioSamples[0];\n\n logger.log(this.TAG, 'doFixAudio:: audioDtsBase:' + this.audioDtsBase + ' , _audioLargeGap: ' + this._audioLargeGap + ', streamChangeStart:' + streamChangeStart + ' , nextAudioDts:' + this.nextAudioDts + ', audio: firstDTS:' + _firstSample.dts + ' ,firstPTS:' + _firstSample.pts + ' ,lastDTS:' + audioSamples[samplesLen - 1].dts + ' , lastPTS: ' + audioSamples[samplesLen - 1].pts);\n\n if (!first && this.nextAudioDts === null && _firstSample.options && _firstSample.options.start) {\n if (streamChangeStart !== undefined) {\n streamChangeStart = _firstSample.options.start;\n }\n }\n\n if (!first && streamChangeStart === undefined && this.nextAudioDts && Compatibility.detectAudioLargeGap(this.nextAudioDts || 0, _firstSample.dts + this._audioLargeGap)) {\n // large gap 不准确,出现了非换流场景的时间戳跳变\n var _audioLargeGap = this.nextAudioDts - _firstSample.dts;\n this._audioLargeGap = Math.abs(_audioLargeGap - this._videoLargeGap) < 200 ? this._videoLargeGap : _audioLargeGap;\n }\n\n // 对audioSamples按照dts做排序\n if (this._audioLargeGap !== 0) {\n if (this._audioLargeGap > 0) {\n Compatibility.doFixLargeGap(audioSamples, this._audioLargeGap);\n }\n if (this._audioLargeGap !== this.preAudioGap) {\n this.preAudioGap = this._audioLargeGap;\n this.emit(REMUX_EVENTS.DETECT_CHANGE_STREAM_DISCONTINUE, 'audio', { prevDts: this.lastAudioOriginDts, curDts: _firstSample.originDts, duration: iRefSampleDuration });\n }\n } else if (!first && (streamChangeStart !== undefined || Compatibility.detectAudioLargeGap(this.nextAudioDts, _firstSample.dts))) {\n if (streamChangeStart !== undefined) {\n this.nextAudioDts = streamChangeStart; // FIX: Hls中途切codec,在如果直接seek到后面的点会导致largeGap计算失败\n }\n this._audioLargeGap = this.nextAudioDts - _firstSample.dts;\n\n if (_firstSample.options.start && !_firstSample.options.start.isContinue) {\n Compatibility.doFixLargeGap(audioSamples, this._audioLargeGap);\n }\n }\n // step0. 首帧与video首帧间距大的问题\n if (this._firstVideoSample && first) {\n var videoFirstPts = this._firstVideoSample.originDts || this._firstVideoSample.dts;\n var _gap = firstSample.dts - videoFirstPts;\n\n if (_gap === this._videoLargeGap) {\n // already fixed by doFixVideo\\\n } else if (_gap > meta.refSampleDuration && _gap < 10 * meta.refSampleDuration) {\n var silentSampleCount = Math.floor((firstSample.dts - videoFirstPts) / meta.refSampleDuration);\n\n for (var _i3 = 0; _i3 < silentSampleCount; _i3++) {\n var silentSample = {\n data: silentFrame,\n datasize: silentFrame.byteLength,\n dts: firstSample.dts - (_i3 + 1) * meta.refSampleDuration,\n filtered: 0\n };\n\n audioSamples.unshift(silentSample);\n\n this.filledAudioSamples.push({\n dts: silentSample.dts,\n size: silentSample.data.byteLength\n });\n }\n this._firstAudioSample = this.filledAudioSamples[0] || this._firstAudioSample;\n } else if (_gap < -1 * meta.refSampleDuration) {\n this._audioLargeGap = -1 * _gap;\n Compatibility.doFixLargeGap(audioSamples, -1 * _gap);\n }\n }\n\n var gap = void 0;\n var firstDts = audioSamples[0].dts;\n\n if (this.nextAudioDts) {\n // step1. 处理samples段之间的丢帧情况\n // 当发现duration差距大于1帧时进行补帧\n gap = firstDts - this.nextAudioDts;\n var absGap = Math.abs(gap);\n\n if (gap >= iRefSampleDuration && gap < 10000 && silentFrame) {\n var silentFrameCount = Math.ceil(gap / iRefSampleDuration);\n\n for (var _i4 = 0; _i4 < silentFrameCount; _i4++) {\n var computed = firstDts - (_i4 + 1) * iRefSampleDuration;\n var _silentSample = {\n dts: computed > this.nextAudioDts ? computed : this.nextAudioDts,\n pts: computed > this.nextAudioDts ? computed : this.nextAudioDts,\n datasize: silentFrame.byteLength,\n filtered: 0,\n data: silentFrame\n };\n\n this.filledAudioSamples.push({\n dts: _silentSample.dts,\n size: _silentSample.data.byteLength\n });\n this.audioTrack.samples.unshift(_silentSample);\n _firstSample = _silentSample;\n }\n this.emit(REMUX_EVENTS.DETECT_AUDIO_GAP, gap, silentFrameCount);\n } else if (absGap < meta.refSampleDuration && absGap > 0) {\n // 当差距比较小的时候将音频帧重定位\n // console.log('重定位音频帧dts', audioSamples[0].dts, this.nextAudioDts)\n _firstSample.dts = this.nextAudioDts;\n _firstSample.pts = this.nextAudioDts;\n } else if (gap < 0 && absGap < iRefSampleDuration) {\n Compatibility.doFixLargeGap(audioSamples, -1 * gap);\n this.emit(REMUX_EVENTS.DETECT_AUDIO_OVERLAP, gap);\n }\n }\n\n // 分片内采样间补帧\n var nextDts = audioSamples[0].dts + iRefSampleDuration;\n for (var _i5 = 1; _i5 < audioSamples.length;) {\n var _sample = audioSamples[_i5];\n var delta = _sample.dts - nextDts;\n if (delta <= -1 * iRefSampleDuration) {\n logger.warn('drop 1 audio sample for ' + delta + ' ms overlap');\n audioSamples.splice(_i5, 1);\n continue;\n }\n if (delta >= 10 * iRefSampleDuration) {\n var missingCount = Math.round(delta / iRefSampleDuration);\n if (missingCount > 1000) {\n break;\n }\n logger.warn(this.TAG, 'inject ' + missingCount + ' audio frame for ' + delta + ' ms gap');\n for (var j = 0; j < missingCount; j++) {\n var _silentSample2 = {\n data: silentFrame,\n datasize: silentFrame.byteLength,\n dts: nextDts,\n originDts: nextDts,\n filtered: 0\n };\n audioSamples.splice(_i5, 0, _silentSample2);\n nextDts += iRefSampleDuration;\n _i5++;\n }\n _sample.dts = _sample.pts = _sample.originDts = nextDts;\n nextDts += iRefSampleDuration;\n _i5++;\n } else {\n _sample.dts = _sample.pts = _sample.originDts = nextDts;\n nextDts += iRefSampleDuration;\n _i5++;\n }\n }\n\n var unSyncDuration = meta.refSampleDuration - iRefSampleDuration;\n audioSamples.forEach(function (sample, idx) {\n if (idx !== 0) {\n var _lastSample = audioSamples[idx - 1];\n sample.dts = sample.pts = _lastSample.dts + _lastSample.duration;\n }\n sample.duration = iRefSampleDuration;\n _this2.audioUnsyncTime = _this2.audioUnsyncTime + unSyncDuration;\n if (_this2.audioUnsyncTime >= 1) {\n sample.duration += 1;\n _this2.audioUnsyncTime -= 1;\n }\n });\n\n var lastSample = audioSamples[audioSamples.length - 1];\n this.lastAudioDts = lastSample.dts;\n var lastDuration = lastSample.duration;\n // const lastSampleDuration = audioSamples.length >= 2 ? lastOriginDts - audioSamples[audioSamples.length - 2].originDts : meta.refSampleDuration\n\n this.lastAudioSamplesLen = samplesLen;\n this.nextAudioDts = this.lastAudioDts + (lastDuration || iRefSampleDuration);\n this.lastAudioOriginDts = lastSample.originDts;\n\n this.audioTrack.samples = Compatibility.sortAudioSamples(audioSamples);\n }\n }, {\n key: 'fixChangeStreamVideo',\n value: function fixChangeStreamVideo(changeIdx) {\n logger.log(this.TAG, 'fixChangeStreamVideo(), changeIdx=', changeIdx);\n var _videoTrack2 = this.videoTrack,\n samples = _videoTrack2.samples,\n meta = _videoTrack2.meta;\n\n var preDuration = changeIdx === 0 ? this.lastVideoDuration ? this.lastVideoDuration : meta.refSampleDuration : meta.refSampleDuration;\n var prevDts = changeIdx === 0 ? this.lastVideoDts ? this.lastVideoDts : this.getStreamChangeStart(samples[0]) : samples[changeIdx - 1].dts;\n var curDts = samples[changeIdx].dts;\n var isContinue = Math.abs(prevDts - curDts) <= 10000;\n this.emit(REMUX_EVENTS.DETECT_CHANGE_STREAM, 'video', curDts);\n if (isContinue) {\n if (!samples[changeIdx].options) {\n samples[changeIdx].options = {\n isContinue: true\n };\n } else {\n samples[changeIdx].options.isContinue = true;\n }\n return false;\n }\n\n this.emit(REMUX_EVENTS.DETECT_CHANGE_STREAM_DISCONTINUE, 'video', { prevDts: prevDts, curDts: curDts, duration: preDuration });\n\n var firstPartSamples = samples.slice(0, changeIdx);\n var secondPartSamples = samples.slice(changeIdx);\n var changeSample = samples[changeIdx];\n\n var streamChangeStart = void 0;\n\n this._videoLargeGap = 0;\n this.videoLastSample = null;\n this.lastVideoDts = null;\n this.lastVideoDuration = null;\n if (changeSample.options && changeSample.options.start !== undefined) {\n streamChangeStart = changeSample.options.start;\n } else {\n streamChangeStart = prevDts - this.videoDtsBase;\n }\n\n this.videoTrack.samples = samples.slice(0, changeIdx);\n\n this.doFixVideo(false);\n\n this.videoTrack.samples = samples.slice(changeIdx);\n\n this.doFixVideo(false, streamChangeStart);\n\n this.videoTrack.samples = firstPartSamples.concat(secondPartSamples);\n\n return true;\n }\n }, {\n key: 'fixChangeStreamAudio',\n value: function fixChangeStreamAudio(changeIdx) {\n logger.log(this.TAG, 'fixChangeStreamAudio(), changeIdx=', changeIdx);\n var _audioTrack2 = this.audioTrack,\n samples = _audioTrack2.samples,\n meta = _audioTrack2.meta;\n\n\n var prevDts = changeIdx === 0 ? this.lastAudioDts : samples[changeIdx - 1].dts;\n var curDts = samples[changeIdx].dts;\n var isContinue = Math.abs(prevDts - curDts) <= 10000;\n this.emit(REMUX_EVENTS.DETECT_CHANGE_STREAM, 'audio', curDts);\n if (isContinue) {\n if (!samples[changeIdx].options) {\n samples[changeIdx].options = {\n isContinue: true\n };\n } else {\n samples[changeIdx].options.isContinue = true;\n }\n return false;\n }\n this.emit(REMUX_EVENTS.DETECT_CHANGE_STREAM_DISCONTINUE, 'audio', { prevDts: prevDts, curDts: curDts, duration: meta.refSampleDuration });\n this._audioLargeGap = 0;\n var cacheNextAudioDts = this.nextAudioDts;\n this.nextAudioDts = null;\n var firstPartSamples = samples.slice(0, changeIdx);\n var secondPartSamples = samples.slice(changeIdx);\n var changeSample = samples[changeIdx];\n\n var streamChangeStart = void 0;\n if (changeSample.options && changeSample.options.start !== undefined) {\n streamChangeStart = changeSample.options.start;\n } else {\n streamChangeStart = cacheNextAudioDts;\n changeSample.options.isContinue = true;\n }\n\n this.audioTrack.samples = firstPartSamples;\n\n this.doFixAudio(false);\n\n this.audioTrack.samples = secondPartSamples;\n\n this.doFixAudio(false, streamChangeStart);\n\n this.audioTrack.samples = firstPartSamples.concat(secondPartSamples);\n\n return true;\n }\n }, {\n key: 'getFirstSample',\n value: function getFirstSample() {\n // 获取video和audio的首帧数据\n var videoSamples = this.videoTrack.samples;\n var audioSamples = this.audioTrack.samples;\n\n\n var isFirstVideoSamples = false;\n var isFirstAudioSamples = false;\n\n if (!this._firstVideoSample && videoSamples.length) {\n this._firstVideoSample = Compatibility.findFirstVideoSample(videoSamples);\n this.removeInvalidSamples();\n isFirstVideoSamples = true;\n }\n\n if (!this._firstAudioSample && audioSamples.length) {\n this._firstAudioSample = Compatibility.findFirstAudioSample(audioSamples); // 寻找dts最小的帧作为首个音频帧\n this.removeInvalidSamples();\n isFirstAudioSamples = true;\n }\n\n return {\n isFirstVideoSamples: isFirstVideoSamples,\n isFirstAudioSamples: isFirstAudioSamples\n };\n }\n\n /**\n * 在没有refSampleDuration的问题流中,\n */\n\n }, {\n key: 'fixVideoRefSampleDuration',\n value: function fixVideoRefSampleDuration(meta, samples) {\n if (!meta) {\n return;\n }\n var allSamplesCount = this.allVideoSamplesCount;\n var firstDts = this._firstVideoSample.dts;\n var filledSamplesCount = this.filledVideoSamples.length;\n if (!Compatibility.isRefSampleDurationValid(meta.refSampleDuration)) {\n if (samples.length >= 1) {\n var lastDts = samples[samples.length - 1].dts;\n\n var fixed = Math.floor((lastDts - firstDts) / (allSamplesCount + filledSamplesCount - 1)); // 将refSampleDuration重置为计算后的平均值\n\n if (Compatibility.isRefSampleDurationValid(fixed)) {\n meta.refSampleDuration = fixed;\n }\n }\n } else if (meta.refSampleDuration) {\n if (samples.length >= 5) {\n var _lastDts = samples[samples.length - 1].dts;\n var _firstDts = samples[0].dts;\n var durationAvg = (_lastDts - _firstDts) / (samples.length - 1);\n if (durationAvg > 0 && durationAvg < 1000) {\n var _fixed = Math.floor(Math.abs(meta.refSampleDuration - durationAvg) <= 5 ? meta.refSampleDuration : durationAvg); // 将refSampleDuration重置为计算后的平均值\n if (Compatibility.isRefSampleDurationValid(_fixed)) {\n meta.refSampleDuration = _fixed;\n }\n }\n }\n }\n\n if (!Compatibility.isRefSampleDurationValid(meta.refSampleDuration)) {\n meta.refSampleDuration = 66;\n }\n }\n }, {\n key: 'fixAudioRefSampleDuration',\n value: function fixAudioRefSampleDuration(meta) {\n if (!meta) {\n return;\n }\n meta.refSampleDuration = meta.timescale * 1024 / meta.sampleRate;\n }\n\n /**\n * 记录截止目前一共播放了多少帧\n */\n\n }, {\n key: 'recordSamplesCount',\n value: function recordSamplesCount() {\n var audioTrack = this.audioTrack,\n videoTrack = this.videoTrack;\n\n\n this.allAudioSamplesCount += audioTrack.samples.length;\n this.allVideoSamplesCount += videoTrack.samples.length;\n }\n\n /**\n * 去除不合法的帧(倒退、重复帧)\n */\n\n }, {\n key: 'removeInvalidSamples',\n value: function removeInvalidSamples() {\n var firstAudioSample = this.audioTrack.samples[0];\n var firstVideoSample = this.videoTrack.samples[0];\n // const { _firstVideoSample, _firstAudioSample } = this\n\n if (firstAudioSample) {\n this.audioTrack.samples = this.audioTrack.samples.filter(function (sample, index) {\n if (sample === firstAudioSample) {\n return true;\n }\n return sample.dts >= firstAudioSample.dts;\n });\n }\n\n if (firstVideoSample) {\n this.videoTrack.samples = this.videoTrack.samples.filter(function (sample, index) {\n if (sample === firstVideoSample) {\n return true;\n }\n return sample.dts >= firstVideoSample.dts;\n });\n }\n }\n }, {\n key: 'getStreamChangeStart',\n value: function getStreamChangeStart(sample) {\n if (sample.options && sample.options.start) {\n return sample.options.start - this.dtsBase;\n }\n return Infinity;\n }\n }, {\n key: 'tracks',\n get: function get() {\n return this._context.getInstance('TRACKS');\n }\n }, {\n key: 'audioTrack',\n get: function get() {\n if (this.tracks && this.tracks.audioTrack) {\n return this.tracks.audioTrack;\n }\n return {\n samples: [],\n meta: {}\n };\n }\n }, {\n key: 'videoTrack',\n get: function get() {\n if (this.tracks && this.tracks.videoTrack) {\n return this.tracks.videoTrack;\n }\n return {\n samples: [],\n meta: {}\n };\n }\n }, {\n key: 'dtsBase',\n get: function get() {\n var remuxer = this._context.getInstance('MP4_REMUXER');\n if (remuxer) {\n return remuxer._dtsBase;\n }\n return 0;\n }\n }, {\n key: 'audioDtsBase',\n get: function get() {\n var remuxer = this._context.getInstance('MP4_REMUXER');\n if (remuxer && remuxer._audioDtsBase !== null) {\n return remuxer._audioDtsBase;\n }\n\n return this.dtsBase;\n }\n }, {\n key: 'videoDtsBase',\n get: function get() {\n var remuxer = this._context.getInstance('MP4_REMUXER');\n if (remuxer && remuxer._videoDtsBase !== null) {\n return remuxer._videoDtsBase;\n }\n\n return this.dtsBase;\n }\n }], [{\n key: 'sortAudioSamples',\n value: function sortAudioSamples(samples) {\n if (samples.length === 1) {\n return samples;\n }\n\n return [].concat(_toConsumableArray(samples)).sort(function (a, b) {\n return a.dts - b.dts;\n });\n }\n }, {\n key: 'isRefSampleDurationValid',\n value: function isRefSampleDurationValid(refSampleDuration) {\n return refSampleDuration && refSampleDuration > 0 && !Number.isNaN(refSampleDuration);\n }\n /**\n * 寻找dts最小的sample\n * @param samples\n */\n\n }, {\n key: 'findFirstAudioSample',\n value: function findFirstAudioSample(samples) {\n if (!samples || samples.length === 0) {\n return null;\n }\n\n return Compatibility.sortAudioSamples(samples)[0];\n }\n }, {\n key: 'findFirstVideoSample',\n value: function findFirstVideoSample(samples) {\n if (!samples.length) {\n return null;\n }\n\n var sorted = [].concat(_toConsumableArray(samples)).sort(function (a, b) {\n return a.dts - b.dts;\n });\n\n for (var i = 0, len = sorted.length; i < len; i++) {\n if (sorted[i].isKeyframe) {\n return sorted[i];\n }\n }\n }\n }, {\n key: 'detectVideoLargeGap',\n value: function detectVideoLargeGap(nextDts, firstSampleDts) {\n if (nextDts === null) {\n return;\n }\n var delta = 10000;\n return nextDts - firstSampleDts >= delta || firstSampleDts - nextDts >= delta; // fix hls流出现大量流dts间距问题\n }\n }, {\n key: 'detectAudioLargeGap',\n value: function detectAudioLargeGap(nextDts, firstSampleDts) {\n if (nextDts === null) {\n return;\n }\n return nextDts - firstSampleDts >= 1000 || firstSampleDts - nextDts >= 1000; // fix hls流出现大量流dts间距问题\n }\n }, {\n key: 'doFixLargeGap',\n value: function doFixLargeGap(samples, gap) {\n // console.log('fix large gap...... ', gap)\n for (var i = 0, len = samples.length; i < len; i++) {\n var sample = samples[i];\n sample.dts += gap;\n if (sample.pts) {\n sample.pts += gap;\n }\n }\n }\n\n /**\n * 中途换流\n * |-------------------frag2---------------|\n * | frag1 | -----sample 0~n -------sample n+1 ~ m |\n *\n * 换流可能开始于新分片的第一帧 或者分片中间\n *\n */\n\n }, {\n key: 'detectChangeStream',\n value: function detectChangeStream(samples, isFirst) {\n var changed = false;\n var changedIdxes = [];\n for (var i = 0, len = samples.length; i < len; i++) {\n var sample = samples[i];\n if (sample.options && sample.options.meta && !(isFirst && i === 0)) {\n changed = true;\n changedIdxes.push(i);\n // break;\n }\n }\n\n return {\n changed: changed,\n changedIdxes: changedIdxes\n };\n }\n }]);\n\n return Compatibility;\n}();\n\nexport default Compatibility;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar UTF8 = function () {\n function UTF8() {\n _classCallCheck(this, UTF8);\n }\n\n _createClass(UTF8, null, [{\n key: 'decode',\n\n /**\n *\n * @param {Uint8Array} uint8array\n * @return {string}\n */\n value: function decode(uint8array) {\n var out = [];\n var input = uint8array;\n var i = 0;\n var length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (UTF8._checkContinuation(input, i, 1)) {\n var ucs4 = (input[i] & 0x1F) << 6 | input[i + 1] & 0x3F;\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (UTF8._checkContinuation(input, i, 2)) {\n var _ucs = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (_ucs >= 0x800 && (_ucs & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(_ucs & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (UTF8._checkContinuation(input, i, 3)) {\n var _ucs2 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 | (input[i + 2] & 0x3F) << 6 | input[i + 3] & 0x3F;\n if (_ucs2 > 0x10000 && _ucs2 < 0x110000) {\n _ucs2 -= 0x10000;\n out.push(String.fromCharCode(_ucs2 >>> 10 | 0xD800));\n out.push(String.fromCharCode(_ucs2 & 0x3FF | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n }\n }, {\n key: '_checkContinuation',\n value: function _checkContinuation(uint8array, start, checkLength) {\n var array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n }\n }]);\n\n return UTF8;\n}();\n\nexport default UTF8;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { Sniffer } from 'xgplayer-helper-utils';\nimport { UTF8 } from 'xgplayer-helper-codec';\n\nvar isLe = Sniffer.isLe;\n\nvar DATA_TYPES = {\n NUMBER: 0,\n BOOLEAN: 1,\n STRING: 2,\n OBJECT: 3,\n MIX_ARRAY: 8,\n OBJECT_END: 9,\n STRICT_ARRAY: 10,\n DATE: 11,\n LONE_STRING: 12\n\n /**\n * meta信息解析\n */\n};\nvar AMFParser = function () {\n function AMFParser() {\n _classCallCheck(this, AMFParser);\n\n this.offset = 0;\n this.readOffset = this.offset;\n }\n\n _createClass(AMFParser, [{\n key: 'resolve',\n value: function resolve(meta, size) {\n if (size < 3) {\n throw new Error('not enough data for metainfo');\n }\n var metaData = {};\n var name = this.parseValue(meta);\n var value = this.parseValue(meta, size - name.bodySize);\n metaData[name.data] = value.data;\n\n this.resetStatus();\n return metaData;\n }\n }, {\n key: 'resetStatus',\n value: function resetStatus() {\n this.offset = 0;\n this.readOffset = this.offset;\n }\n }, {\n key: 'parseString',\n value: function parseString(buffer) {\n var dv = new DataView(buffer, this.readOffset);\n var strLen = dv.getUint16(0, !isLe);\n var str = '';\n if (strLen > 0) {\n str = UTF8.decode(new Uint8Array(buffer, this.readOffset + 2, strLen));\n } else {\n str = '';\n }\n var size = strLen + 2;\n this.readOffset += size;\n return {\n data: str,\n bodySize: strLen + 2\n };\n }\n }, {\n key: 'parseDate',\n value: function parseDate(buffer, size) {\n var dv = new DataView(buffer, this.readOffset, size);\n var ts = dv.getFloat64(0, !isLe);\n var timeOffset = dv.getInt16(8, !isLe);\n ts += timeOffset * 60 * 1000;\n\n this.readOffset += 10;\n return {\n data: new Date(ts),\n bodySize: 10\n };\n }\n }, {\n key: 'parseObject',\n value: function parseObject(buffer, size) {\n var name = this.parseString(buffer, size);\n var value = this.parseValue(buffer, size - name.bodySize);\n return {\n data: {\n name: name.data,\n value: value.data\n },\n bodySize: name.bodySize + value.bodySize,\n isObjEnd: value.isObjEnd\n };\n }\n }, {\n key: 'parseLongString',\n value: function parseLongString(buffer) {\n var dv = new DataView(buffer, this.readOffset);\n var strLen = dv.getUint32(0, !isLe);\n var str = '';\n if (strLen > 0) {\n str = UTF8.decode(new Uint8Array(buffer, this.readOffset + 2, strLen));\n } else {\n str = '';\n }\n // const size = strLen + 4;\n this.readOffset += strLen + 4;\n return {\n data: str,\n bodySize: strLen + 4\n };\n }\n\n /**\n * 解析meta中的变量\n */\n\n }, {\n key: 'parseValue',\n value: function parseValue(data, size) {\n var buffer = new ArrayBuffer();\n if (data instanceof ArrayBuffer) {\n buffer = data;\n } else {\n buffer = data.buffer;\n }\n var NUMBER = DATA_TYPES.NUMBER,\n BOOLEAN = DATA_TYPES.BOOLEAN,\n STRING = DATA_TYPES.STRING,\n OBJECT = DATA_TYPES.OBJECT,\n MIX_ARRAY = DATA_TYPES.MIX_ARRAY,\n OBJECT_END = DATA_TYPES.OBJECT_END,\n STRICT_ARRAY = DATA_TYPES.STRICT_ARRAY,\n DATE = DATA_TYPES.DATE,\n LONE_STRING = DATA_TYPES.LONE_STRING;\n\n var dataView = new DataView(buffer, this.readOffset, size);\n var isObjEnd = false;\n var type = dataView.getUint8(0);\n var offset = 1;\n this.readOffset += 1;\n var value = null;\n\n switch (type) {\n case NUMBER:\n {\n value = dataView.getFloat64(1, !isLe);\n this.readOffset += 8;\n offset += 8;\n break;\n }\n case BOOLEAN:\n {\n var boolNum = dataView.getUint8(1);\n value = !!boolNum;\n this.readOffset += 1;\n offset += 1;\n break;\n }\n case STRING:\n {\n var str = this.parseString(buffer);\n value = str.data;\n offset += str.bodySize;\n break;\n }\n case OBJECT:\n {\n value = {};\n var objEndSize = 0;\n if (dataView.getUint32(size - 4, !isLe) & 0x00FFFFFF) {\n objEndSize = 3;\n }\n // this.readOffset += offset - 1;\n while (offset < size - 4) {\n var amfObj = this.parseObject(buffer, size - offset - objEndSize);\n if (amfObj.isObjectEnd) {\n break;\n }\n value[amfObj.data.name] = amfObj.data.value;\n offset += amfObj.bodySize;\n }\n if (offset <= size - 3) {\n var mark = dataView.getUint32(offset - 1, !isLe) & 0x00FFFFFF;\n if (mark === 9) {\n this.readOffset += 3;\n offset += 3;\n }\n }\n break;\n }\n case MIX_ARRAY:\n {\n value = {};\n offset += 4;\n this.readOffset += 4;\n var _objEndSize = 0;\n if ((dataView.getUint32(size - 4, !isLe) & 0x00FFFFFF) === 9) {\n _objEndSize = 3;\n }\n\n while (offset < size - 8) {\n var amfVar = this.parseObject(buffer, size - offset - _objEndSize);\n if (amfVar.isObjectEnd) {\n break;\n }\n value[amfVar.data.name] = amfVar.data.value;\n offset += amfVar.bodySize;\n }\n if (offset <= size - 3) {\n var marker = dataView.getUint32(offset - 1, !isLe) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n this.readOffset += 3;\n }\n }\n break;\n }\n\n case OBJECT_END:\n {\n value = null;\n isObjEnd = true;\n break;\n }\n\n case STRICT_ARRAY:\n {\n value = [];\n var arrLength = dataView.getUint32(1, !isLe);\n offset += 4;\n this.readOffset += 4;\n for (var i = 0; i < arrLength; i++) {\n var script = this.parseValue(buffer, size - offset);\n value.push(script.data);\n offset += script.bodySize;\n }\n break;\n }\n\n case DATE:\n {\n var date = this.parseDate(buffer, size - 1);\n value = date.data;\n offset += date.bodySize;\n break;\n }\n\n case LONE_STRING:\n {\n var longStr = this.parseLongString(buffer, size - 1);\n value = longStr.data;\n offset += longStr.bodySize;\n break;\n }\n\n default:\n {\n offset = size;\n }\n }\n\n return {\n data: value,\n bodySize: offset,\n isObjEnd: isObjEnd\n };\n }\n }]);\n\n return AMFParser;\n}();\n\nexport default AMFParser;","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport { VideoTrackMeta, AudioTrackMeta, XGDataView, FlvTag, VideoSample } from 'xgplayer-helper-models';\nimport { avc, hevc } from 'xgplayer-helper-codec';\nimport AMFParser from './amf-parser';\nimport EventEmitter from 'eventemitter3';\nvar SpsParser = avc.SpsParser,\n NalUnit = avc.NalUnit;\nvar SpsParserHEVC = hevc.SpsParserHEVC,\n NalUnitHEVC = hevc.NalUnitHEVC;\n\nvar FlvDemuxer = function (_EventEmitter) {\n _inherits(FlvDemuxer, _EventEmitter);\n\n function FlvDemuxer() {\n _classCallCheck(this, FlvDemuxer);\n\n /** @type {boolean} */\n var _this = _possibleConstructorReturn(this, (FlvDemuxer.__proto__ || Object.getPrototypeOf(FlvDemuxer)).call(this));\n\n _this.headerParsed = false;\n /** @type {number} */\n _this.trackNum = 0;\n /** @type {boolean} */\n _this.hasScript = false;\n /** @type {boolean} */\n _this._videoMetaChange = false;\n /** @type {boolean} */\n _this._audioMetaChange = false;\n /** @type {number} */\n _this.gopId = 0;\n /** @type {*} */\n _this.onMetaData = null;\n return _this;\n }\n\n /**\n *\n * @return {{FILE_HEADER_PARSED: string, AUDIO_META_PARSED: string, SCRIPT_TAG_PARSED: string, AUDIO_SAMPLE_PARSED: string, VIDEO_META_PARSED: string, VIDEO_SAMPLE_PARSED: string, VIDEO_SEI_PARSED: string}}\n * @constructor\n */\n\n\n _createClass(FlvDemuxer, [{\n key: 'demux',\n value: function demux(buffer) {\n if (!this.headerParsed) {\n if (buffer.length < 13) {\n return;\n }\n var header = buffer.shift(13);\n this.parseFlvHeader(header);\n this.demux(buffer); // recursive invoke\n } else {\n if (buffer.length < 11) {\n return;\n }\n var flvTag = void 0;\n\n var loopMax = 10000; // avoid Infinite loop\n do {\n flvTag = this._parseFlvTag(buffer);\n } while (flvTag && loopMax-- > 0);\n }\n }\n }, {\n key: 'parseFlvHeader',\n value: function parseFlvHeader(header) {\n if (!FlvDemuxer.isFlvFile(header)) {\n throw new Error('invalid flv file,' + header.join(','));\n } else {\n this.headerParsed = true;\n\n var hasAudio = header[4] >>> 2 === 1;\n var hasVideo = (header[4] & 1) === 1;\n this.emit(FlvDemuxer.EVENTS.FILE_HEADER_PARSED, {\n hasVideo: hasVideo,\n hasAudio: hasAudio\n });\n }\n }\n\n /**\n * Package the data as the following data structure\n * {\n * data: Uint8Array. the Stream data.\n * info: The first byte info of the Tag.\n * tagType: 8、9、18\n * timeStamp: the timestemp\n * }\n */\n\n }, {\n key: '_parseFlvTag',\n value: function _parseFlvTag(buffer) {\n var tagSize = buffer.toInt(1, 3);\n if (buffer.length < 11 + tagSize + 4) {\n // no enough data for tag parsing\n return null;\n }\n var flvTag = this._parseFlvTagHeader(buffer);\n if (flvTag) {\n this._processTagData(flvTag, buffer);\n if (!this._datasizeValidator(flvTag.datasize, buffer)) {\n throw new Error('TAG length error at ' + flvTag.datasize);\n }\n }\n return flvTag;\n }\n\n /**\n * Parse the 11 byte tag Header\n */\n\n }, {\n key: '_parseFlvTagHeader',\n value: function _parseFlvTagHeader(buffer) {\n var offset = 0;\n var flvTag = new FlvTag();\n\n var tagType = buffer.toInt(offset, 1);\n offset += 1;\n\n // 2 bit FMS reserved, 1 bit filtered, 5 bit tag type\n flvTag.filtered = (tagType & 32) >>> 5;\n flvTag.tagType = tagType & 31;\n\n // 3 Byte datasize\n flvTag.datasize = buffer.toInt(offset, 3);\n offset += 3;\n\n if (flvTag.tagType !== 8 && flvTag.tagType !== 9 && flvTag.tagType !== 11 && flvTag.tagType !== 18) {\n if (buffer && buffer.length > 0) {\n buffer.shift(1);\n }\n throw new Error('tagType ' + flvTag.tagType);\n }\n\n if (buffer.length < flvTag.datasize + 15) {\n return null;\n }\n\n // read the data.\n buffer.shift(4);\n\n // 3 Byte timestamp\n var timestamp = buffer.toInt(0, 3);\n buffer.shift(3);\n\n // 1 Byte timestampExt\n var timestampExt = buffer.shift(1)[0];\n if (timestampExt > 0) {\n timestamp += timestampExt * 0x1000000;\n }\n\n flvTag.dts = timestamp;\n\n // streamId\n buffer.shift(3);\n\n // 4 + 3 + 3 + 1 = 11 字节 TagHeader\n return flvTag;\n }\n }, {\n key: '_processTagData',\n value: function _processTagData(flvTag, buffer) {\n switch (flvTag.tagType) {\n case 18:\n this._parseScriptData(flvTag, buffer);\n break;\n case 8:\n this._parseAudioTag(flvTag, buffer);\n break;\n case 9:\n this._parseVideoData(flvTag, buffer);\n break;\n case 11:\n // for some CDN that did not process the currect RTMP messages\n buffer.shift(3);\n break;\n default:\n buffer.shift(1);\n }\n }\n\n /**\n * parse flv script data\n * @param flvTag\n * @private\n */\n\n }, {\n key: '_parseScriptData',\n value: function _parseScriptData(flvTag, buffer) {\n flvTag.data = buffer.shift(flvTag.datasize);\n var info = new AMFParser().resolve(flvTag.data, flvTag.data.length);\n\n this.onMetaData = info ? info.onMetaData : undefined;\n this.emit(FlvDemuxer.EVENTS.SCRIPT_TAG_PARSED, this.onMetaData);\n }\n\n // ISO中定义的AudioSpecificConfig\n // * audioObjectType 5bit\n // * samplingFrquecyIndex 4bit\n // * if(samplingFrquencyIndex === 0xf)\n // * samplingFrequency 24bit\n // * channelConfiguration 4bit |01111000|\n\n }, {\n key: '_aacSequenceHeaderParser',\n value: function _aacSequenceHeaderParser(data) {\n var ret = {};\n ret.hasSpecificConfig = true;\n ret.objectType = data[1] >>> 3;\n ret.originObjectType = ret.objectType;\n ret.sampleRateIndex = (data[1] & 7) << 1 | data[2] >>> 7;\n ret.audiosamplerate = this._switchAudioSampleRate(ret.sampleRateIndex);\n ret.channelCount = (data[2] & 120) >>> 3;\n ret.frameLength = (data[2] & 4) >>> 2;\n ret.dependsOnCoreCoder = (data[2] & 2) >>> 1;\n ret.extensionFlagIndex = data[2] & 1;\n\n var userAgent = window.navigator.userAgent.toLowerCase();\n var extensionSamplingIndex = void 0;\n\n var config = void 0;\n var samplingIndex = ret.sampleRateIndex;\n\n if (userAgent.indexOf('firefox') !== -1) {\n // 火狐下 HE-AACv2编码方式 采样率是22050时候也要使用 LC-AAC\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (ret.sampleRateIndex >= 8) {\n ret.objectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else {\n // use LC-AAC\n ret.objectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1 || userAgent.indexOf('safari') !== -1 || userAgent.indexOf('iphone') !== -1) {\n // android: always use LC-AAC\n ret.objectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n ret.objectType = 5;\n extensionSamplingIndex = ret.sampleRateIndex;\n config = new Array(4);\n\n if (ret.sampleRateIndex >= 6) {\n extensionSamplingIndex = ret.sampleRateIndex - 3;\n } else if (ret.channelCount === 1) {\n // Mono channel\n ret.objectType = 2;\n config = new Array(2);\n extensionSamplingIndex = ret.sampleRateIndex;\n }\n }\n ret.codec = 'mp4a.40.' + ret.objectType;\n config[0] = ret.objectType << 3;\n config[0] |= (ret.sampleRateIndex & 0x0F) >>> 1;\n config[1] = (ret.sampleRateIndex & 0x0F) << 7;\n config[1] |= (ret.channelCount & 0x0F) << 3;\n if (ret.objectType === 5) {\n config[1] |= (extensionSamplingIndex & 0x0F) >>> 1;\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= 2 << 2;\n config[3] = 0;\n }\n ret.config = config;\n return ret;\n }\n\n // TagType == 8时\n // * header.filter == 1 header.filter == 1\n // * | AudioTagHeader | EncryptionHeader? | FilterParams? | AUDIODATA |\n // *\n // * AudioTagHeader结构 (1或2字节):\n // * SoundFormat : bit1-4 表示音频格式。 0:行内pcm数据,平台字节序 3:行内pcm,小端序 10:aac格式\n // * SoundRate : bit5-6 采样率 0=5.5kHz 1=11kHz 2=22kHz 3=44kHz\n // * SoundSize : 采样大小 0=8bit 1采样 1=16bit 1采样\n // * SoundType : 声道类型 0=单声道 1=立体声\n // * AACPacketType : 1字节 如果soundFormat==10 及aac编码格式,则存在这个字节\n // * 0=aac 序列header , 1=aac元数据\n\n }, {\n key: '_parseAudioTag',\n value: function _parseAudioTag(tag, buffer) {\n var meta = new AudioTrackMeta();\n var info = buffer.shift(1)[0];\n\n tag.data = buffer.shift(tag.datasize - 1);\n\n var format = (info & 240) >>> 4;\n\n if (format !== 10) {\n throw new Error('invalid audio format: ' + format);\n }\n\n if (format === 10) {\n meta.sampleRate = this._switchAudioSamplingFrequency(info);\n meta.sampleRateIndex = (info & 12) >>> 2;\n meta.frameLenth = (info & 2) >>> 1;\n meta.channelCount = info & 1;\n meta.refSampleDuration = Math.floor(1024 / meta.audioSampleRate * meta.timescale);\n }\n\n var audioSampleRate = meta.audioSampleRate;\n var audioSampleRateIndex = meta.sampleRateIndex;\n var refSampleDuration = meta.refSampleDuration;\n\n // AACPacketType\n if (tag.data[0] === 0) {\n // AAC Sequence Header\n var aacHeader = this._aacSequenceHeaderParser(tag.data);\n audioSampleRate = aacHeader.audiosamplerate || meta.audioSampleRate;\n audioSampleRateIndex = aacHeader.sampleRateIndex || meta.sampleRateIndex;\n refSampleDuration = Math.floor(1024 / audioSampleRate * meta.timescale);\n\n meta.channelCount = aacHeader.channelCount;\n meta.sampleRate = audioSampleRate;\n meta.sampleRateIndex = audioSampleRateIndex;\n meta.refSampleDuration = refSampleDuration;\n meta.duration = this.onMetaData.duration * meta.timescale;\n meta.config = aacHeader.config;\n meta.objectType = aacHeader.objectType;\n meta.originObjectType = aacHeader.originObjectType;\n this.emit(FlvDemuxer.EVENTS.AUDIO_META_PARSED, meta);\n } else {\n tag.data = tag.data.slice(1, tag.data.length);\n this.emit(FlvDemuxer.EVENTS.AUDIO_SAMPLE_PARSED, tag);\n }\n }\n\n // parse hevc/avc video data\n // * TagType == 9时\n // * filter == 1 filter == 1\n // * | VideoTagHeader | EncryptionHeader? | FilterParams? | VideoDATA |\n // *\n // * VideoTagHeader结构(AVC格式 5字节):\n // * FrameType : bit 1-4 1=keyFrame 2=inter frame\n // * CodecId : bit 5-8 编码器信息 7=AVC\n // * AvcPacketType : 1字节 codecId==7时存在 0=avc序列header 1=avc nalU 2=avc end of sequence\n // * CompositionTime : 3字节 codecId==7时存在 取值 0 或者 具体值 单位ms\n\n }, {\n key: '_parseVideoData',\n value: function _parseVideoData(flvTag, buffer) {\n // header\n var header = buffer.shift(1)[0];\n var vSample = new VideoSample(flvTag);\n var frameType = (header & 0xf0) >>> 4;\n vSample.isKeyframe = frameType === 1;\n var codecID = header & 0x0f;\n\n // hevc和avc的header解析方式一样\n flvTag.avcPacketType = buffer.shift(1)[0];\n vSample.cts = buffer.toInt(0, 3);\n vSample.cts = vSample.cts << 8 >> 8;\n buffer.shift(3);\n\n // 12 for hevc, 7 for avc\n if (codecID === 7 || codecID === 12) {\n var _hevc = codecID === 12;\n var data = buffer.shift(flvTag.datasize - 5); // 减5字节header信息\n if (data[4] === 0 && data[5] === 0 && data[6] === 0 && data[7] === 1) {\n var avcclength = 0;\n for (var i = 0; i < 4; i++) {\n avcclength = avcclength * 256 + data[i];\n }\n avcclength -= 4;\n data = data.slice(4, data.length);\n data[3] = avcclength % 256;\n avcclength = (avcclength - data[3]) / 256;\n data[2] = avcclength % 256;\n avcclength = (avcclength - data[2]) / 256;\n data[1] = avcclength % 256;\n data[0] = (avcclength - data[1]) / 256;\n }\n\n vSample.data = data;\n\n var videoMeta = void 0;\n if (flvTag.avcPacketType === 0) {\n if (_hevc) {\n videoMeta = this._hevcSequenceHeaderParser(data);\n } else {\n videoMeta = this._avcSequenceHeaderParser(data);\n }\n videoMeta.codecID = codecID;\n this.emit(FlvDemuxer.EVENTS.VIDEO_META_PARSED, videoMeta);\n } else {\n var dv = new XGDataView(data.buffer);\n var nals = _hevc ? NalUnitHEVC.getHvccNals(dv) : NalUnit.getAvccNals(dv);\n var keyTypes = _hevc ? [19, 20, 21] : [5];\n for (var _i = 0; _i < nals.length; _i++) {\n var unit = nals[_i];\n _hevc ? NalUnitHEVC.analyseNal(unit) : NalUnit.analyseNal(unit);\n\n if (unit.sei) {\n this.emit(FlvDemuxer.EVENTS.VIDEO_SEI_PARSED, Object.assign(unit.sei, {\n dts: flvTag.dts\n }));\n }\n if (keyTypes.indexOf(unit.type) > -1) {\n vSample.firstInGop = true;\n this.gopId++;\n }\n }\n\n vSample.gopId = this.gopId;\n vSample.nals = nals;\n\n this.emit(FlvDemuxer.EVENTS.VIDEO_SAMPLE_PARSED, vSample);\n }\n } else {\n throw new Error('video codeid is ' + codecID);\n }\n }\n\n /**\n * parse avc metadata\n * configurationVerison = 1 uint(8)\n * avcProfileIndication uint(8)\n * profile_compatibility uint(8)\n * avcLevelIndication uint(8)\n * reserved `111111` bit(6)\n * lengthSizeMinusOne uint(2)\n * reserved `111` bit(3)\n * numOfSPS uint(5)\n * for(numOfSPS)\n * spsLength uint(16)\n * spsNALUnit spsLength个字节\n * numOfPPS uint(8)\n * for(numOfPPS)\n * ppsLength uint(16)\n * ppsNALUnit ppsLength个字节\n */\n\n }, {\n key: '_avcSequenceHeaderParser',\n value: function _avcSequenceHeaderParser(data) {\n var offset = 0;\n\n var meta = new VideoTrackMeta();\n\n meta.configurationVersion = data[0];\n meta.avcProfileIndication = data[1];\n meta.profileCompatibility = data[2];\n meta.avcLevelIndication = data[3] / 10;\n meta.nalUnitLength = (data[4] & 0x03) + 1;\n\n var numOfSps = data[5] & 0x1f;\n offset = 6;\n var config = {};\n\n // parse SPS\n for (var i = 0; i < numOfSps; i++) {\n var size = data[offset] * 255 + data[offset + 1];\n offset += 2;\n\n var sps = new Uint8Array(size);\n for (var j = 0; j < size; j++) {\n sps[j] = data[offset + j];\n }\n\n // codec string\n var codecString = 'avc1.';\n for (var _j = 1; _j < 4; _j++) {\n var h = sps[_j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n\n meta.codec = codecString;\n\n offset += size;\n meta.sps = sps;\n config = SpsParser.parseSPS(sps);\n }\n\n var numOfPps = data[offset];\n\n offset++;\n\n for (var _i2 = 0; _i2 < numOfPps; _i2++) {\n var _size = data[offset] * 255 + data[offset + 1];\n offset += 2;\n var pps = new Uint8Array(_size);\n for (var _j2 = 0; _j2 < _size; _j2++) {\n pps[_j2] = data[offset + _j2];\n }\n offset += _size;\n meta.pps = pps;\n }\n\n Object.assign(meta, SpsParser.toVideoMeta(config));\n\n meta.duration = this.onMetaData.duration * meta.timescale;\n meta.avcc = new Uint8Array(data.length);\n meta.avcc.set(data);\n meta.streamType = 0x1b;\n\n return meta;\n }\n\n /**\n * parse hevc metadata\n * configurationVerison = 1 uint(8)\n * generalProfileSpace uint(2)\n * generalTierFlag uint(1)\n * generalProfileIdc uint(5)\n * generalProfileCompatibilityFlags uint(32)\n * generalConstraintIndicatorFlags uint(48)\n * generalLevelIdc uint(8)\n * complete_representation bit(1)\n * reserved `111` bit(3)\n * segmentationIdc uint(12)\n * reserved `111111` bit(6)\n * parallelismType uint(2)\n * reserved `111111` bit(6)\n * chromaFormat uint(2)\n * reserved `11111` bit(5)\n * bitDepthLumaMinus8 uint(3)\n * reserved `11111` bit(5)\n * bitDepthChromaMinus8 uint(3)\n * avgFrameRate bit(16)\n * constantFrameRate bit(2)\n * numTemporalLayers bit(3)\n * temporalIdNested bit(1)\n * lengthSizeMinusOne uint(2)\n * numOfArrays uint(8)\n * for(numOfArrays)\n * arrayCompleteness bit(1)\n * reserved uint(1)\n * nalUnitType uint(16)\n * numNals uint(16)\n * for(numNals)\n * nalUintLength uint(16)\n * nalUint bit(8 * nalUintLength)\n */\n\n }, {\n key: '_hevcSequenceHeaderParser',\n value: function _hevcSequenceHeaderParser(data) {\n var meta = new VideoTrackMeta();\n\n var offset = 0;\n\n meta.configurationVersion = data[0];\n meta.hevcProfileSpace = (data[1] & 0xc0) >>> 6;\n meta.hevcTierFlag = (data[1] & 0x20) >>> 5;\n meta.hevcProfileIdc = data[1] & 0x1f;\n meta.hevcProfileCompatibilityFlags = [data[2], data[3], data[4], data[5]];\n meta.hevcConstraintIndicatorFlags = [data[6], data[7], data[8], data[9], data[10], data[11]];\n meta.hevcLevelIdc = data[12];\n meta.minSpatialSegmentationIdc = data[13] & 0x0f + data[14] << 4;\n meta.parallelismType = data[15] & 0x03;\n meta.chromaFormat = data[16] & 0x03;\n meta.bitDepthLumaMinus8 = data[17] & 0x07;\n meta.bitDepthChromaMinus8 = data[18] & 0x07;\n meta.avgFrameRate = data[19] * 256 + data[20];\n meta.constantFrameRate = (data[21] & 0xc0) >>> 6;\n meta.numTemporalLayers = (data[21] & 0x38) >>> 3;\n meta.temporalIdNested = (data[21] & 0x04) >>> 2;\n meta.lengthSizeMinusOne = data[21] & 0x03;\n var numOfArrays = data[22];\n\n offset = 23;\n var config = {};\n var nalUnitType = 0;\n var numNalus = 0;\n var nalUnitSize = 0;\n var hasVPS = false;\n var hasSPS = false;\n var hasPPS = false;\n var vps = void 0,\n sps = void 0,\n pps = void 0;\n for (var i = 0; i < numOfArrays; i++) {\n nalUnitType = data[offset] & 0x3f;\n numNalus = data[offset + 1] * 256 + data[offset + 2];\n offset += 3;\n for (var j = 0; j < numNalus; j++) {\n nalUnitSize = data[offset] * 256 + data[offset + 1];\n switch (nalUnitType) {\n case 32:\n if (!hasVPS) {\n hasVPS = true;\n vps = data.slice(offset + 2, offset + 2 + nalUnitSize);\n meta.vps = SpsParserHEVC._ebsp2rbsp(vps);\n meta.rawVps = vps;\n }\n break;\n case 33:\n if (!hasSPS) {\n hasSPS = true;\n sps = data.slice(offset + 2, offset + 2 + nalUnitSize);\n meta.sps = SpsParserHEVC._ebsp2rbsp(sps);\n meta.rawSps = sps;\n meta.codec = 'hev1.1.6.L93.B0';\n config = SpsParserHEVC.parseSPS(sps);\n }\n break;\n case 34:\n if (!hasPPS) {\n hasPPS = true;\n pps = data.slice(offset + 2, offset + 2 + nalUnitSize);\n meta.pps = SpsParserHEVC._ebsp2rbsp(pps);\n meta.rawPps = pps;\n }\n break;\n case 39:\n // PREFIX_SEI\n break;\n case 40:\n // SUFFIX_SEI\n break;\n default:\n break;\n }\n offset += 2 + nalUnitSize;\n }\n }\n\n Object.assign(meta, SpsParserHEVC.toVideoMeta(config));\n\n meta.streamType = 0x24;\n\n return meta;\n }\n\n /**\n * choose audio sample rate\n * @param samplingFrequencyIndex\n * @returns {number}\n * @private\n */\n\n }, {\n key: '_switchAudioSampleRate',\n value: function _switchAudioSampleRate(samplingFrequencyIndex) {\n var samplingFrequencyList = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];\n return samplingFrequencyList[samplingFrequencyIndex];\n }\n\n /**\n * choose audio sampling frequence\n * @param info\n * @returns {number}\n * @private\n */\n\n }, {\n key: '_switchAudioSamplingFrequency',\n value: function _switchAudioSamplingFrequency(info) {\n var samplingFrequencyIndex = (info & 12) >>> 2;\n var samplingFrequencyList = [5500, 11025, 22050, 44100, 48000];\n return samplingFrequencyList[samplingFrequencyIndex];\n }\n\n /**\n * choose audio channel count\n * @param info\n * @returns {number}\n * @private\n */\n\n }, {\n key: '_switchAudioChannel',\n value: function _switchAudioChannel(info) {\n var sampleTrackNumIndex = info & 1;\n var sampleTrackNumList = [1, 2];\n return sampleTrackNumList[sampleTrackNumIndex];\n }\n\n /**\n * check datasize is valid use 4 Byte after current tag\n * @param datasize\n * @returns {boolean}\n * @private\n */\n\n }, {\n key: '_datasizeValidator',\n value: function _datasizeValidator(datasize, buffer) {\n var datasizeConfirm = buffer.toInt(0, 4);\n buffer.shift(4);\n return datasizeConfirm === datasize + 11;\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n _get(FlvDemuxer.prototype.__proto__ || Object.getPrototypeOf(FlvDemuxer.prototype), 'removeAllListeners', this).call(this);\n }\n }], [{\n key: 'isFlvFile',\n\n\n /**\n * if the flv head is valid\n * @param data\n * @returns {boolean}\n */\n value: function isFlvFile(data) {\n return !(data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01);\n }\n\n /**\n * If the stream has audio or video.\n * @param {number} streamFlag - Data from the stream which is define whether the audio / video track is exist.\n */\n\n }, {\n key: 'getPlayType',\n value: function getPlayType(streamFlag) {\n var result = {\n hasVideo: false,\n hasAudio: false\n };\n\n if (streamFlag & 0x01 > 0) {\n result.hasVideo = true;\n }\n\n if (streamFlag & 0x04 > 0) {\n result.hasAudio = true;\n }\n\n return result;\n }\n }, {\n key: 'EVENTS',\n get: function get() {\n return {\n FILE_HEADER_PARSED: 'FILE_HEADER_PARSED',\n SCRIPT_TAG_PARSED: 'SCRIPT_TAG_PARSED',\n AUDIO_META_PARSED: 'AUDIO_META_PARSED',\n VIDEO_META_PARSED: 'VIDEO_META_PARSED',\n VIDEO_SAMPLE_PARSED: 'VIDEO_SAMPLE_PARSED',\n AUDIO_SAMPLE_PARSED: 'AUDIO_SAMPLE_PARSED',\n VIDEO_SEI_PARSED: 'VIDEO_SEI_PARSED'\n };\n }\n }]);\n\n return FlvDemuxer;\n}(EventEmitter);\n\nexport default FlvDemuxer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport Demuxer from './demuxer';\nimport { AudioTrackMeta, VideoTrackMeta, VideoTrack, AudioTrack } from 'xgplayer-helper-models';\nimport { EVENTS } from 'xgplayer-helper-utils';\n\nvar DEMUX_EVENTS = EVENTS.DEMUX_EVENTS;\nvar INTERNAL_EVENTS = Demuxer.EVENTS;\n\nvar FlvDemuxer = function () {\n function FlvDemuxer() {\n _classCallCheck(this, FlvDemuxer);\n\n this.TAG = 'FLV_DEMUXER';\n this._firstFragmentLoaded = false;\n this._trackNum = 0;\n this._hasScript = false;\n this._videoMetaChange = false;\n this._audioMetaChange = false;\n this._hasVideoSequence = false;\n this._hasAudioSequence = false;\n this.demuxer = new Demuxer();\n }\n\n _createClass(FlvDemuxer, [{\n key: 'init',\n value: function init() {\n this.on(DEMUX_EVENTS.DEMUX_START, this.demux.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.FILE_HEADER_PARSED, this.handleFileHeaderParsed.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.SCRIPT_TAG_PARSED, this.handleScriptTagParsed.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.AUDIO_META_PARSED, this.handleAudioMetaParsed.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.VIDEO_META_PARSED, this.handleVideoMetaParsed.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.VIDEO_SAMPLE_PARSED, this.handleVideoSampleParsed.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.AUDIO_SAMPLE_PARSED, this.handleAudioSampleParsed.bind(this));\n this.demuxer.on(INTERNAL_EVENTS.VIDEO_SEI_PARSED, this.handleSeiParsed.bind(this));\n }\n }, {\n key: 'handleAudioMetaParsed',\n value: function handleAudioMetaParsed(meta) {\n if (!this.tracks || !this.tracks.audioTrack) {\n return;\n }\n this._context.mediaInfo.hasAudio = true;\n this.tracks.audioTrack.meta = meta;\n if (!this._hasAudioSequence) {\n this.emit(DEMUX_EVENTS.METADATA_PARSED, 'audio');\n } else {\n this.emit(DEMUX_EVENTS.AUDIO_METADATA_CHANGE);\n }\n }\n }, {\n key: 'handleVideoMetaParsed',\n value: function handleVideoMetaParsed(meta) {\n if (!this.tracks || !this.tracks.videoTrack) {\n return;\n }\n this._context.mediaInfo.hasVideo = true;\n this.tracks.videoTrack.meta = meta;\n if (!this._hasVideoSequence) {\n this.emit(DEMUX_EVENTS.METADATA_PARSED, 'video');\n } else {\n this.emit(DEMUX_EVENTS.VIDEO_METADATA_CHANGE);\n }\n }\n }, {\n key: 'handleSeiParsed',\n value: function handleSeiParsed(seiObj) {\n this.emit(DEMUX_EVENTS.SEI_PARSED, seiObj);\n }\n }, {\n key: 'handleVideoSampleParsed',\n value: function handleVideoSampleParsed(sample) {\n if (!this.tracks || !this.tracks.videoTrack) {\n return;\n }\n if (sample.isKeyframe) {\n this.emit(DEMUX_EVENTS.ISKEYFRAME, sample.dts + sample.cts);\n }\n this.tracks.videoTrack.samples.push(sample);\n }\n }, {\n key: 'handleAudioSampleParsed',\n value: function handleAudioSampleParsed(sample) {\n if (!this.tracks || !this.tracks.videoTrack) {\n return;\n }\n this.tracks.audioTrack.samples.push(sample);\n }\n }, {\n key: 'handleScriptTagParsed',\n value: function handleScriptTagParsed(onMetaData) {\n var videoTrack = this.videoTrack,\n audioTrack = this.audioTrack;\n // fill mediaInfo\n\n this._context.mediaInfo.duration = onMetaData.duration;\n if (typeof onMetaData.hasAudio === 'boolean') {\n this._context.mediaInfo.hsaAudio = onMetaData.hasAudio;\n }\n if (typeof onMetaData.hasVideo === 'boolean') {\n this._context.mediaInfo.hasVideo = onMetaData.hasVideo;\n }\n this.emit(DEMUX_EVENTS.MEDIA_INFO);\n this._hasScript = true;\n\n // Edit default meta.\n if (audioTrack && !audioTrack.hasSpecificConfig) {\n var meta = audioTrack.meta;\n if (onMetaData.audiosamplerate) {\n meta.sampleRate = onMetaData.audiosamplerate;\n }\n\n if (onMetaData.audiochannels) {\n meta.channelCount = onMetaData.audiochannels;\n }\n\n switch (onMetaData.audiosamplerate) {\n case 44100:\n meta.sampleRateIndex = 4;\n break;\n case 22050:\n meta.sampleRateIndex = 7;\n break;\n case 11025:\n meta.sampleRateIndex = 10;\n break;\n }\n }\n if (videoTrack && !videoTrack.hasSpecificConfig) {\n var _meta = videoTrack.meta;\n if (typeof onMetaData.framerate === 'number') {\n var fpsNum = Math.floor(onMetaData.framerate * 1000);\n if (fpsNum > 0) {\n var fps = fpsNum / 1000;\n if (!_meta.frameRate) {\n _meta.frameRate = {};\n }\n _meta.frameRate.fixed = true;\n _meta.frameRate.fps = fps;\n _meta.frameRate.fps_num = fpsNum;\n _meta.frameRate.fps_den = 1000;\n }\n }\n }\n }\n }, {\n key: 'handleFileHeaderParsed',\n value: function handleFileHeaderParsed(_ref) {\n var hasVideo = _ref.hasVideo,\n hasAudio = _ref.hasAudio;\n\n this._context.mediaInfo.hasVideo = hasVideo;\n this._context.mediaInfo.hasAudio = hasAudio;\n\n this.initVideoTrack();\n this.initAudioTrack();\n }\n }, {\n key: 'demux',\n value: function demux() {\n if (this.loaderBuffer) {\n try {\n this.demuxer.demux(this.loaderBuffer);\n } catch (e) {\n // this.emit(DEMUX_EVENTS.DEMUX_ERROR, this.TAG, e)\n }\n this.emit(DEMUX_EVENTS.DEMUX_COMPLETE);\n }\n }\n /**\n * If the stream has audio or video.\n * @param {number} streamFlag - Data from the stream which is define whether the audio / video track is exist.\n */\n\n }, {\n key: 'initVideoTrack',\n\n\n /**\n * init default video track configs\n */\n value: function initVideoTrack() {\n this._trackNum++;\n var videoTrack = new VideoTrack();\n videoTrack.meta = new VideoTrackMeta();\n videoTrack.id = videoTrack.meta.id = this._trackNum;\n\n this.tracks.videoTrack = videoTrack;\n }\n\n /**\n * init default audio track configs\n */\n\n }, {\n key: 'initAudioTrack',\n value: function initAudioTrack() {\n this._trackNum++;\n var audioTrack = new AudioTrack();\n audioTrack.meta = new AudioTrackMeta();\n audioTrack.id = audioTrack.meta.id = this._trackNum;\n\n this.tracks.audioTrack = audioTrack;\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n if (this.demuxer) {\n this.demuxer.destroy();\n }\n }\n }, {\n key: 'loaderBuffer',\n get: function get() {\n var buffer = this._context.getInstance('LOADER_BUFFER');\n if (buffer) {\n return buffer;\n } else {\n this.emit(DEMUX_EVENTS.DEMUX_ERROR, this.TAG, new Error('找不到 loaderBuffer 实例'));\n }\n }\n }, {\n key: 'tracks',\n get: function get() {\n return this._context.getInstance('TRACKS');\n }\n }, {\n key: 'logger',\n get: function get() {\n return this._context.getInstance('LOGGER');\n }\n }], [{\n key: 'getPlayType',\n value: function getPlayType(streamFlag) {\n var result = {\n hasVideo: false,\n hasAudio: false\n };\n\n if (streamFlag & 0x01 > 0) {\n result.hasVideo = true;\n }\n\n if (streamFlag & 0x04 > 0) {\n result.hasAudio = true;\n }\n\n return result;\n }\n }]);\n\n return FlvDemuxer;\n}();\n\nexport default FlvDemuxer;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (ResultConstructor) {\n var totalLength = 0;\n\n for (var _len = arguments.length, arrays = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n arrays[_key - 1] = arguments[_key];\n }\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = arrays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var arr = _step.value;\n\n totalLength += arr.length;\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n var result = new ResultConstructor(totalLength);\n var offset = 0;\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = arrays[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var _arr = _step2.value;\n\n result.set(_arr, offset);\n offset += _arr.length;\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return result;\n};","'use strict';\n\nvar _concat = require('./concat');\n\nvar _concat2 = _interopRequireDefault(_concat);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = _concat2.default;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport Concat from 'concat-typed-array';\n\nvar Buffer = function () {\n function Buffer(buffer) {\n _classCallCheck(this, Buffer);\n\n this.buffer = buffer || new Uint8Array(0);\n }\n\n _createClass(Buffer, [{\n key: 'write',\n value: function write() {\n var _this = this;\n\n for (var _len = arguments.length, buffer = Array(_len), _key = 0; _key < _len; _key++) {\n buffer[_key] = arguments[_key];\n }\n\n buffer.forEach(function (item) {\n _this.buffer = Concat(Uint8Array, _this.buffer, item);\n });\n }\n }], [{\n key: 'writeUint32',\n value: function writeUint32(value) {\n return new Uint8Array([value >> 24, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]);\n }\n }, {\n key: 'readAsInt',\n value: function readAsInt(arr) {\n var temp = '';\n\n function padStart4Hex(hexNum) {\n var hexStr = hexNum.toString(16);\n return hexStr.padStart(2, '0');\n }\n\n arr.forEach(function (num) {\n temp += padStart4Hex(num);\n });\n return parseInt(temp, 16);\n }\n }]);\n\n return Buffer;\n}();\n\nexport default Buffer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport Buffer from './buffer';\n\n// const UINT32_MAX = Math.pow(2, 32) - 1;\n\nvar Fmp4 = function () {\n function Fmp4() {\n _classCallCheck(this, Fmp4);\n }\n\n _createClass(Fmp4, null, [{\n key: 'size',\n value: function size(value) {\n return Buffer.writeUint32(value);\n }\n }, {\n key: 'initBox',\n value: function initBox(size, name) {\n var buffer = new Buffer();\n\n for (var _len = arguments.length, content = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n content[_key - 2] = arguments[_key];\n }\n\n buffer.write.apply(buffer, [Fmp4.size(size), Fmp4.type(name)].concat(content));\n return buffer.buffer;\n }\n }, {\n key: 'extension',\n value: function extension(version, flag) {\n return new Uint8Array([version, flag >> 16 & 0xff, flag >> 8 & 0xff, flag & 0xff]);\n }\n }, {\n key: 'ftyp',\n value: function ftyp() {\n return Fmp4.initBox(24, 'ftyp', new Uint8Array([0x69, 0x73, 0x6F, 0x6D, // isom,\n 0x0, 0x0, 0x00, 0x01, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]));\n }\n }, {\n key: 'ftypHEVC',\n value: function ftypHEVC() {\n return Fmp4.initBox(24, 'ftyp', new Uint8Array([0x69, 0x73, 0x6F, 0x6D, // isom,\n 0x0, 0x0, 0x00, 0x01, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x64, 0x61, 0x73, 0x68 // hev1\n ]));\n }\n }, {\n key: 'moov',\n value: function moov(_ref) {\n var type = _ref.type,\n meta = _ref.meta;\n\n var size = 8;\n var mvhd = Fmp4.mvhd(meta.duration, meta.timescale);\n var trak = void 0;\n\n if (type === 'video') {\n trak = Fmp4.videoTrak(meta);\n } else {\n trak = Fmp4.audioTrak(meta);\n }\n\n var mvex = Fmp4.mvex(meta.duration, meta.timescale || 1000, meta.id);\n [mvhd, trak, mvex].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'moov', mvhd, trak, mvex);\n }\n }, {\n key: 'mvhd',\n value: function mvhd(duration) {\n var timescale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n\n // duration *= timescale;\n var bytes = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags 1位的box版本+3位flags box版本,0或1,一般为0。(以下字节数均按version=0)\n 0x00, 0x00, 0x00, 0x00, // creation_time 创建时间 (相对于UTC时间1904-01-01零点的秒数)\n 0x00, 0x00, 0x00, 0x00, // modification_time 修改时间\n\n /**\n * timescale: 4 bytes文件媒体在1秒时间内的刻度值,可以理解为1秒长度\n */\n timescale >>> 24 & 0xFF, timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF,\n\n /**\n * duration: 4 bytes该track的时间长度,用duration和time scale值可以计算track时长,比如audio track的time scale = 8000,\n * duration = 560128,时长为70.016,video track的time scale = 600, duration = 42000,时长为70\n */\n duration >>> 24 & 0xFF, duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0 推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放\n /**\n * PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n * 与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量\n */\n 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes保留位\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 视频变换矩阵 线性代数\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre-defined 保留位\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID 下一个track使用的id号\n ]);\n return Fmp4.initBox(8 + bytes.length, 'mvhd', new Uint8Array(bytes));\n }\n }, {\n key: 'videoTrak',\n value: function videoTrak(data) {\n var size = 8;\n\n var tkhd = Fmp4.tkhd({\n id: 1,\n duration: data.duration,\n timescale: data.timescale || 1000,\n width: data.presentWidth,\n height: data.presentHeight,\n type: 'video'\n });\n var mdia = Fmp4.mdia({\n type: 'video',\n timescale: data.timescale || 1000,\n duration: data.duration,\n avcc: data.avcc,\n parRatio: data.parRatio,\n width: data.presentWidth,\n height: data.presentHeight,\n streamType: data.streamType\n });\n [tkhd, mdia].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'trak', tkhd, mdia);\n }\n }, {\n key: 'audioTrak',\n value: function audioTrak(data) {\n var size = 8;\n var tkhd = Fmp4.tkhd({\n id: 2,\n duration: data.duration,\n timescale: data.timescale || 1000,\n width: 0,\n height: 0,\n type: 'audio'\n });\n var mdia = Fmp4.mdia({\n type: 'audio',\n timescale: data.timescale || 1000,\n duration: data.duration,\n channelCount: data.channelCount,\n samplerate: data.sampleRate,\n config: data.config\n });\n [tkhd, mdia].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'trak', tkhd, mdia);\n }\n }, {\n key: 'tkhd',\n value: function tkhd(data) {\n var id = data.id;\n var duration = data.duration;\n var width = data.width;\n var height = data.height;\n var content = new Uint8Array([0x00, 0x00, 0x00, 0x07, // version(0) + flags 1位版本 box版本,0或1,一般为0。(以下字节数均按version=0)按位或操作结果值,预定义如下:\n // 0x000001 track_enabled,否则该track不被播放;\n // 0x000002 track_in_movie,表示该track在播放中被引用;\n // 0x000004 track_in_preview,表示该track在预览时被引用。\n // 一般该值为7,1+2+4 如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hint track,该值为0\n // hint track 这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。\n 0x00, 0x00, 0x00, 0x00, // creation_time创建时间(相对于UTC时间1904-01-01零点的秒数)\n 0x00, 0x00, 0x00, 0x00, // modification time 修改时间\n id >>> 24 & 0xFF, // track_ID: 4 bytes id号,不能重复且不能为0\n id >>> 16 & 0xFF, id >>> 8 & 0xFF, id & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes 保留位\n duration >>> 24 & 0xFF, // duration: 4 bytes track的时间长度\n duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes 保留位\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes) 视频层,默认为0,值小的在上层.track分组信息,默认为0表示该track未与其他track有群组关系\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes) [8.8] 格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0 +保留位\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // 视频变换矩阵\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n width >>> 8 & 0xFF, // //宽度\n width & 0xFF, 0x00, 0x00, height >>> 8 & 0xFF, // 高度\n height & 0xFF, 0x00, 0x00]);\n return Fmp4.initBox(8 + content.byteLength, 'tkhd', content);\n }\n }, {\n key: 'edts',\n value: function edts(data) {\n var buffer = new Buffer();\n var duration = data.duration;\n var mediaTime = data.mediaTime;\n buffer.write(Fmp4.size(36), Fmp4.type('edts'));\n // elst\n buffer.write(Fmp4.size(28), Fmp4.type('elst'));\n buffer.write(new Uint8Array([0x00, 0x00, 0x00, 0x01, // entry count\n duration >> 24 & 0xff, duration >> 16 & 0xff, duration >> 8 & 0xff, duration & 0xff, mediaTime >> 24 & 0xff, mediaTime >> 16 & 0xff, mediaTime >> 8 & 0xff, mediaTime & 0xff, 0x00, 0x00, 0x00, 0x01 // media rate\n ]));\n return buffer.buffer;\n }\n }, {\n key: 'mdia',\n value: function mdia(data) {\n var size = 8;\n var mdhd = Fmp4.mdhd(data.timescale, data.duration);\n var hdlr = Fmp4.hdlr(data.type);\n var minf = Fmp4.minf(data);\n [mdhd, hdlr, minf].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'mdia', mdhd, hdlr, minf);\n }\n }, {\n key: 'mdhd',\n value: function mdhd() {\n var timescale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1000;\n var duration = arguments[1];\n\n var content = new Uint8Array([0x00, 0x00, 0x00, 0x00, // creation_time 创建时间\n 0x00, 0x00, 0x00, 0x00, // modification_time修改时间\n timescale >>> 24 & 0xFF, // timescale: 4 bytes 文件媒体在1秒时间内的刻度值,可以理解为1秒长度\n timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes track的时间长度\n duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x55, 0xC4, // language: und (undetermined) 媒体语言码。最高位为0,后面15位为3个字符(见ISO 639-2/T标准中定义)\n 0x00, 0x00 // pre_defined = 0\n ]);\n return Fmp4.initBox(12 + content.byteLength, 'mdhd', Fmp4.extension(0, 0), content);\n }\n }, {\n key: 'hdlr',\n value: function hdlr(type) {\n var value = [0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ];\n if (type === 'audio') {\n value.splice.apply(value, [8, 4].concat([0x73, 0x6f, 0x75, 0x6e]));\n value.splice.apply(value, [24, 13].concat([0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00]));\n }\n return Fmp4.initBox(8 + value.length, 'hdlr', new Uint8Array(value));\n }\n }, {\n key: 'minf',\n value: function minf(data) {\n var size = 8;\n var vmhd = data.type === 'video' ? Fmp4.vmhd() : Fmp4.smhd();\n var dinf = Fmp4.dinf();\n var stbl = Fmp4.stbl(data);\n [vmhd, dinf, stbl].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'minf', vmhd, dinf, stbl);\n }\n }, {\n key: 'vmhd',\n value: function vmhd() {\n return Fmp4.initBox(20, 'vmhd', new Uint8Array([0x00, // version\n 0x00, 0x00, 0x01, // flags\n 0x00, 0x00, // graphicsmode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // opcolor\n ]));\n }\n }, {\n key: 'smhd',\n value: function smhd() {\n return Fmp4.initBox(16, 'smhd', new Uint8Array([0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, // balance\n 0x00, 0x00 // reserved\n ]));\n }\n }, {\n key: 'dinf',\n value: function dinf() {\n var buffer = new Buffer();\n var dref = [0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0c, // entry_size\n 0x75, 0x72, 0x6c, 0x20, // 'url' type\n 0x00, // version 0\n 0x00, 0x00, 0x01 // entry_flags\n ];\n buffer.write(Fmp4.size(36), Fmp4.type('dinf'), Fmp4.size(28), Fmp4.type('dref'), new Uint8Array(dref));\n return buffer.buffer;\n }\n }, {\n key: 'stbl',\n value: function stbl(data) {\n var size = 8;\n var stsd = Fmp4.stsd(data);\n var stts = Fmp4.stts();\n var stsc = Fmp4.stsc();\n var stsz = Fmp4.stsz();\n var stco = Fmp4.stco();\n [stsd, stts, stsc, stsz, stco].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'stbl', stsd, stts, stsc, stsz, stco);\n }\n }, {\n key: 'stsd',\n value: function stsd(data) {\n var content = void 0;\n if (data.type === 'audio') {\n // if (!data.isAAC && data.codec === 'mp4') {\n // content = FMP4.mp3(data);\n // } else {\n //\n // }\n\n // 支持mp4a\n content = Fmp4.mp4a(data);\n } else {\n if (data.streamType === 0x24) {\n content = Fmp4.hvc1(data);\n } else {\n content = Fmp4.avc1(data);\n }\n }\n return Fmp4.initBox(16 + content.byteLength, 'stsd', Fmp4.extension(0, 0), new Uint8Array([0x00, 0x00, 0x00, 0x01]), content);\n }\n }, {\n key: 'mp4a',\n value: function mp4a(data) {\n var content = new Uint8Array([0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, data.channelCount, // channelcount\n 0x00, 0x10, // sampleSize:16bits\n 0x00, 0x00, 0x00, 0x00, // reserved2\n data.samplerate >> 8 & 0xff, data.samplerate & 0xff, //\n 0x00, 0x00]);\n var esds = Fmp4.esds(data.config);\n return Fmp4.initBox(8 + content.byteLength + esds.byteLength, 'mp4a', content, esds);\n }\n }, {\n key: 'esds',\n value: function esds() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [43, 146, 8, 0];\n\n var configlen = config.length;\n var buffer = new Buffer();\n var content = new Uint8Array([0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n\n 0x03, // descriptor_type\n 0x17 + configlen, // length\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0f + configlen, // length\n 0x40, // codec : mpeg4_audio\n 0x15, // stream_type\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([configlen]).concat(config).concat([0x06, 0x01, 0x02]));\n buffer.write(Fmp4.size(8 + content.byteLength), Fmp4.type('esds'), content);\n return buffer.buffer;\n }\n }, {\n key: 'avc1',\n value: function avc1(data) {\n var buffer = new Buffer();\n var size = 40; // 8(avc1)+8(avcc)+8(btrt)+16(pasp)\n // let sps = data.sps\n // let pps = data.pps\n var width = data.width;\n var height = data.height;\n var hSpacing = data.parRatio.width;\n var vSpacing = data.parRatio.height;\n // let avccBuffer = new Buffer()\n // avccBuffer.write(new Uint8Array([\n // 0x01, // version\n // sps[1], // profile\n // sps[2], // profile compatible\n // sps[3], // level\n // 0xfc | 3,\n // 0xE0 | 1 // 目前只处理一个sps\n // ].concat([sps.length >>> 8 & 0xff, sps.length & 0xff])))\n // avccBuffer.write(sps, new Uint8Array([1, pps.length >>> 8 & 0xff, pps.length & 0xff]), pps)\n\n var avcc = data.avcc;\n var avc1 = new Uint8Array([0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n width >> 8 & 0xff, width & 0xff, // width\n height >> 8 & 0xff, height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x12, 0x64, 0x61, 0x69, 0x6C, // dailymotion/hls.js\n 0x79, 0x6D, 0x6F, 0x74, 0x69, 0x6F, 0x6E, 0x2F, 0x68, 0x6C, 0x73, 0x2E, 0x6A, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0x11, 0x11]); // pre_defined = -1\n var btrt = new Uint8Array([0x00, 0x1c, 0x9c, 0x80, // bufferSizeDB\n 0x00, 0x2d, 0xc6, 0xc0, // maxBitrate\n 0x00, 0x2d, 0xc6, 0xc0 // avgBitrate\n ]);\n var pasp = new Uint8Array([hSpacing >> 24, // hSpacing\n hSpacing >> 16 & 0xff, hSpacing >> 8 & 0xff, hSpacing & 0xff, vSpacing >> 24, // vSpacing\n vSpacing >> 16 & 0xff, vSpacing >> 8 & 0xff, vSpacing & 0xff]);\n\n buffer.write(Fmp4.size(size + avc1.byteLength + avcc.byteLength + btrt.byteLength), Fmp4.type('avc1'), avc1, Fmp4.size(8 + avcc.byteLength), Fmp4.type('avcC'), avcc, Fmp4.size(20), Fmp4.type('btrt'), btrt, Fmp4.size(16), Fmp4.type('pasp'), pasp);\n return buffer.buffer;\n }\n }, {\n key: 'hvc1',\n value: function hvc1(track) {\n var buffer = new Buffer();\n var content = new Uint8Array([0x00, 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // data_reference_index\n 0x00, 0x00, // pre_defined\n 0x00, 0x00, // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pre_defined\n track.width >> 8 & 0xFF, track.width & 0xff, // width\n track.height >> 8 & 0xFF, track.height & 0xff, // height\n 0x00, 0x48, 0x00, 0x00, // horizresolution\n 0x00, 0x48, 0x00, 0x00, // vertresolution\n 0x00, 0x00, 0x00, 0x00, // reserved\n 0x00, 0x01, // frame_count\n 0x00, 0x00, 0x00, 0x00, 0x00, // dailymotion/hls.js\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // compressorname\n 0x00, 0x18, // depth = 24\n 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x7A, 0x68, 0x76, 0x63, 0x43, 0x01, // configurationVersion\n 0x01, // profile_space + tier_flag + profile_idc\n 0x60, 0x00, 0x00, 0x00, // general_profile_compatibility\n 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, // constraint_indicator_flags\n 0x5D, // level_idc=90\n 0xF0, 0x00, 0xFC, 0xFD, // profile_compatibility_indications\n 0xF8, // ‘11111’b + bitDepthLumaMinus8\n 0xF8, // ‘11111’b + bitDepthChromaMinus8\n 0x00, 0x00, // avgFrameRate\n 0x0F, // constantFrameRate + numTemporalLayers + ‘1’b + lengthSizeMinusOne\n 0x03, // numOfArrays\n\n // vps\n 0xA0, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x18, // nalUnitLength\n 0x40, 0x01, 0x0C, 0x01, 0xFF, 0xFF, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0x99, 0x98, 0x09,\n\n // sps\n 0xA1, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x2D, // nalUnitLength\n 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x5D, 0xA0, 0x02, 0x80, 0x80, 0x2D, 0x16, 0x59, 0x99, 0xA4, 0x93, 0x2B, 0x9A, 0x80, 0x80, 0x80, 0x82, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x32, 0x10,\n\n // pps\n 0xA2, 0x00, 0x01, // array_completeness + ‘0’b + NAL_unit_type + numNalus\n 0x00, 0x07, // nalUnitLength\n 0x44, 0x01, 0xC1, 0x72, 0xB4, 0x62, 0x40]);\n buffer.write(Fmp4.size(8 + content.byteLength + 10), Fmp4.type('hvc1'), content, Fmp4.size(10), Fmp4.type('fiel'), new Uint8Array([0x01, 0x00]));\n return buffer.buffer;\n }\n }, {\n key: 'stts',\n value: function stts() {\n var content = new Uint8Array([0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n return Fmp4.initBox(16, 'stts', content);\n }\n }, {\n key: 'stsc',\n value: function stsc() {\n var content = new Uint8Array([0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n return Fmp4.initBox(16, 'stsc', content);\n }\n }, {\n key: 'stco',\n value: function stco() {\n var content = new Uint8Array([0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n return Fmp4.initBox(16, 'stco', content);\n }\n }, {\n key: 'stsz',\n value: function stsz() {\n var content = new Uint8Array([0x00, // version\n 0x00, 0x00, 0x00, // flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n return Fmp4.initBox(20, 'stsz', content);\n }\n }, {\n key: 'mvex',\n value: function mvex(duration) {\n var timescale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var trackID = arguments[2];\n\n var buffer = new Buffer();\n var mehd = Buffer.writeUint32(duration);\n buffer.write(Fmp4.size(56), Fmp4.type('mvex'), Fmp4.size(16), Fmp4.type('mehd'), Fmp4.extension(0, 0), mehd, Fmp4.trex(trackID));\n return buffer.buffer;\n }\n }, {\n key: 'trex',\n value: function trex(id) {\n var content = new Uint8Array([0x00, // version 0\n 0x00, 0x00, 0x00, // flags\n id >> 24, id >> 16 & 0xff, id >> 8 & 0xff, id & 0xff, // track_ID\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return Fmp4.initBox(8 + content.byteLength, 'trex', content);\n }\n }, {\n key: 'moof',\n value: function moof(data) {\n var size = 8;\n var mfhd = Fmp4.mfhd();\n var traf = Fmp4.traf(data);\n [mfhd, traf].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'moof', mfhd, traf);\n }\n }, {\n key: 'mfhd',\n value: function mfhd() {\n var content = Buffer.writeUint32(Fmp4.sequence);\n Fmp4.sequence += 1;\n return Fmp4.initBox(16, 'mfhd', Fmp4.extension(0, 0), content);\n }\n }, {\n key: 'traf',\n value: function traf(data) {\n var size = 8;\n var tfhd = Fmp4.tfhd(data.id);\n var tfdt = Fmp4.tfdt(data.time);\n var sdtp = Fmp4.sdtp(data);\n var trun = Fmp4.trun(data, sdtp.byteLength);\n\n [tfhd, tfdt, trun, sdtp].forEach(function (item) {\n size += item.byteLength;\n });\n return Fmp4.initBox(size, 'traf', tfhd, tfdt, trun, sdtp);\n }\n }, {\n key: 'tfhd',\n value: function tfhd(id) {\n var content = Buffer.writeUint32(id);\n return Fmp4.initBox(16, 'tfhd', Fmp4.extension(0, 0), content);\n }\n }, {\n key: 'tfdt',\n value: function tfdt(time) {\n // let upper = Math.floor(time / (UINT32_MAX + 1)),\n // lower = Math.floor(time % (UINT32_MAX + 1));\n return Fmp4.initBox(16, 'tfdt', Fmp4.extension(0, 0), Buffer.writeUint32(time));\n }\n }, {\n key: 'trun',\n value: function trun(data, sdtpLength) {\n // let id = data.id;\n // let ceil = id === 1 ? 16 : 12;\n var buffer = new Buffer();\n var sampleCount = Buffer.writeUint32(data.samples.length);\n // mdat-header 8\n // moof-header 8\n // mfhd 16\n // traf-header 8\n // thhd 16\n // tfdt 20\n // trun-header 12\n // sampleCount 4\n // data-offset 4\n // samples.length\n var offset = Buffer.writeUint32(8 + 8 + 16 + 8 + 16 + 16 + 12 + 4 + 4 + 16 * data.samples.length + sdtpLength);\n buffer.write(Fmp4.size(20 + 16 * data.samples.length), Fmp4.type('trun'), new Uint8Array([0x00, 0x00, 0x0F, 0x01]), sampleCount, offset);\n\n // let size = buffer.buffer.byteLength\n // let writeOffset = 0\n // data.samples.forEach(() => {\n // size += 16\n // })\n //\n // let trunBox = new Uint8Array(size)\n\n // trunBox.set(buffer.buffer, 0)\n\n data.samples.forEach(function (item) {\n var flags = item.flags;\n // console.log(item.type, item.dts, item.duration)\n\n buffer.write(new Uint8Array([item.duration >>> 24 & 0xFF, // sample_duration\n item.duration >>> 16 & 0xFF, item.duration >>> 8 & 0xFF, item.duration & 0xFF, item.size >>> 24 & 0xFF, // sample_size\n item.size >>> 16 & 0xFF, item.size >>> 8 & 0xFF, item.size & 0xFF, flags.isLeading << 2 | flags.dependsOn, // sample_flags\n flags.isDependedOn << 6 | flags.hasRedundancy << 4 | flags.isNonSync, 0x00, 0x00, // sample_degradation_priority\n item.cts >>> 24 & 0xFF, // sample_composition_time_offset\n item.cts >>> 16 & 0xFF, item.cts >>> 8 & 0xFF, item.cts & 0xFF]));\n // writeOffset += 16\n // buffer.write(Buffer.writeUint32(0));\n });\n return buffer.buffer;\n }\n }, {\n key: 'sdtp',\n value: function sdtp(data) {\n var buffer = new Buffer();\n buffer.write(Fmp4.size(12 + data.samples.length), Fmp4.type('sdtp'), Fmp4.extension(0, 0));\n data.samples.forEach(function (item) {\n var flags = item.flags;\n var num = flags.isLeading << 6 | // is_leading: 2 (bit)\n flags.dependsOn << 4 | // sample_depends_on\n flags.isDependedOn << 2 | // sample_is_depended_on\n flags.hasRedundancy; // sample_has_redundancy\n\n buffer.write(new Uint8Array([num]));\n });\n return buffer.buffer;\n }\n }, {\n key: 'mdat',\n value: function mdat(data) {\n var buffer = new Buffer();\n var size = 8;\n data.samples.forEach(function (item) {\n size += item.size;\n });\n buffer.write(Fmp4.size(size), Fmp4.type('mdat'));\n var mdatBox = new Uint8Array(size);\n var offset = 0;\n mdatBox.set(buffer.buffer, offset);\n offset += 8;\n data.samples.forEach(function (item) {\n item.buffer.forEach(function (unit) {\n mdatBox.set(unit, offset);\n offset += unit.byteLength;\n // buffer.write(unit.data);\n });\n });\n return mdatBox;\n }\n }]);\n\n return Fmp4;\n}();\n\nFmp4.type = function (name) {\n return new Uint8Array([name.charCodeAt(0), name.charCodeAt(1), name.charCodeAt(2), name.charCodeAt(3)]);\n};\nFmp4.sequence = 1;\n\nexport default Fmp4;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport { logger } from 'xgplayer-helper-utils';\nimport EventEmitter from 'eventemitter3';\nimport Buffer from './buffer';\nimport Fmp4 from './fmp4';\n\n/**\n * @typedef { import('xgplayer-helper-models').VideoTrack } VideoTrack\n */\n/**\n * @typedef { import('xgplayer-helper-models').AudioTrack } AudioTrack\n */\n\nvar Mp4Remuxer = function (_EventEmitter) {\n _inherits(Mp4Remuxer, _EventEmitter);\n\n function Mp4Remuxer(_ref) {\n var videoMeta = _ref.videoMeta,\n audioMeta = _ref.audioMeta,\n curTime = _ref.curTime;\n\n _classCallCheck(this, Mp4Remuxer);\n\n var _this = _possibleConstructorReturn(this, (Mp4Remuxer.__proto__ || Object.getPrototypeOf(Mp4Remuxer)).call(this));\n\n _this.TAG = 'Fmp4Remuxer';\n _this._dtsBase = curTime * 1000;\n\n _this._videoMeta = videoMeta;\n _this._audioMeta = audioMeta;\n\n _this._audioDtsBase = null;\n _this._videoDtsBase = null;\n _this._isDtsBaseInited = false;\n\n _this.isFirstVideo = true;\n _this.isFirstAudio = true;\n\n _this.videoAllDuration = 0;\n _this.audioAllDuration = 0;\n\n _this.audioRemuxed = 0;\n _this.videoRemuxed = 0;\n _this.mp4Durations = {\n keys: []\n };\n return _this;\n }\n\n _createClass(Mp4Remuxer, [{\n key: 'destroy',\n value: function destroy() {\n this._dtsBase = -1;\n this._isDtsBaseInited = false;\n this.mp4Durations = {\n keys: []\n };\n\n this.removeAllListeners();\n }\n\n /**\n * @param {AudioTrack} audioTrack\n * @param {VideoTrack} videoTrack\n */\n\n }, {\n key: 'remux',\n value: function remux(audioTrack, videoTrack) {\n !this._isDtsBaseInited && this.calcDtsBase(audioTrack, videoTrack);\n this.remuxVideo(videoTrack);\n this.remuxAudio(audioTrack);\n\n logger.groupEnd();\n }\n }, {\n key: 'resetDtsBase',\n value: function resetDtsBase() {\n this._dtsBase = 0;\n }\n }, {\n key: 'seek',\n value: function seek(time) {\n logger.log(this.TAG, 'set dtsBase for seek(),time=', time);\n if (!this._isDtsBaseInited) {\n this._dtsBase = time * 1000;\n } else {\n this._isDtsBaseInited = false;\n this._dtsBase = time * 1000;\n }\n\n this._audioDtsBase = this._videoDtsBase = null;\n }\n\n /**\n * @param {'video' | 'audio' } type\n * @param {*} meta\n * @return {Buffer}\n */\n\n }, {\n key: 'remuxInitSegment',\n value: function remuxInitSegment(type, meta) {\n logger.log(this.TAG, 'remuxInitSegment: type=', type);\n var initSegment = new Buffer();\n var ftyp = meta.streamType === 0x24 ? Fmp4.ftypHEVC() : Fmp4.ftyp();\n var moov = Fmp4.moov({ type: type, meta: meta });\n\n initSegment.write(ftyp, moov);\n return initSegment;\n }\n\n /**\n * @param {AudioTrack} audioTrack\n * @param {VideoTrack} videoTrack\n */\n\n }, {\n key: 'calcDtsBase',\n value: function calcDtsBase(audioTrack, videoTrack) {\n if (!audioTrack && videoTrack.samples.length) {\n var firstSample = videoTrack.samples[0];\n var _start = void 0;\n if (firstSample.options && firstSample.options.start) {\n _start = firstSample.options.start;\n }\n this._videoDtsBase = firstSample.dts - (_start || this._dtsBase);\n this._isDtsBaseInited = true;\n return;\n }\n\n if ((!audioTrack || !audioTrack.samples.length) && (!videoTrack || !videoTrack.samples.length)) {\n return;\n }\n\n var audioBase = null;\n var videoBase = null;\n var start = null;\n if (audioTrack && audioTrack.samples && audioTrack.samples.length) {\n var _firstSample = audioTrack.samples[0];\n audioBase = _firstSample.dts;\n if (_firstSample.options && _firstSample.options.start) {\n start = _firstSample.options.start;\n }\n }\n if (videoTrack && videoTrack.samples && videoTrack.samples.length) {\n var _firstSample2 = videoTrack.samples[0];\n videoBase = _firstSample2.dts;\n if (_firstSample2.options && _firstSample2.options.start) {\n start = _firstSample2.options.start;\n }\n }\n\n var delta = audioBase - videoBase;\n // 临时兼容逻辑, hls 考虑上av之间的差值\n if (delta < 0 && start !== null) {\n videoTrack.samples.forEach(function (x) {\n x.dts -= delta;\n if (x.pts) {\n x.pts -= delta;\n }\n });\n }\n\n this._videoDtsBase = (videoBase || audioBase) - (start || this._dtsBase);\n this._audioDtsBase = (audioBase || videoBase) - (start || this._dtsBase);\n this._dtsBase = Math.min(videoBase, audioBase);\n this._isDtsBaseInited = true;\n\n logger.log(this.TAG, 'calcDtsBase');\n logger.log(this.TAG, 'video first dts: ' + videoBase + ' , start:' + start + ' , _videoDtsBase:' + this._videoDtsBase + ' , _dtsBase:' + this._dtsBase);\n logger.log(this.TAG, 'audio first dts: ' + audioBase + ' , start:' + start + ' , _audioDtsBase:' + this._audioDtsBase + ', _dtsBase:' + this._dtsBase);\n }\n\n /**\n * @param {VideoTrack}videoTrack\n * @return {*}\n * @private\n */\n\n }, {\n key: 'remuxVideo',\n value: function remuxVideo(videoTrack) {\n var _this2 = this;\n\n var track = videoTrack || {};\n\n if (!videoTrack || !videoTrack.samples || !videoTrack.samples.length) {\n return;\n }\n\n var samples = track.samples,\n meta = track.meta;\n\n\n if (!meta) return;\n\n var firstDts = -1;\n\n var initSegment = null;\n var mp4Samples = [];\n var mdatBox = {\n samples: []\n };\n\n var maxLoop = 10000;\n while (samples.length && maxLoop-- > 0) {\n var avcSample = samples.shift();\n\n var isKeyframe = avcSample.isKeyframe,\n options = avcSample.options;\n\n if (!this.isFirstVideo && options && options.meta) {\n initSegment = this.remuxInitSegment('video', options.meta);\n options.meta = null;\n samples.unshift(avcSample);\n if (!options.isContinue) {\n this._videoDtsBase = 0;\n }\n break;\n }\n var dts = Math.max(0, avcSample.dts - this.videoDtsBase);\n if (firstDts === -1) {\n firstDts = dts;\n }\n\n var cts = void 0;\n var pts = void 0;\n if (avcSample.pts !== undefined) {\n pts = avcSample.pts - this._dtsBase;\n cts = pts - dts;\n }\n if (avcSample.cts !== undefined) {\n pts = avcSample.cts + dts;\n cts = avcSample.cts;\n }\n\n var mdatSample = {\n buffer: [],\n size: 0\n };\n\n var sampleDuration = 0;\n if (avcSample.duration) {\n sampleDuration = avcSample.duration;\n } else if (samples.length >= 1) {\n var nextDts = samples[0].dts - this.videoDtsBase;\n sampleDuration = nextDts - dts;\n } else {\n if (mp4Samples.length >= 1) {\n // lastest sample, use second last duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else {\n // the only one sample, use reference duration\n sampleDuration = this._videoMeta.refSampleDuration;\n }\n }\n this.videoAllDuration += sampleDuration;\n if (logger.long) {\n logger.log(this.TAG, 'video dts ' + dts, 'pts ' + pts, 'cts: ' + cts, isKeyframe, 'originDts ' + avcSample.originDts, 'duration ' + sampleDuration);\n }\n if (sampleDuration >= 0) {\n mdatBox.samples.push(mdatSample);\n mdatSample.buffer.push(avcSample.data);\n mdatSample.size += avcSample.data.byteLength;\n // manage same pts sample\n if (this.mp4Durations[pts]) {\n pts += this.mp4Durations[pts];\n cts = pts - dts;\n }\n mp4Samples.push({\n dts: dts,\n cts: cts,\n pts: pts,\n data: avcSample.data,\n size: avcSample.data.byteLength,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n },\n originDts: dts,\n type: 'video'\n });\n this.mp4Durations[pts] = sampleDuration;\n this.mp4Durations.keys.push(pts);\n }\n\n if (isKeyframe) {\n this.emit(Mp4Remuxer.EVENTS.RANDOM_ACCESS_POINT, pts);\n }\n }\n // delete too much data\n if (this.mp4Durations.keys.length > 1e4) {\n var tmp = this.mp4Durations;\n this.mp4Durations = {};\n this.mp4Durations.keys = tmp.keys.slice(-100);\n this.mp4Durations.keys.forEach(function (key) {\n _this2.mp4Durations[key] = tmp[key];\n });\n }\n if (mp4Samples.length) {\n logger.log(this.TAG, 'remux to mp4 video:', [firstDts / 1000, mp4Samples[mp4Samples.length - 1].dts / 1000]);\n }\n\n var moofMdat = new Buffer();\n if (mp4Samples.length && track.meta) {\n var moof = Fmp4.moof({\n id: track.meta.id,\n time: firstDts,\n samples: mp4Samples\n });\n var mdat = Fmp4.mdat(mdatBox);\n moofMdat.write(moof, mdat);\n\n this.segmentRemuxed('video', moofMdat, mp4Samples[mp4Samples.length - 1].pts - mp4Samples[0].pts);\n }\n\n if (initSegment) {\n this.segmentRemuxed('video', initSegment);\n\n if (samples.length) {\n // second part of stream change\n track.samples = samples;\n return this.remuxVideo(track);\n }\n }\n\n this.isFirstVideo = false;\n this.emit(Mp4Remuxer.EVENTS.TRACK_REMUXED, 'video', moofMdat);\n\n track.samples = [];\n track.length = 0;\n }\n\n /**\n *\n * @param {AudioTrack} track\n * @return {*}\n * @private\n */\n\n }, {\n key: 'remuxAudio',\n value: function remuxAudio(track) {\n var _ref2 = track || {},\n samples = _ref2.samples;\n\n var firstDts = -1;\n var mp4Samples = [];\n\n var initSegment = null;\n var mdatBox = {\n samples: []\n };\n if (!samples || !samples.length) {\n return;\n }\n\n var maxLoop = 10000;\n var isFirstDtsInited = false;\n while (samples.length && maxLoop-- > 0) {\n var sample = samples.shift();\n var data = sample.data,\n options = sample.options;\n\n if (!this.isFirstAudio && options && options.meta) {\n initSegment = this.remuxInitSegment('audio', options.meta);\n options.meta = null;\n samples.unshift(sample);\n if (!options.isContinue) {\n this._audioDtsBase = 0;\n }\n break;\n }\n\n var dts = Math.max(0, sample.dts - this.audioDtsBase);\n var originDts = sample.originDts;\n if (!isFirstDtsInited) {\n firstDts = dts;\n isFirstDtsInited = true;\n }\n\n var sampleDuration = 0;\n if (sample.duration) {\n sampleDuration = sample.duration;\n } else if (this._audioMeta.refSampleDurationFixed) {\n sampleDuration = this._audioMeta.refSampleDurationFixed;\n } else if (samples.length >= 1) {\n var nextDts = samples[0].dts - this.audioDtsBase;\n sampleDuration = nextDts - dts;\n } else {\n if (mp4Samples.length >= 1) {\n // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else {\n // the only one sample, use reference sample duration\n sampleDuration = this._audioMeta.refSampleDuration;\n }\n }\n\n if (logger.long) {\n logger.log(this.TAG, 'audio dts ' + dts, 'pts ' + dts, 'originDts ' + originDts, 'duration ' + sampleDuration);\n }\n this.audioAllDuration += sampleDuration;\n var mp4Sample = {\n dts: dts,\n pts: dts,\n cts: 0,\n size: data.byteLength,\n duration: sample.duration ? sample.duration : sampleDuration,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0,\n isNonSync: 0\n },\n isKeyframe: true,\n originDts: originDts,\n type: 'audio'\n };\n\n var mdatSample = {\n buffer: [],\n size: 0\n };\n\n if (sampleDuration >= 0) {\n mdatSample.buffer.push(data);\n mdatSample.size += data.byteLength;\n\n mdatBox.samples.push(mdatSample);\n mp4Samples.push(mp4Sample);\n }\n }\n\n var moofMdat = new Buffer();\n\n if (mp4Samples.length && track.meta) {\n logger.log(this.TAG, 'remux to mp4 audio:', [firstDts / 1000, mp4Samples[mp4Samples.length - 1].dts / 1000]);\n var moof = Fmp4.moof({\n id: track.meta.id,\n time: firstDts,\n samples: mp4Samples\n });\n var mdat = Fmp4.mdat(mdatBox);\n moofMdat.write(moof, mdat);\n\n this.segmentRemuxed('audio', moofMdat, mp4Samples[mp4Samples.length - 1].dts - mp4Samples[0].dts);\n }\n\n if (initSegment) {\n this.segmentRemuxed('audio', initSegment);\n if (samples.length) {\n // second part of stream change\n track.samples = samples;\n return this.remuxAudio(track);\n }\n }\n\n this.isFirstAudio = false;\n this.emit(Mp4Remuxer.EVENTS.TRACK_REMUXED, 'audio', moofMdat);\n\n track.samples = [];\n track.length = 0;\n }\n }, {\n key: 'segmentRemuxed',\n value: function segmentRemuxed(type, buffer, bufferDuration) {\n this.emit(Mp4Remuxer.EVENTS.MEDIA_SEGMENT, type, buffer, bufferDuration);\n }\n }, {\n key: 'videoDtsBase',\n get: function get() {\n if (this._videoDtsBase !== null) {\n return this._videoDtsBase;\n }\n return this._dtsBase;\n },\n set: function set(value) {\n this._videoDtsBase = value;\n }\n }, {\n key: 'audioDtsBase',\n get: function get() {\n if (this._audioDtsBase !== null) {\n return this._audioDtsBase;\n }\n return this._dtsBase;\n }\n }], [{\n key: 'EVENTS',\n get: function get() {\n return {\n MEDIA_SEGMENT: 'MEDIA_SEGMENT',\n INIT_SEGMENT: 'INIT_SEGMENT',\n RANDOM_ACCESS_POINT: 'RANDOM_ACCESS_POINT',\n TRACK_REMUXED: 'TRACK_REMUXED'\n };\n }\n }]);\n\n return Mp4Remuxer;\n}(EventEmitter);\n\nexport default Mp4Remuxer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { EVENTS } from 'xgplayer-helper-utils';\nimport Remuxer from './remuxer';\n\nvar REMUX_EVENTS = EVENTS.REMUX_EVENTS;\nvar PLAYER_EVENTS = EVENTS.PLAYER_EVENTS;\n\nvar Mp4Remuxer = function () {\n function Mp4Remuxer() {\n var curTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n _classCallCheck(this, Mp4Remuxer);\n\n this.TAG = 'Mp4Remuxer';\n this._curTime = curTime;\n if (!this.remuxer) {\n this.initRemuxer();\n }\n }\n\n _createClass(Mp4Remuxer, [{\n key: 'init',\n value: function init() {\n this.on(REMUX_EVENTS.REMUX_MEDIA, this.remux.bind(this));\n this.on(REMUX_EVENTS.REMUX_METADATA, this.onMetaDataReady.bind(this));\n this.on(REMUX_EVENTS.DETECT_CHANGE_STREAM, this.resetDtsBase.bind(this));\n this.on(REMUX_EVENTS.DETECT_FRAG_ID_DISCONTINUE, this.seek.bind(this));\n this.on(PLAYER_EVENTS.SEEK, this.seek.bind(this));\n }\n }, {\n key: 'initRemuxer',\n value: function initRemuxer() {\n this.remuxer = new Remuxer({\n audioMeta: null,\n videoMeta: null,\n curTime: this._curTime\n });\n this.remuxer.on(Remuxer.EVENTS.MEDIA_SEGMENT, this.writeToSource.bind(this));\n this.remuxer.on(Remuxer.EVENTS.TRACK_REMUXED, this.onTrackRemuxed.bind(this));\n }\n }, {\n key: 'remux',\n value: function remux() {\n if (!this.remuxer._videoMeta) {\n this.remuxer._videoMeta = this.videoMeta;\n this.remuxer._audioMeta = this.audioMeta;\n }\n\n var _context$getInstance = this._context.getInstance('TRACKS'),\n audioTrack = _context$getInstance.audioTrack,\n videoTrack = _context$getInstance.videoTrack;\n\n return this.remuxer.remux(audioTrack, videoTrack);\n }\n }, {\n key: 'resetDtsBase',\n value: function resetDtsBase() {\n this.remuxer && this.remuxer.resetDtsBase();\n }\n }, {\n key: 'seek',\n value: function seek(time) {\n this.remuxer && this.remuxer.seek(time);\n }\n }, {\n key: 'onMetaDataReady',\n value: function onMetaDataReady(type) {\n if (!this.remuxer) {\n this.initRemuxer();\n }\n var track = void 0;\n\n if (type === 'audio') {\n var _context$getInstance2 = this._context.getInstance('TRACKS'),\n audioTrack = _context$getInstance2.audioTrack;\n\n track = audioTrack;\n } else {\n var _context$getInstance3 = this._context.getInstance('TRACKS'),\n videoTrack = _context$getInstance3.videoTrack;\n\n track = videoTrack;\n }\n\n var presourcebuffer = this._context.getInstance('PRE_SOURCE_BUFFER');\n var source = presourcebuffer.getSource(type);\n if (!source) {\n source = presourcebuffer.createSource(type);\n }\n\n source.mimetype = track.meta.codec;\n source.init = this.remuxer.remuxInitSegment(type, track.meta);\n\n this.emit(REMUX_EVENTS.INIT_SEGMENT, type);\n }\n }, {\n key: 'onTrackRemuxed',\n value: function onTrackRemuxed(track) {\n this.emit(REMUX_EVENTS.MEDIA_SEGMENT, track);\n }\n }, {\n key: 'writeToSource',\n value: function writeToSource(type, buffer, bufferDuration) {\n var presourcebuffer = this._context.getInstance('PRE_SOURCE_BUFFER');\n var source = presourcebuffer.getSource(type);\n if (!source) {\n source = presourcebuffer.createSource(type);\n }\n source.data.push(buffer);\n if (bufferDuration) {\n source.bufferDuration = bufferDuration + (source.bufferDuration || 0);\n }\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n if (this.remuxer) {\n this.remuxer.destroy();\n }\n this.remuxer = null;\n }\n }, {\n key: 'videoMeta',\n get: function get() {\n return this._context.getInstance('TRACKS').videoTrack.meta;\n }\n }, {\n key: 'audioMeta',\n get: function get() {\n return this._context.getInstance('TRACKS').audioTrack.meta;\n }\n }]);\n\n return Mp4Remuxer;\n}();\n\nexport default Mp4Remuxer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { FlvDemuxer, Mp4Remuxer as Remuxer } from 'xgplayer-helper-transmuxers';\nimport { EVENTS, FetchLoader, Mse } from 'xgplayer-helper-utils';\n\nimport { Tracks, RemuxedBufferManager, Buffer as XgBuffer } from 'xgplayer-helper-models';\nimport { Compat as Compatibility } from 'xgplayer-helper-codec';\n\nvar REMUX_EVENTS = EVENTS.REMUX_EVENTS;\nvar DEMUX_EVENTS = EVENTS.DEMUX_EVENTS;\nvar LOADER_EVENTS = EVENTS.LOADER_EVENTS;\nvar MSE_EVENTS = EVENTS.MSE_EVENTS;\n\nvar Tag = 'FLVController';\n\nvar Logger = function () {\n function Logger() {\n _classCallCheck(this, Logger);\n }\n\n _createClass(Logger, [{\n key: 'warn',\n value: function warn() {}\n }]);\n\n return Logger;\n}();\n\nvar FLV_ERROR = 'FLV_ERROR';\n\nvar FlvController = function () {\n function FlvController(player) {\n var configs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var mse = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n\n _classCallCheck(this, FlvController);\n\n this.TAG = Tag;\n this.state = {\n initSegmentArrived: false,\n randomAccessPoints: []\n };\n this.configs = Object.assign({\n retryTimes: 3\n }, configs);\n\n this.mse = mse;\n\n this.bufferClearTimer = null;\n\n this._handleTimeUpdate = this._handleTimeUpdate.bind(this);\n }\n\n _createClass(FlvController, [{\n key: 'init',\n value: function init() {\n if (!this.mse) {\n this.mse = new Mse({ container: this._player.video }, this._context);\n this.mse.init();\n }\n\n this.initComponents();\n this.initListeners();\n }\n }, {\n key: 'initComponents',\n value: function initComponents() {\n this._context.registry('FETCH_LOADER', FetchLoader);\n this._context.registry('LOADER_BUFFER', XgBuffer);\n\n this._context.registry('FLV_DEMUXER', FlvDemuxer);\n this._context.registry('TRACKS', Tracks);\n\n this._context.registry('MP4_REMUXER', Remuxer)(this._player.currentTime);\n\n this._context.registry('PRE_SOURCE_BUFFER', RemuxedBufferManager);\n\n if (this._player.config.compatibility !== false) {\n this._context.registry('COMPATIBILITY', Compatibility);\n }\n\n this._context.registry('LOGGER', Logger);\n }\n }, {\n key: 'initListeners',\n value: function initListeners() {\n this.on(LOADER_EVENTS.LOADER_DATALOADED, this._handleLoaderDataLoaded.bind(this));\n this.on(LOADER_EVENTS.LOADER_ERROR, this._handleNetworkError.bind(this));\n this.on(LOADER_EVENTS.LOADER_RETRY, this._handleFetchRetry.bind(this));\n\n this.on(DEMUX_EVENTS.MEDIA_INFO, this._handleMediaInfo.bind(this));\n this.on(DEMUX_EVENTS.METADATA_PARSED, this._handleMetadataParsed.bind(this));\n this.on(DEMUX_EVENTS.DEMUX_COMPLETE, this._handleDemuxComplete.bind(this));\n this.on(DEMUX_EVENTS.DEMUX_ERROR, this._handleDemuxError.bind(this));\n this.on(DEMUX_EVENTS.SEI_PARSED, this._handleSEIParsed.bind(this));\n\n this.on(REMUX_EVENTS.INIT_SEGMENT, this._handleAppendInitSegment.bind(this));\n this.on(REMUX_EVENTS.MEDIA_SEGMENT, this._handleMediaSegment.bind(this));\n this.on(REMUX_EVENTS.RANDOM_ACCESS_POINT, this._handleAddRAP.bind(this));\n this.on(REMUX_EVENTS.REMUX_ERROR, this._handleRemuxError.bind(this));\n this.on(MSE_EVENTS.SOURCE_UPDATE_END, this._handleSourceUpdateEnd.bind(this));\n this.on(MSE_EVENTS.MSE_ERROR, this._handleMseError.bind(this));\n\n this._player.on('timeupdate', this._handleTimeUpdate);\n }\n }, {\n key: '_handleMediaInfo',\n value: function _handleMediaInfo() {\n if (!this._context.mediaInfo) {\n this.emit(DEMUX_EVENTS.DEMUX_ERROR, new Error('failed to get mediainfo'));\n }\n }\n }, {\n key: '_handleLoaderDataLoaded',\n value: function _handleLoaderDataLoaded() {\n this.emitTo('FLV_DEMUXER', DEMUX_EVENTS.DEMUX_START);\n }\n }, {\n key: '_handleMetadataParsed',\n value: function _handleMetadataParsed(type) {\n this.emit(REMUX_EVENTS.REMUX_METADATA, type);\n }\n }, {\n key: '_handleSEIParsed',\n value: function _handleSEIParsed(sei) {\n this._player.emit('SEI_PARSED', sei);\n }\n }, {\n key: '_handleDemuxComplete',\n value: function _handleDemuxComplete() {\n this.emit(REMUX_EVENTS.REMUX_MEDIA, 'flv');\n }\n }, {\n key: '_handleRemuxError',\n value: function _handleRemuxError(tag, err, fatal) {\n if (fatal === undefined) {\n fatal = false;\n }\n this._player.emit('error', {\n errorType: 'parse',\n ex: '[' + tag + ']: ' + err.message,\n errd: {}\n });\n this._onError(REMUX_EVENTS.REMUX_ERROR, tag, err, fatal);\n }\n }, {\n key: '_handleAppendInitSegment',\n value: function _handleAppendInitSegment() {\n this.state.initSegmentArrived = true;\n this.mse.addSourceBuffers();\n }\n }, {\n key: '_handleMediaSegment',\n value: function _handleMediaSegment() {\n this.mse.addSourceBuffers();\n this.mse.doAppend();\n }\n }, {\n key: '_handleSourceUpdateEnd',\n value: function _handleSourceUpdateEnd() {\n var time = this._player.currentTime;\n var video = this._player.video;\n var preloadTime = this._player.config.preloadTime || 5;\n\n var length = video.buffered.length;\n\n\n if (length === 0) {\n return;\n }\n\n var bufferEnd = video.buffered.end(length - 1);\n if (bufferEnd - time > preloadTime * 2 && !this._player.paused) {\n this._player.currentTime = bufferEnd - preloadTime;\n }\n this.mse.doAppend();\n if (this._player.paused) {\n this._handleTimeUpdate();\n }\n }\n }, {\n key: '_handleTimeUpdate',\n value: function _handleTimeUpdate() {\n var _this = this;\n\n var time = this._player.currentTime;\n\n var video = this._player.video;\n var buffered = video.buffered;\n\n if (!buffered || !buffered.length) {\n return;\n }\n\n var range = [0, 0];\n var currentTime = video.currentTime;\n if (buffered) {\n for (var i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i);\n range[1] = buffered.end(i);\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break;\n }\n }\n }\n\n var bufferStart = range[0];\n var bufferEnd = range[1];\n\n if (currentTime < bufferStart) {\n video.currentTime = bufferStart;\n return;\n }\n\n if (time - bufferStart > 10 || buffered.length > 1) {\n // 在直播时及时清空buffer,降低直播内存占用\n if (this.bufferClearTimer || !this.state.randomAccessPoints.length) {\n return;\n }\n var rap = Infinity;\n for (var _i = 0; _i < this.state.randomAccessPoints.length; _i++) {\n var temp = Math.ceil(this.state.randomAccessPoints[_i] / 1000);\n if (temp > time - 10) {\n break;\n } else {\n rap = temp;\n }\n }\n\n // console.log('rap', rap, `time ${time}`, `bufferEnd ${bufferEnd}`,`clean ${Math.min(rap, time - 10, bufferEnd - 10)}`)\n this.mse.remove(Math.max(Math.min(rap - 1, time - 10, bufferEnd - 10), 0.1), 0);\n\n this.bufferClearTimer = setTimeout(function () {\n _this.bufferClearTimer = null;\n }, 5000);\n }\n }\n }, {\n key: '_handleNetworkError',\n value: function _handleNetworkError(tag, err) {\n this._player.emit('error', {\n code: err.code,\n errorType: 'network',\n ex: '[' + tag + ']: ' + err.message,\n errd: {}\n });\n this._onError(LOADER_EVENTS.LOADER_ERROR, tag, err, true);\n }\n }, {\n key: '_handleFetchRetry',\n value: function _handleFetchRetry(tag, info) {\n this._player.emit('retry', Object.assign({\n tag: tag\n }, info));\n }\n }, {\n key: '_handleDemuxError',\n value: function _handleDemuxError(tag, err, fatal) {\n if (fatal === undefined) {\n fatal = false;\n }\n this._player.emit('error', {\n errorType: 'parse',\n ex: '[' + tag + ']: ' + err.message,\n errd: {}\n });\n this._onError(DEMUX_EVENTS.DEMUX_ERROR, tag, err, fatal);\n }\n }, {\n key: '_handleMseError',\n value: function _handleMseError(tag, err, fatal) {\n if (fatal === undefined) {\n fatal = false;\n }\n this._onError(MSE_EVENTS.MSE_ERROR, tag, err, fatal);\n }\n }, {\n key: '_handleAddRAP',\n value: function _handleAddRAP(rap) {\n if (this.state.randomAccessPoints) {\n this.state.randomAccessPoints.push(rap);\n }\n }\n }, {\n key: '_onError',\n value: function _onError(type, mod, err, fatal) {\n var error = {\n errorType: type,\n errorDetails: '[' + mod + ']: ' + (err ? err.message : ''),\n errorFatal: fatal || false\n };\n this._player.emit(FLV_ERROR, error);\n }\n }, {\n key: 'seek',\n value: function seek() {\n if (!this.state.initSegmentArrived) {\n this.loadData();\n }\n }\n }, {\n key: 'loadData',\n value: function loadData() {\n var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._player.config.url;\n\n var _ref = this._player.config.retry || {},\n times = _ref.count,\n delayTime = _ref.delay;\n\n this.emit(LOADER_EVENTS.LADER_START, url, {}, times, delayTime);\n }\n }, {\n key: 'pause',\n value: function pause() {\n var loader = this._context.getInstance('FETCH_LOADER');\n\n if (loader) {\n loader.cancel();\n }\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this._player.off('timeupdate', this._handleTimeUpdate);\n this.mse = null;\n this.state.randomAccessPoints = [];\n }\n }]);\n\n return FlvController;\n}();\n\nexport default FlvController;","import { Mp4Remuxer, FlvDemuxer } from 'xgplayer-helper-transmuxers';\nimport { FetchLoader, Mse } from 'xgplayer-helper-utils';\nimport { RemuxedBufferManager, Buffer as XgBuffer, Tracks } from 'xgplayer-helper-models';\nimport { Compat as Compatibility } from 'xgplayer-helper-codec';\n\nexport default {\n Mp4Remuxer: Mp4Remuxer,\n FlvDemuxer: FlvDemuxer,\n FetchLoader: FetchLoader,\n Tracks: Tracks,\n RemuxedBufferManager: RemuxedBufferManager,\n XgBuffer: XgBuffer,\n Compatibility: Compatibility,\n Mse: Mse\n};","var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport Player from 'xgplayer';\nimport { EVENTS, Context } from 'xgplayer-helper-utils';\nimport FLV from './flv-live';\nimport defaultConfig from './config';\nvar flvAllowedEvents = EVENTS.FlvAllowedEvents;\n\nvar FlvPlayer = function (_Player) {\n _inherits(FlvPlayer, _Player);\n\n _createClass(FlvPlayer, null, [{\n key: 'isSupported',\n value: function isSupported() {\n return window.MediaSource && window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n }, {\n key: 'install',\n value: function install(name, plugin) {\n return Player.install(name, plugin);\n }\n }]);\n\n function FlvPlayer(config) {\n _classCallCheck(this, FlvPlayer);\n\n var _this = _possibleConstructorReturn(this, (FlvPlayer.__proto__ || Object.getPrototypeOf(FlvPlayer)).call(this, config));\n\n _this.config = Object.assign({}, defaultConfig, _this.config);\n _this.initEvents();\n _this.loaderCompleteTimer = null;\n _this.hasPlayed = false;\n // const preloadTime = player.config.preloadTime || 15\n return _this;\n }\n\n _createClass(FlvPlayer, [{\n key: 'start',\n value: function start() {\n if (this.started) {\n return;\n }\n if (this.context) {\n this.context.destroy();\n }\n this.context = new Context(this, this.config, flvAllowedEvents);\n this.initFlv();\n this.context.init();\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'start', this).call(this, this.flv.mse.url);\n this.loadData();\n this.started = true;\n }\n }, {\n key: 'initFlvEvents',\n value: function initFlvEvents(flv) {\n var _this2 = this;\n\n var player = this;\n\n flv.once(EVENTS.REMUX_EVENTS.INIT_SEGMENT, function () {\n Player.util.addClass(player.root, 'xgplayer-is-live');\n });\n\n flv.once(EVENTS.LOADER_EVENTS.LOADER_COMPLETE, function () {\n // 直播完成,待播放器播完缓存后发送关闭事件\n if (!player.paused) {\n if (_this2.video) {\n var end = _this2.getBufferedRange()[1];\n var restTime = end - _this2.currentTime;\n setTimeout(function () {\n _this2.emit('ended');\n }, restTime * 1000);\n }\n } else {\n player.emit('ended');\n }\n });\n }\n }, {\n key: 'initFlvBackupEvents',\n value: function initFlvBackupEvents(flv, ctx) {\n var _this3 = this;\n\n var mediaLength = 3;\n flv.on(EVENTS.REMUX_EVENTS.MEDIA_SEGMENT, function () {\n mediaLength -= 1;\n if (mediaLength === 0) {\n // ensure switch smoothly\n _this3.flv = flv;\n _this3.mse.resetContext(ctx);\n _this3.context.destroy();\n _this3.context = ctx;\n if (_this3.paused) {\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'play', _this3).call(_this3);\n }\n }\n });\n\n flv.once(EVENTS.LOADER_EVENTS.LOADER_COMPLETE, function () {\n // 直播完成,待播放器播完缓存后发送关闭事件\n if (!_this3.paused) {\n if (_this3.video) {\n var end = _this3.getBufferedRange()[1];\n var restTime = end - _this3.currentTime;\n setTimeout(function () {\n _this3.emit('ended');\n }, restTime * 1000);\n }\n } else {\n _this3.emit('ended');\n }\n });\n\n flv.once(EVENTS.LOADER_EVENTS.LOADER_ERROR, function () {\n ctx.destroy();\n });\n }\n }, {\n key: 'initEvents',\n value: function initEvents() {\n var _this4 = this;\n\n this.on('seeking', function () {\n var time = _this4.currentTime;\n var range = _this4.getBufferedRange();\n if (time > range[1] || time < range[0]) {\n _this4.flv.seek(_this4.currentTime);\n }\n });\n\n // support for old version xgplayer\n this.once('play', function () {\n _this4.hasPlayed = true;\n });\n }\n }, {\n key: 'initFlv',\n value: function initFlv() {\n var flv = this.context.registry('FLV_CONTROLLER', FLV)(this, { retryTimes: this.config.retryTimes });\n this.initFlvEvents(flv);\n this.flv = flv;\n this.mse = flv.mse;\n return flv;\n }\n }, {\n key: 'play',\n value: function play() {\n var _this5 = this;\n\n if (this.paused && this.hasPlayed) {\n return this.mse.cleanBuffers().then(function () {\n _this5.started = false;\n _this5.start();\n return _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'play', _this5).call(_this5);\n });\n } else {\n this.hasPlayed = true;\n return _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'play', this).call(this);\n }\n }\n }, {\n key: 'pause',\n value: function pause() {\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'pause', this).call(this);\n if (this.flv) {\n this.flv.pause();\n this.hasPlayed = true;\n }\n }\n }, {\n key: 'loadData',\n value: function loadData() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentTime;\n\n if (this.flv) {\n this.flv.seek(time);\n }\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n var _this6 = this;\n\n var prom = new Promise(function (resolve) {\n _this6._destroy().then(resolve).catch(resolve);\n setTimeout(function () {\n resolve();\n }, 50);\n });\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'destroy', this).call(this);\n return prom;\n }\n }, {\n key: '_destroy',\n value: function _destroy() {\n var _this7 = this;\n\n if (this.context) {\n this.context.destroy();\n }\n if (this.newContext) {\n this.newContext.destroy();\n }\n var work = function work() {\n _this7.flv = null;\n _this7.context = null;\n _this7.newFlv = null;\n _this7.newContext = null;\n };\n if (this.flv && this.flv.mse) {\n return this.flv.mse.destroy().then(function () {\n work();\n });\n }\n return Promise.resolve().then(function () {\n work();\n });\n }\n }, {\n key: 'switchURL',\n\n\n /**\n * switch to another flv live url\n * @param url\n * @param seamless\n */\n value: function switchURL(url) {\n var seamless = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!seamless) {\n this.pause();\n this.context.destroy();\n }\n var context = new Context(this, this.config, flvAllowedEvents);\n var flv = context.registry('FLV_CONTROLLER', FLV)(this, { retryTimes: this.config.retryTimes }, this.mse);\n this.newContext = context;\n this.newFlv = flv;\n context.init();\n this.initFlvBackupEvents(flv, context);\n flv.loadData(url);\n }\n }, {\n key: 'src',\n get: function get() {\n return this.currentSrc;\n },\n set: function set(url) {\n this.switchURL(url);\n }\n }, {\n key: 'core',\n get: function get() {\n return this.flv;\n }\n }]);\n\n return FlvPlayer;\n}(Player);\n\nexport default FlvPlayer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { EVENTS } from 'xgplayer-helper-utils';\nimport { avc, hevc } from 'xgplayer-helper-codec';\nimport { XGDataView } from 'xgplayer-helper-models';\nimport Player from 'xgplayer';\n\nvar NalUnit = avc.NalUnit;\nvar NalUnitHEVC = hevc.NalUnitHEVC;\n\nvar DEMUX_EVENTS = EVENTS.DEMUX_EVENTS;\nvar LOADER_EVENTS = EVENTS.LOADER_EVENTS;\n\nvar Tag = 'FLVController';\n\nvar FLV_ERROR = 'FLV_ERROR';\n\nvar FlvController = function () {\n function FlvController(player) {\n _classCallCheck(this, FlvController);\n\n this.TAG = Tag;\n\n this.state = {\n initSegmentArrived: false,\n randomAccessPoints: []\n };\n\n this.bufferClearTimer = null;\n }\n\n _createClass(FlvController, [{\n key: 'init',\n value: function init() {\n this.initComponents();\n this.initListeners();\n }\n }, {\n key: 'initComponents',\n value: function initComponents() {\n var _player$config = this._player.config,\n FetchLoader = _player$config.FetchLoader,\n XgBuffer = _player$config.XgBuffer,\n FlvDemuxer = _player$config.FlvDemuxer,\n Tracks = _player$config.Tracks,\n Logger = _player$config.Logger;\n\n this._context.registry('FETCH_LOADER', FetchLoader);\n this._context.registry('LOADER_BUFFER', XgBuffer);\n\n this._context.registry('FLV_DEMUXER', FlvDemuxer);\n this._context.registry('TRACKS', Tracks);\n\n this._context.registry('LOGGER', Logger);\n // this._context.registry('PAGE_VISIBILITY', PageVisibility)\n }\n }, {\n key: 'initListeners',\n value: function initListeners() {\n this.on(LOADER_EVENTS.LOADER_DATALOADED, this._handleLoaderDataLoaded.bind(this));\n this.on(LOADER_EVENTS.LOADER_ERROR, this._handleNetworkError.bind(this));\n\n this.on(DEMUX_EVENTS.MEDIA_INFO, this._handleMediaInfo.bind(this));\n this.on(DEMUX_EVENTS.METADATA_PARSED, this._handleMetadataParsed.bind(this));\n this.on(DEMUX_EVENTS.DEMUX_COMPLETE, this._handleDemuxComplete.bind(this));\n this.on(DEMUX_EVENTS.DEMUX_ERROR, this._handleDemuxError.bind(this));\n this.on(DEMUX_EVENTS.SEI_PARSED, this._handleSEIParsed.bind(this));\n // this.on(BROWSER_EVENTS.VISIBILITY_CHANGE, this._handleVisibilityChange.bind(this))\n }\n }, {\n key: '_handleMediaInfo',\n value: function _handleMediaInfo() {\n // meta extracted from flv scriptData\n if (!this._context.mediaInfo) {\n this.emit(DEMUX_EVENTS.DEMUX_ERROR, new Error('failed to get mediainfo'));\n } else {\n if (this._player.video) {\n this._player.video.handleMediaInfo();\n }\n }\n }\n }, {\n key: '_handleLoaderDataLoaded',\n value: function _handleLoaderDataLoaded() {\n this.emitTo('FLV_DEMUXER', DEMUX_EVENTS.DEMUX_START);\n }\n }, {\n key: '_handleSEIParsed',\n value: function _handleSEIParsed(sei) {\n this._player.emit('SEI_PARSED', sei);\n }\n }, {\n key: '_handleDemuxComplete',\n value: function _handleDemuxComplete() {\n var _this = this;\n\n if (this._player.video) {\n var _context$getInstance = this._context.getInstance('TRACKS'),\n videoTrack = _context$getInstance.videoTrack,\n audioTrack = _context$getInstance.audioTrack;\n\n videoTrack.samples.forEach(function (sample) {\n if (sample.analyzed) {\n return;\n }\n\n sample.analyzed = true;\n var buffer = new XGDataView(sample.data.buffer);\n var nals = void 0;\n if (_this._isHEVC(videoTrack.meta)) {\n nals = NalUnitHEVC.getHvccNals(buffer);\n } else {\n nals = NalUnit.getNalunits(buffer);\n }\n var nalsLength = nals.reduce(function (len, current) {\n return len + 4 + current.body.byteLength;\n }, 0);\n var newData = new Uint8Array(nalsLength);\n var offset = 0;\n\n // byte-stream nalunit to AnnexB\n nals.forEach(function (nal) {\n newData.set([0, 0, 0, 1], offset);\n offset += 4;\n newData.set(new Uint8Array(nal.body), offset);\n offset += nal.body.byteLength;\n });\n\n sample.data = newData;\n });\n this._player.video.onDemuxComplete(videoTrack, audioTrack);\n }\n }\n }, {\n key: '_handleVisibilityChange',\n value: function _handleVisibilityChange(hidden) {\n var visible = !hidden;\n if (!visible && !this._player.paused) {\n this._player.pause();\n } else if (visible && this._player.paused) {\n this._player.play();\n }\n }\n }, {\n key: '_handleMetadataParsed',\n value: function _handleMetadataParsed(type) {\n if (type === 'audio') {\n // 将音频meta信息交给audioContext,不走remux封装\n var _context$getInstance2 = this._context.getInstance('TRACKS'),\n audioTrack = _context$getInstance2.audioTrack;\n\n if (audioTrack && audioTrack.meta) {\n this._setMetaToAudio(audioTrack.meta);\n }\n } else {\n var _context$getInstance3 = this._context.getInstance('TRACKS'),\n videoTrack = _context$getInstance3.videoTrack;\n\n if (videoTrack && videoTrack.meta) {\n this._setMetaToVideo(videoTrack.meta);\n }\n }\n }\n }, {\n key: '_setMetaToAudio',\n value: function _setMetaToAudio(audioMeta) {\n if (this._player.video) {\n this._player.video.setAudioMeta(audioMeta);\n }\n }\n }, {\n key: '_setMetaToVideo',\n value: function _setMetaToVideo(videoMeta) {\n if (this._player.video) {\n this._player.video.setVideoMeta(videoMeta);\n }\n }\n }, {\n key: '_handleAppendInitSegment',\n value: function _handleAppendInitSegment() {\n this.state.initSegmentArrived = true;\n }\n }, {\n key: '_handleNetworkError',\n value: function _handleNetworkError(tag, err) {\n this._player.emit('error', new Player.Errors('network', this._player.config.url));\n this._onError(LOADER_EVENTS.LOADER_ERROR, tag, err, true, 'MEDIA_ERR_NETWORK');\n }\n }, {\n key: '_handleDemuxError',\n value: function _handleDemuxError(tag, err, fatal) {\n if (fatal === undefined) {\n fatal = false;\n }\n this._player.emit('error', new Player.Errors('parse', this._player.config.url));\n this._onError(DEMUX_EVENTS.DEMUX_ERROR, tag, err, fatal, 'MEDIA_ERR_DECODE');\n }\n }, {\n key: '_handleAddRAP',\n value: function _handleAddRAP(rap) {\n if (this.state.randomAccessPoints) {\n this.state.randomAccessPoints.push(rap);\n }\n }\n }, {\n key: '_onError',\n value: function _onError(type, mod, err, fatal, code) {\n var detail = '[' + mod + ']: ' + err.message;\n var error = {\n errorType: type,\n errorDetails: detail,\n errorFatal: fatal || false\n };\n this._player.emit(FLV_ERROR, error);\n if (this._player.video) {\n this._player.video.handleErr(code, detail);\n }\n }\n }, {\n key: '_isHEVC',\n value: function _isHEVC(meta) {\n return meta && meta.codec === 'hev1.1.6.L93.B0';\n }\n }, {\n key: 'seek',\n value: function seek() {\n if (!this.state.initSegmentArrived) {\n this.loadData();\n }\n }\n }, {\n key: 'loadData',\n value: function loadData() {\n var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._player.config.url;\n\n this.emit(LOADER_EVENTS.LADER_START, url);\n }\n }, {\n key: 'pause',\n value: function pause() {\n var loader = this._context.getInstance('FETCH_LOADER');\n\n if (loader) {\n loader.cancel();\n }\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.state.randomAccessPoints = [];\n }\n }]);\n\n return FlvController;\n}();\n\nexport default FlvController;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { FlvDemuxer } from 'xgplayer-helper-transmuxers';\nimport { FetchLoader } from 'xgplayer-helper-utils';\nimport { Tracks, Buffer as XgBuffer } from 'xgplayer-helper-models';\n\nvar Logger = function () {\n function Logger() {\n _classCallCheck(this, Logger);\n }\n\n _createClass(Logger, [{\n key: 'warn',\n value: function warn() {}\n }]);\n\n return Logger;\n}();\n\nexport default {\n FlvDemuxer: FlvDemuxer,\n FetchLoader: FetchLoader,\n Tracks: Tracks,\n XgBuffer: XgBuffer,\n Logger: Logger\n};","var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport Player from 'xgplayer';\nimport { EVENTS, Context } from 'xgplayer-helper-utils';\nimport FLV from './flv-live-mobile';\nimport defaultConfig from './config';\n// import 'xgplayer-mobilevideo'\nvar flvAllowedEvents = EVENTS.FlvAllowedEvents;\n\nvar FlvPlayer = function (_Player) {\n _inherits(FlvPlayer, _Player);\n\n _createClass(FlvPlayer, null, [{\n key: 'isSupported',\n value: function isSupported() {\n var wasmSupported = 'WebAssembly' in window;\n var WebComponentSupported = 'customElements' in window && window.customElements.define;\n var isComponentDefined = false;\n if (WebComponentSupported) {\n isComponentDefined = window.customElements.get('live-video');\n }\n return wasmSupported && isComponentDefined;\n }\n }]);\n\n function FlvPlayer(config) {\n _classCallCheck(this, FlvPlayer);\n\n if (!config.mediaType) {\n config.mediaType = 'live-video';\n if (config.videoConfig) {\n config.videoConfig.preloadtime = config.preloadTime || 5;\n } else {\n config.videoConfig = {\n preloadtime: config.preloadTime || 5\n };\n }\n }\n\n var _this = _possibleConstructorReturn(this, (FlvPlayer.__proto__ || Object.getPrototypeOf(FlvPlayer)).call(this, config));\n\n _this.config = Object.assign({}, defaultConfig, _this.config);\n if (!_this.playerInited) {\n _this.initPlayer(config);\n }\n return _this;\n }\n\n _createClass(FlvPlayer, [{\n key: 'initPlayer',\n value: function initPlayer() {\n this.video.width = Number.parseInt(this.config.width || 600);\n this.video.height = Number.parseInt(this.config.height || 337.5);\n this.video.style.outline = 'none';\n this.context = new Context(flvAllowedEvents);\n this.playerInited = true;\n }\n }, {\n key: 'start',\n value: function start() {\n if (!this.playerInited) {\n this.initPlayer();\n }\n this.initFlv();\n this.context.init();\n this.flv.seek(0);\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'start', this).call(this, this.config.url);\n // this.play();\n }\n }, {\n key: 'initFlvEvents',\n value: function initFlvEvents(flv) {\n var player = this;\n\n flv.once(EVENTS.LOADER_EVENTS.LOADER_COMPLETE, function () {\n // 直播完成,待播放器播完缓存后发送关闭事件\n if (!player.paused) {\n var timer = setInterval(function () {\n var end = player.getBufferedRange()[1];\n if (Math.abs(player.currentTime - end) < 0.5) {\n // player.emit('ended')\n if (player.video) {\n player.video.handleEnded();\n }\n window.clearInterval(timer);\n }\n }, 200);\n }\n });\n }\n }, {\n key: 'initFlv',\n value: function initFlv() {\n var flv = this.context.registry('FLV_CONTROLLER', FLV)(this);\n this.initFlvEvents(flv);\n this.flv = flv;\n }\n }, {\n key: 'play',\n value: function play() {\n if (this._hasStart && this.paused) {\n this._destroy();\n this.context = new Context(flvAllowedEvents);\n var flv = this.context.registry('FLV_CONTROLLER', FLV)(this);\n this.initFlvEvents(flv);\n this.flv = flv;\n this.context.init();\n this.loadData();\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'start', this).call(this);\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'play', this).call(this);\n } else {\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'play', this).call(this);\n this.addLiveFlag();\n }\n }\n }, {\n key: 'pause',\n value: function pause() {\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'pause', this).call(this);\n if (this.flv) {\n this.flv.pause();\n }\n }\n }, {\n key: 'loadData',\n value: function loadData() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentTime;\n\n if (this.flv) {\n this.flv.seek(time);\n }\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n var isDelDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n this._destroy();\n var video = this.video,\n root = this.root;\n\n _get(FlvPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvPlayer.prototype), 'destroy', this).call(this, isDelDOM);\n if (video && video.remove) {\n video.remove();\n } else if (root) {\n root.removeChild(video);\n }\n }\n }, {\n key: 'addLiveFlag',\n value: function addLiveFlag() {\n var player = this;\n Player.util.addClass(player.root, 'xgplayer-is-live');\n if (!Player.util.findDom(this.root, 'xg-live')) {\n var live = Player.util.createDom('xg-live', '正在直播', {}, 'xgplayer-live');\n player.controls.appendChild(live);\n }\n }\n }, {\n key: '_destroy',\n value: function _destroy() {\n this.context.destroy();\n this.flv = null;\n this.context = null;\n }\n }, {\n key: 'src',\n get: function get() {\n return this.currentSrc;\n },\n set: function set(url) {\n this.config.url = url;\n if (!this.paused) {\n this.currentTime = 0;\n this.pause();\n // this.once('pause', () => {\n // this.start(url)\n // })\n this.play();\n } else {\n this.start(url);\n }\n }\n }]);\n\n return FlvPlayer;\n}(Player);\n\nexport default FlvPlayer;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport Player from 'xgplayer';\nimport FlvLiveMsePlayer from './mse';\nimport FlvLiveMobilePlayer from './mobile';\nimport { EVENTS } from 'xgplayer-helper-utils';\n\nvar FlvLivePlayer = function () {\n function FlvLivePlayer(config) {\n _classCallCheck(this, FlvLivePlayer);\n\n if (FlvLiveMobilePlayer.isSupported() && config.useWASM) {\n return new FlvLiveMobilePlayer(config);\n }if (FlvLiveMsePlayer.isSupported()) {\n return new FlvLiveMsePlayer(config);\n } else {\n return new Player(config);\n }\n }\n\n _createClass(FlvLivePlayer, null, [{\n key: 'install',\n value: function install(name, plugin) {\n return Player.install(name, plugin);\n }\n }]);\n\n return FlvLivePlayer;\n}();\n\nexport default FlvLivePlayer;\n\n\nFlvLivePlayer.EVENTS = EVENTS;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { FlvDemuxer, Mp4Remuxer as Remuxer } from 'xgplayer-helper-transmuxers';\nimport { EVENTS, FetchLoader, Mse } from 'xgplayer-helper-utils';\nimport { Tracks, RemuxedBufferManager, Buffer as XgBuffer } from 'xgplayer-helper-models';\nimport { Compat as Compatibility } from 'xgplayer-helper-codec';\n\nimport Player from 'xgplayer';\n\nvar REMUX_EVENTS = EVENTS.REMUX_EVENTS;\nvar DEMUX_EVENTS = EVENTS.DEMUX_EVENTS;\nvar LOADER_EVENTS = EVENTS.LOADER_EVENTS;\nvar MSE_EVENTS = EVENTS.MSE_EVENTS;\n\nvar Tag = 'FLVController';\n\nvar Logger = function () {\n function Logger() {\n _classCallCheck(this, Logger);\n }\n\n _createClass(Logger, [{\n key: 'warn',\n value: function warn() {}\n }]);\n\n return Logger;\n}();\n\nvar FLV_ERROR = 'FLV_ERROR';\n\nvar FlvController = function () {\n function FlvController(player, mse) {\n _classCallCheck(this, FlvController);\n\n this.TAG = Tag;\n\n this.mse = mse;\n this.state = {\n initSegmentArrived: false,\n range: {\n start: 0,\n end: ''\n },\n rangeSupport: true\n };\n }\n\n _createClass(FlvController, [{\n key: 'init',\n value: function init() {\n this._context.registry('FETCH_LOADER', FetchLoader);\n this._context.registry('LOADER_BUFFER', XgBuffer);\n\n this._context.registry('FLV_DEMUXER', FlvDemuxer);\n this._context.registry('TRACKS', Tracks);\n\n this._context.registry('MP4_REMUXER', Remuxer)(this._player.currentTime);\n this._context.registry('PRE_SOURCE_BUFFER', RemuxedBufferManager);\n\n this._context.registry('COMPATIBILITY', Compatibility);\n\n this._context.registry('LOGGER', Logger);\n if (!this.mse) {\n this.mse = new Mse({ container: this._player.video }, this._context);\n this.mse.init();\n }\n\n this.initListeners();\n }\n }, {\n key: 'initListeners',\n value: function initListeners() {\n this.on(LOADER_EVENTS.LOADER_DATALOADED, this._handleLoaderDataLoaded.bind(this));\n this.on(LOADER_EVENTS.LOADER_ERROR, this._handleNetworkError.bind(this));\n\n this.on(DEMUX_EVENTS.MEDIA_INFO, this._handleMediaInfo.bind(this));\n this.on(DEMUX_EVENTS.METADATA_PARSED, this._handleMetadataParsed.bind(this));\n this.on(DEMUX_EVENTS.DEMUX_COMPLETE, this._handleDemuxComplete.bind(this));\n this.on(DEMUX_EVENTS.DEMUX_ERROR, this._handleDemuxError.bind(this));\n this.on(DEMUX_EVENTS.SEI_PARSED, this._handleSEIParsed.bind(this));\n this.on(MSE_EVENTS.MSE_ERROR, this._handleMseError.bind(this));\n this.on(REMUX_EVENTS.INIT_SEGMENT, this._handleAppendInitSegment.bind(this));\n this.on(REMUX_EVENTS.MEDIA_SEGMENT, this._handleMediaSegment.bind(this));\n }\n }, {\n key: '_handleMediaInfo',\n value: function _handleMediaInfo() {\n var _this = this;\n\n if (!this._context.onMetaData) {\n this.emit(DEMUX_EVENTS.DEMUX_ERROR, new Error('failed to get mediainfo'));\n }\n var buffer = this._context.getInstance('LOADER_BUFFER');\n var loader = this._context.getInstance('FETCH_LOADER');\n if (this.isSeekable) {\n loader.cancel();\n // 初始化点播的range\n this.state.range = {\n start: 0,\n end: buffer.historyLen - 1\n };\n setTimeout(function () {\n _this.loadNext(0);\n });\n }\n }\n }, {\n key: '_handleLoaderDataLoaded',\n value: function _handleLoaderDataLoaded() {\n this.emitTo('FLV_DEMUXER', DEMUX_EVENTS.DEMUX_START);\n }\n }, {\n key: '_handleMetadataParsed',\n value: function _handleMetadataParsed(type) {\n this.emit(REMUX_EVENTS.REMUX_METADATA, type);\n }\n }, {\n key: '_handleSEIParsed',\n value: function _handleSEIParsed(sei) {\n this._player.emit('SEI_PARSED', sei);\n }\n }, {\n key: '_handleDemuxComplete',\n value: function _handleDemuxComplete() {\n this.emit(REMUX_EVENTS.REMUX_MEDIA, 'flv');\n }\n }, {\n key: '_handleAppendInitSegment',\n value: function _handleAppendInitSegment() {\n this.state.initSegmentArrived = true;\n this.mse.addSourceBuffers();\n }\n }, {\n key: '_handleMediaSegment',\n value: function _handleMediaSegment() {\n this.mse.addSourceBuffers();\n this.mse.doAppend();\n }\n }, {\n key: '_handleNetworkError',\n value: function _handleNetworkError(tag, err) {\n this._player.emit('error', new Player.Errors('network', this._player.config.url));\n this._onError(LOADER_EVENTS.LOADER_ERROR, tag, err, true);\n }\n }, {\n key: '_handleDemuxError',\n value: function _handleDemuxError(tag, err, fatal) {\n if (fatal === undefined) {\n fatal = false;\n }\n this._player.emit('error', new Player.Errors('parse', this._player.config.url));\n this._onError(LOADER_EVENTS.LOADER_ERROR, tag, err, fatal);\n }\n }, {\n key: '_handleMseError',\n value: function _handleMseError(tag, err, fatal) {\n if (fatal === undefined) {\n fatal = false;\n }\n this._onError(MSE_EVENTS.MSE_ERROR, tag, err, fatal);\n }\n }, {\n key: '_onError',\n value: function _onError(type, mod, err, fatal) {\n var error = {\n errorType: type,\n errorDetails: '[' + mod + ']: ' + (err ? err.message : ''),\n errorFatal: fatal || false\n };\n this._player.emit(FLV_ERROR, error);\n }\n }, {\n key: 'seek',\n value: function seek(time) {\n if (!this._context.onMetaData) {\n this.loadMeta();\n return;\n }\n if (!this.isSeekable) {\n return;\n }\n\n var buffer = this._context.getInstance('LOADER_BUFFER');\n buffer.clear();\n\n var _player$config$preloa = this._player.config.preloadTime,\n preloadTime = _player$config$preloa === undefined ? 15 : _player$config$preloa;\n\n var range = this.getSeekRange(time, preloadTime);\n this.state.range = range;\n\n if (this.compat) {\n this.compat.reset();\n }\n\n this.loader.destroy();\n this._context.registry('FETCH_LOADER', FetchLoader)();\n this.loadData();\n }\n }, {\n key: 'loadNext',\n value: function loadNext(curTime) {\n if (!this._context.onMetaData) {\n return;\n }\n\n if (this.loader.loading) {\n return;\n }\n\n if (this.getNextRange(curTime)) {\n this.loadData();\n }\n }\n }, {\n key: 'loadData',\n value: function loadData() {\n var _state$range = this.state.range,\n start = _state$range.start,\n end = _state$range.end;\n\n this.emit(LOADER_EVENTS.LADER_START, this._player.config.url, {\n headers: {\n method: 'get',\n Range: 'bytes=' + start + '-' + end\n }\n });\n }\n }, {\n key: 'loadMeta',\n value: function loadMeta() {\n var _this2 = this;\n\n this.loader.load(this._player.config.url, {\n headers: {\n Range: 'bytes=0-'\n }\n }).catch(function () {\n // 在尝试获取视频数据失败时,尝试使用直播方式加载整个视频\n _this2.state.rangeSupport = false;\n _this2.loadFallback();\n });\n }\n }, {\n key: 'loadFallback',\n value: function loadFallback() {\n var _this3 = this;\n\n this.loader.load(this._player.config.url).catch(function () {\n // 在尝试获取视频数据失败时,尝试使用直播方式加载整个视频\n _this3._player.emit('error', new Player.Errors('network', _this3._player.config.url));\n });\n }\n }, {\n key: 'getSeekRange',\n value: function getSeekRange(time, preloadTime) {\n var keyframes = this._context.onMetaData.keyframes;\n\n var duration = this._context.mediaInfo.duration;\n var seekStartTime = time;\n var seekEndTime = time + preloadTime;\n\n var seekStartFilePos = FlvController.findFilePosition(seekStartTime, keyframes);\n\n if (seekEndTime >= duration || seekStartTime >= duration) {\n return {\n start: seekStartFilePos,\n end: ''\n };\n }\n var seekEndFilePos = FlvController.findFilePosition(seekEndTime, keyframes);\n\n return {\n start: seekStartFilePos,\n end: seekEndFilePos\n };\n }\n }, {\n key: 'getNextRange',\n value: function getNextRange(time) {\n if (this.state.range.end === '') {\n return;\n }\n\n var _getSeekRange = this.getSeekRange(time, this.config.preloadTime || 15),\n end = _getSeekRange.end;\n\n if (end <= this.state.range.end && end !== '') {\n return;\n }\n\n this.state.range = {\n start: this.state.range.end + 1,\n end: end\n };\n return true;\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n this.mse = null;\n this.state = {\n initSegmentArrived: false,\n range: {\n start: 0,\n end: ''\n },\n rangeSupport: true\n };\n }\n }, {\n key: 'isSeekable',\n get: function get() {\n if (!this.state.rangeSupport || !this._context) {\n return false;\n }\n\n return this._context.onMetaData.keyframes !== null && this._context.onMetaData.keyframes !== undefined;\n }\n }, {\n key: 'config',\n get: function get() {\n return this._player.config;\n }\n }, {\n key: 'loader',\n get: function get() {\n return this._context.getInstance('FETCH_LOADER');\n }\n }, {\n key: 'compat',\n get: function get() {\n return this._context.getInstance('COMPATIBILITY');\n }\n }, {\n key: 'loadBuffer',\n get: function get() {\n return this._context.getInstance('LOADER_BUFFER');\n }\n }], [{\n key: 'findFilePosition',\n value: function findFilePosition(time, keyframes) {\n for (var i = 0, len = keyframes.times.length; i < len; i++) {\n var currentKeyframeTime = keyframes.times[i];\n var nextKeyframeTime = i + 1 < len ? keyframes.times[i + 1] : Number.MAX_SAFE_INTEGER;\n\n if (currentKeyframeTime <= time && time <= nextKeyframeTime) {\n return keyframes.filepositions[i];\n }\n }\n\n return '';\n }\n }]);\n\n return FlvController;\n}();\n\nexport default FlvController;","var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport Player from 'xgplayer';\nimport { EVENTS, Context, common } from 'xgplayer-helper-utils';\nimport FLV from './flv-vod';\n\nvar debounce = common.debounce;\n\n\nvar flvAllowedEvents = EVENTS.FlvAllowedEvents;\n\nvar isEnded = function isEnded(player, flv) {\n if (!player.config.isLive) {\n if (player.duration - player.currentTime < 2) {\n var range = player.getBufferedRange();\n if (player.currentTime - range[1] < 0.1) {\n player.emit('ended');\n flv.mse.endOfStream();\n }\n }\n }\n};\n\nvar FlvVodPlayer = function (_Player) {\n _inherits(FlvVodPlayer, _Player);\n\n _createClass(FlvVodPlayer, null, [{\n key: 'isSupported',\n value: function isSupported() {\n return window.MediaSource && window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n }, {\n key: 'install',\n value: function install(name, plugin) {\n return Player.install(name, plugin);\n }\n }]);\n\n function FlvVodPlayer(config) {\n _classCallCheck(this, FlvVodPlayer);\n\n var _this = _possibleConstructorReturn(this, (FlvVodPlayer.__proto__ || Object.getPrototypeOf(FlvVodPlayer)).call(this, config));\n\n _this.initEvents();\n // const preloadTime = player.config.preloadTime || 15\n // this.started = false;\n return _this;\n }\n\n _createClass(FlvVodPlayer, [{\n key: 'start',\n value: function start() {\n if (this.started) {\n return;\n }\n if (!this.context) {\n this.context = new Context(this, this.config, flvAllowedEvents);\n }\n var flv = this.initFlv();\n flv.loadMeta();\n _get(FlvVodPlayer.prototype.__proto__ || Object.getPrototypeOf(FlvVodPlayer.prototype), 'start', this).call(this, flv.mse.url);\n this.started = true;\n }\n }, {\n key: 'initFlv',\n value: function initFlv() {\n var flv = this.context.registry('FLV_CONTROLLER', FLV)(this);\n this.context.init();\n this.flv = flv;\n this.mse = flv.mse;\n return flv;\n }\n }, {\n key: 'initFlvBackupEvents',\n value: function initFlvBackupEvents(flv, ctx) {\n var _this2 = this;\n\n flv.once(EVENTS.REMUX_EVENTS.INIT_SEGMENT, function () {\n var mediaLength = 3;\n flv.on(EVENTS.REMUX_EVENTS.MEDIA_SEGMENT, function () {\n mediaLength -= 1;\n if (mediaLength === 0) {\n // ensure switch smoothly\n _this2.flv = flv;\n _this2.mse.resetContext(ctx);\n _this2.context.destroy();\n _this2.context = ctx;\n }\n });\n });\n\n flv.once(EVENTS.LOADER_EVENTS.LOADER_ERROR, function () {\n ctx.destroy();\n });\n }\n }, {\n key: 'initEvents',\n value: function initEvents() {\n this.on('timeupdate', this.handleTimeUpdate.bind(this));\n\n this.on('seeking', this.handleSeek.bind(this));\n\n this.once('destroy', this._destroy.bind(this));\n }\n }, {\n key: 'handleTimeUpdate',\n value: function handleTimeUpdate() {\n this.loadData();\n isEnded(this, this.flv);\n }\n }, {\n key: 'handleSeek',\n value: function handleSeek() {\n var time = this.currentTime;\n var range = this.getBufferedRange();\n if (time > range[1] || time < range[0]) {\n debounce(this.flv.seek(this.currentTime), 200);\n }\n }\n }, {\n key: '_destroy',\n value: function _destroy() {\n if (this.context) {\n this.context.destroy();\n }\n this.context = null;\n this.flv = null;\n }\n }, {\n key: 'loadData',\n value: function loadData() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentTime;\n\n var range = this.getBufferedRange();\n if (range[1] - time < (this.config.preloadTime || 15) - 5) {\n this.flv.loadNext(range[1] + 1);\n }\n }\n }, {\n key: 'switchURL',\n value: function switchURL(url) {\n this.config.url = url;\n var context = new Context(this, this.config, flvAllowedEvents);\n var flv = context.registry('FLV_CONTROLLER', FLV)(this, this.mse);\n this.newContext = context;\n this.newFlv = flv;\n context.init();\n var remuxer = context.getInstance('MP4_REMUXER');\n remuxer._dtsBase = 0;\n this.initFlvBackupEvents(flv, context);\n flv.loadMeta();\n }\n }, {\n key: 'remuxer',\n get: function get() {\n return this.context.getInstance('MP4_REMUXER');\n }\n }, {\n key: 'src',\n get: function get() {\n return this.currentSrc;\n },\n set: function set(url) {\n return this.switchURL(url);\n }\n }]);\n\n return FlvVodPlayer;\n}(Player);\n\nexport default FlvVodPlayer;","/**\n * @param {number} num\n * @param {number} fixed\n * @return {number}\n */\nexport default (function (fn, wait) {\n var lastTime = Date.now();\n var timer = null;\n var isFirstTime = true;\n\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var now = Date.now();\n if (isFirstTime) {\n lastTime = Date.now();\n isFirstTime = false;\n fn.apply(undefined, args);\n }\n if (now - lastTime > wait) {\n lastTime = now;\n fn.apply(undefined, args);\n } else {\n if (timer) {\n window.clearTimeout(timer);\n }\n timer = setTimeout(function () {\n fn.apply(undefined, args);\n }, wait);\n }\n };\n});","import Player from 'xgplayer';\nimport FlvLivePlayer from 'xgplayer-flv-live';\nimport FlvVodPlayer from 'xgplayer-flv-vod'\n\nclass FlvPlayer {\n constructor (config) {\n if (config.isLive) {\n return new FlvLivePlayer(config)\n } else {\n return new FlvVodPlayer(config)\n }\n }\n\n static isSupported () {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static install (name, plugin) {\n return Player.install(name, plugin)\n }\n}\n\nexport default FlvPlayer\n"],"names":["BROWSER_EVENTS","PLAYER_EVENTS","LOADER_EVENTS","DEMUX_EVENTS","REMUX_EVENTS","MSE_EVENTS","HLS_EVENTS","ALLEVENTS","Object","assign","FlvAllowedEvents","HlsAllowedEvents","key","hasOwnProperty","push","_key","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","prototype","_classCallCheck","instance","TypeError","RemuxedBuffer","this","mimetype","init","data","bufferDuration","RemuxedBufferManager","sources","name","clear","XGDataView","buffer","ArrayBuffer","Error","dataview","DataView","position","count","loop","Math","floor","last","readByte","value","Uint8Array","byteLength","get","size","sign","res","getInt8","getUint8","getInt16","getUint16","getInt32","getUint32","_possibleConstructorReturn","self","call","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","Track","id","sequenceNumber","samples","droppedSamples","reset","AudioTrack","_Track","_this","getPrototypeOf","TAG","type","VideoTrack","_Track2","_this2","dropped","Tracks","audioTrack","videoTrack","XgBuffer","historyLen","array","offset","undefined","_shiftBuffer","_ret","slice","shift","_ret2","ret","tmpoff","tmp","set","templength","start","retInt","AudioTrackMeta","meta","_default","VideoTrackMeta","sps","pps","AudioSample","info","getDefault","VideoSample","isObjectFilled","obj","MediaInfo","mimeType","duration","hasVideo","video","hasAudio","audio","isBaseInfoReady","isVideoReady","isAudioReady","mediaInfo","FlvTag","filtered","tagType","datasize","dts","has","prefix","Events","EE","fn","context","once","addListener","emitter","event","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","eventNames","events","names","getOwnPropertySymbols","concat","listeners","handlers","l","ee","Array","listenerCount","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","on","removeAllListeners","off","prefixed","_get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","parent","getter","DIRECT_EMIT_FLAG","Context","player","configs","allowedEvents","_emitter","_instanceMap","_clsMap","_inited","_configs","_player","_hooks","tag","_len","a","b","c","d","newInstance","config","initInstance","cls","checkMessageName","_isMessageNameValid","bind","enhanced","_cls","onceListeners","_context","messageName","callback","beforeList","_len2","_key2","_len3","_key3","hasOwn","callbacks","_messageName","_callbacks","_i","_callback","removeListeners","v","_len4","_key4","time","EVENTS","SEEK","_this3","keys","forEach","destroy","destroyInstances","indexOf","buf","MSE","container","format","mediaSource","sourceBuffers","preloadTime","onSourceOpen","onTimeUpdate","onUpdateEnd","onWaiting","opened","MediaSource","addEventListener","_url","newCtx","keepBuffer","updating","clearBuffer","addSourceBuffers","SOURCE_UPDATE_END","doAppend","readyState","getInstance","tracks","track","add","k","_k","_type","source","mime","sourceBuffer","addSourceBuffer","e","code","MSE_WRONG_TRACK_ADD","MSE_ERROR","message","sourceBufferLen","_doCleanupSourceBuffer","inited","appendBuffer","unshift","endOfStream","end","remove","currentTime","_pendingRemoveRanges","buffered","doRemove","removeEnd","_doRemoveRanges","sb","ranges","range","taskList","_loop","task","Promise","resolve","doCleanBuffer","retryTime","clean","removeEventListener","all","_loop2","removeBuffers","then","_buffer","removeSourceBuffer","URL","revokeObjectURL","url","noaudio","novideo","val","window","createObjectURL","bEnd","le","setInt16","Int16Array","sniffer","r","os","isPc","isTablet","ua","navigator","userAgent","toLowerCase","reg","filter","test","isWindowsPhone","isSymbian","isAndroid","isFireFox","isPhone","Speed","_firstCheckpoint","_lastCheckpoint","_intervalBytes","_lastSamplingBytes","_now","Date","now","bytes","addBytes","durationSeconds","currentKBps","_typeof","Symbol","_typeof2","iterator","FetchLoader","status","error","_reader","_canceled","_destroyed","readtype","_loaderTaskNo","_ttfb","_speed","AbortController","abortControllerEnabled","LADER_START","load","_fetch","fetch","_x","_x2","_x3","toString","params","timeout","timer","abortController","signal","getTime","race","reject","setTimeout","abort","response","LOADER_TTFB","retryTimes","totalRetry","delayTime","loadTimeout","loading","LOADER_RESPONSE_HEADERS","headers","ok","_onFetchResponse","_retryTimer","LOADER_RETRY","internalLoad","LOADER_ERROR","statusText","catch","opts","_ref","retryCount","retryDelay","getParams","_this4","taskno","json","LOADER_COMPLETE","text","arrayBuffer","_onReader","body","getReader","reader","_this5","cancel","_noDataTimer","read","done","LOADER_DATALOADED","options","Headers","configHeaders","append","optHeaders","cors","mode","withCredentials","credentials","lastSamplingKBps","DevLogger","matched","exec","document","cookie","_status","_level","funName","arg1","arg2","arg3","arg4","arg5","arg6","arg7","arg8","arg9","arg10","_console","tagName","x","console","arr","isArray","arr2","from","_toConsumableArray","AAC","codec","channelCount","Golomb","uint8array","_bufferIndex","_totalBytes","_totalBits","_currentWord","_currentWordBitsLeft","bufferBytesLeft","bytesRead","min","word","subarray","bits","valu","_fillCurrentWord","readBits","zeroCount","_skipLeadingZero","leadingZeros","readUEG","SPSParser","src","srcLength","dst","dstIdx","rbsp","_ebsp2rbsp","gb","profileIdc","levelIdc","profile_string","getProfileString","level_string","getLevelString","chroma_format_idc","chroma_format","bit_depth","readBool","scaling_list_count","_skipScalingList","pic_order_cnt_type","readSEG","num_ref_frames_in_pic_order_cnt_cycle","pic_width_in_mbs_minus1","pic_height_in_map_units_minus1","frame_mbs_only_flag","frame_crop_left_offset","frame_crop_right_offset","frame_crop_top_offset","frame_crop_bottom_offset","par_width","par_height","fps","fps_fixed","fps_num","fps_den","aspect_ratio_idc","num_units_in_tick","time_scale","parScale","crop_unit_x","crop_unit_y","codec_width","codec_height","present_width","ceil","getChromaFormatString","lastScale","nextScale","toFixed","chroma","spsConfig","codec_size","codecWidth","width","codecHeight","height","presentWidth","present_size","presentHeight","profile","level","bitDepth","chromaFormat","parRatio","par_ratio","frameRate","frame_rate","fpsDen","fpsNum","refSampleDuration","timescale","RBSP","el","idx","lastByte","u8aToString","result","String","fromCharCode","SEIParser","EBSP2SODB","EBSP2RBSP","sodb","_resolveNalu","_SEIParser$switchPayl","switchPayloadType","payloadType","content","user_data_unregistered","dv","payloadLength","_SEIParser$getPayload","getPayloadLength","payload","Nalunit","getAnnexbNals","getAvccNals","nals","getHeaderPositionAnnexB","pos","header","headerLength","skip","unit","analyseNal","ndr","idr","sei","parse","SpsParser","parseSPS","bufferLen","maxSubLayersMinus1","chromaFormatIdc","conformanceWindowFlag","bitDepthLumaMinus8","bitDepthChromaMinus8","profileTierLevel","separate_colour_plane_flag","conf_win_left_offset","conf_win_right_offset","conf_win_top_offset","conf_win_bottom_offset","sub_width_c","sub_height_c","_readProfileTierLevel","general_profile_space","general_tier_flag","general_profile_idc","general_level_idc","subLayerProfilePresentFlag","subLayerLevelPresentFlag","getHvccNals","slice_trail_n","slice_trail_r","slice_tsa_n","slice_tsa_r","slice_stsa_n","slice_stsa_r","slice_radl_n","slice_radl_r","slice_rasl_n","slice_rasl_r","slice_bla_w_lp","slice_bla_w_radl","slice_bla_n_lp","slice_idl_w_radl","slice_idr_n_lp","slice_cra_nut","vps","aud","eob","fd","Compatibility","nextAudioDts","nextVideoDts","lastAudioSamplesLen","lastVideoSamplesLen","lastVideoDts","lastAudioDts","allAudioSamplesCount","allVideoSamplesCount","_firstAudioSample","_firstVideoSample","filledAudioSamples","filledVideoSamples","videoLastSample","audioLastSample","___videoLargeGap","DETECT_LARGE_GAP","___audioLargeGap","audioUnsyncTime","before","REMUX_MEDIA","doFix","lastVideoDuration","_audioLargeGap","_videoLargeGap","_getFirstSample","getFirstSample","isFirstAudioSamples","isFirstVideoSamples","recordSamplesCount","fixVideoRefSampleDuration","_Compatibility$detect","detectChangeStream","videoChanged","changed","videoChangedIdxes","changedIdxes","disContinue","fixChangeStreamVideo","doFixVideo","_Compatibility$detect2","audioChanged","audioChangedIdxes","_disContinue","fixChangeStreamAudio","doFixAudio","removeInvalidSamples","first","streamChangeStart","_videoTrack","videoSamples","sample","originDts","originPts","pts","firstSample","log","detectVideoLargeGap","doFixLargeGap","preVideoGap","DETECT_CHANGE_STREAM_DISCONTINUE","prevDts","curDts","videoFirstDts","gap","fillCount","_i2","clonedFirstSample","cts","abs","curLastSample","pop","_audioTrack","audioSamples","fixAudioRefSampleDuration","samplesLen","silentFrame","getSilentFrame","iRefSampleDuration","_firstSample","audioDtsBase","detectAudioLargeGap","preAudioGap","lastAudioOriginDts","isContinue","videoFirstPts","_gap","silentSampleCount","_i3","silentSample","firstDts","absGap","silentFrameCount","_i4","computed","_silentSample","DETECT_AUDIO_GAP","DETECT_AUDIO_OVERLAP","nextDts","_i5","_sample","delta","warn","splice","missingCount","round","_silentSample2","unSyncDuration","_lastSample","lastSample","lastDuration","sortAudioSamples","changeIdx","_videoTrack2","preDuration","getStreamChangeStart","DETECT_CHANGE_STREAM","firstPartSamples","secondPartSamples","changeSample","videoDtsBase","_audioTrack2","cacheNextAudioDts","findFirstVideoSample","findFirstAudioSample","allSamplesCount","filledSamplesCount","isRefSampleDurationValid","durationAvg","_fixed","lastDts","fixed","sampleRate","firstAudioSample","firstVideoSample","index","dtsBase","Infinity","remuxer","_dtsBase","_audioDtsBase","_videoDtsBase","sort","Number","isNaN","sorted","isKeyframe","firstSampleDts","isFirst","UTF8","out","input","_checkContinuation","ucs4","_ucs","_ucs2","join","checkLength","isLe","Sniffer","DATA_TYPES","AMFParser","readOffset","metaData","parseValue","bodySize","resetStatus","strLen","str","decode","ts","getFloat64","parseString","isObjEnd","NUMBER","BOOLEAN","STRING","OBJECT","MIX_ARRAY","OBJECT_END","STRICT_ARRAY","DATE","LONE_STRING","dataView","objEndSize","amfObj","parseObject","isObjectEnd","_objEndSize","amfVar","arrLength","script","date","parseDate","longStr","parseLongString","avc","NalUnit","SpsParserHEVC","hevc","NalUnitHEVC","FlvDemuxer","_EventEmitter","headerParsed","trackNum","hasScript","_videoMetaChange","_audioMetaChange","gopId","onMetaData","flvTag","loopMax","_parseFlvTag","parseFlvHeader","demux","isFlvFile","FILE_HEADER_PARSED","tagSize","toInt","_parseFlvTagHeader","_processTagData","_datasizeValidator","timestamp","timestampExt","_parseScriptData","_parseAudioTag","_parseVideoData","SCRIPT_TAG_PARSED","objectType","originObjectType","sampleRateIndex","audiosamplerate","_switchAudioSampleRate","frameLength","dependsOnCoreCoder","extensionFlagIndex","extensionSamplingIndex","samplingIndex","_switchAudioSamplingFrequency","frameLenth","audioSampleRate","audioSampleRateIndex","aacHeader","_aacSequenceHeaderParser","AUDIO_META_PARSED","AUDIO_SAMPLE_PARSED","vSample","frameType","codecID","avcPacketType","_hevc","avcclength","videoMeta","_hevcSequenceHeaderParser","_avcSequenceHeaderParser","VIDEO_META_PARSED","keyTypes","VIDEO_SEI_PARSED","firstInGop","VIDEO_SAMPLE_PARSED","configurationVersion","avcProfileIndication","profileCompatibility","avcLevelIndication","nalUnitLength","numOfSps","codecString","_j","h","numOfPps","_size","_j2","toVideoMeta","avcc","streamType","hevcProfileSpace","hevcTierFlag","hevcProfileIdc","hevcProfileCompatibilityFlags","hevcConstraintIndicatorFlags","hevcLevelIdc","minSpatialSegmentationIdc","parallelismType","avgFrameRate","constantFrameRate","numTemporalLayers","temporalIdNested","lengthSizeMinusOne","numOfArrays","nalUnitType","numNalus","nalUnitSize","hasVPS","hasSPS","hasPPS","rawVps","rawSps","rawPps","samplingFrequencyIndex","datasizeConfirm","streamFlag","INTERNAL_EVENTS","Demuxer","_firstFragmentLoaded","_trackNum","_hasScript","_hasVideoSequence","_hasAudioSequence","demuxer","DEMUX_START","handleFileHeaderParsed","handleScriptTagParsed","handleAudioMetaParsed","handleVideoMetaParsed","handleVideoSampleParsed","handleAudioSampleParsed","handleSeiParsed","AUDIO_METADATA_CHANGE","METADATA_PARSED","VIDEO_METADATA_CHANGE","seiObj","SEI_PARSED","ISKEYFRAME","hsaAudio","MEDIA_INFO","hasSpecificConfig","audiochannels","_meta","framerate","initVideoTrack","initAudioTrack","loaderBuffer","DEMUX_COMPLETE","DEMUX_ERROR","exports","ResultConstructor","totalLength","arrays","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","next","err","return","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_arr","_concat2","_concat","__esModule","default","module","Buffer","item","Concat","temp","num","padStart","parseInt","Fmp4","writeUint32","write","version","flag","initBox","mvhd","trak","videoTrak","audioTrak","mvex","tkhd","mdia","mediaTime","mdhd","hdlr","minf","extension","vmhd","smhd","dinf","stbl","stsd","stts","stsc","stsz","stco","mp4a","hvc1","avc1","samplerate","esds","configlen","hSpacing","vSpacing","btrt","pasp","trackID","mehd","trex","mfhd","traf","sequence","tfhd","tfdt","sdtp","trun","sdtpLength","sampleCount","flags","isLeading","dependsOn","isDependedOn","hasRedundancy","isNonSync","mdatBox","charCodeAt","Mp4Remuxer","audioMeta","curTime","_videoMeta","_audioMeta","_isDtsBaseInited","isFirstVideo","isFirstAudio","videoAllDuration","audioAllDuration","audioRemuxed","videoRemuxed","mp4Durations","calcDtsBase","remuxVideo","remuxAudio","groupEnd","initSegment","ftyp","ftypHEVC","moov","_start","audioBase","videoBase","_firstSample2","mp4Samples","maxLoop","avcSample","remuxInitSegment","max","mdatSample","sampleDuration","logger","long","RANDOM_ACCESS_POINT","moofMdat","moof","mdat","segmentRemuxed","TRACK_REMUXED","isFirstDtsInited","refSampleDurationFixed","mp4Sample","MEDIA_SEGMENT","_curTime","initRemuxer","remux","REMUX_METADATA","onMetaDataReady","resetDtsBase","DETECT_FRAG_ID_DISCONTINUE","seek","Remuxer","writeToSource","onTrackRemuxed","_context$getInstance","presourcebuffer","getSource","createSource","INIT_SEGMENT","Tag","Logger","FlvController","mse","state","bufferClearTimer","_handleTimeUpdate","Mse","initComponents","initListeners","registry","compatibility","_handleLoaderDataLoaded","_handleNetworkError","_handleFetchRetry","_handleMediaInfo","_handleMetadataParsed","_handleDemuxComplete","_handleDemuxError","_handleSEIParsed","_handleAppendInitSegment","_handleMediaSegment","_handleAddRAP","REMUX_ERROR","_handleRemuxError","_handleSourceUpdateEnd","_handleMseError","emitTo","fatal","_onError","initSegmentArrived","bufferEnd","paused","bufferStart","randomAccessPoints","rap","mod","loadData","retry","times","delay","loader","flvAllowedEvents","FlvPlayer","_Player","defaultConfig","initEvents","loaderCompleteTimer","hasPlayed","isTypeSupported","plugin","Player","install","started","initFlv","flv","util","addClass","root","restTime","getBufferedRange","ctx","mediaLength","resetContext","FLV","initFlvEvents","cleanBuffers","pause","_this6","prom","_destroy","_this7","newContext","work","newFlv","seamless","initFlvBackupEvents","currentSrc","switchURL","_player$config","handleMediaInfo","analyzed","nalsLength","_isHEVC","getNalunits","reduce","current","newData","nal","onDemuxComplete","hidden","visible","play","_setMetaToAudio","_setMetaToVideo","setAudioMeta","setVideoMeta","Errors","detail","handleErr","mediaType","videoConfig","preloadtime","playerInited","initPlayer","wasmSupported","isComponentDefined","customElements","define","style","outline","setInterval","handleEnded","clearInterval","_hasStart","addLiveFlag","isDelDOM","removeChild","findDom","live","createDom","controls","appendChild","FlvLivePlayer","FlvLiveMobilePlayer","isSupported","useWASM","FlvLiveMsePlayer","isSeekable","loadNext","_player$config$preloa","getSeekRange","compat","loadMeta","getNextRange","_state$range","rangeSupport","loadFallback","keyframes","seekStartTime","seekEndTime","seekStartFilePos","findFilePosition","currentKeyframeTime","nextKeyframeTime","MAX_SAFE_INTEGER","filepositions","debounce","wait","lastTime","isFirstTime","clearTimeout","FlvVodPlayer","handleTimeUpdate","handleSeek","isLive"],"mappings":"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"}