@volcengine/veplayer-plugin 2.4.5-rc.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/esm/index.development.js +2267 -578
  2. package/esm/index.production.js +3 -3
  3. package/esm/veplayer.plugin.abr.development.js +71 -3
  4. package/esm/veplayer.plugin.abr.production.js +1 -1
  5. package/esm/veplayer.plugin.drm.development.js +71 -3
  6. package/esm/veplayer.plugin.drm.production.js +1 -1
  7. package/esm/veplayer.plugin.flv.development.js +729 -196
  8. package/esm/veplayer.plugin.flv.production.js +1 -1
  9. package/esm/veplayer.plugin.hls.development.js +1505 -378
  10. package/esm/veplayer.plugin.hls.production.js +1 -1
  11. package/esm/veplayer.plugin.mp4.development.js +73 -5
  12. package/esm/veplayer.plugin.mp4.production.js +1 -1
  13. package/esm/veplayer.plugin.rtm.development.js +213 -48
  14. package/esm/veplayer.plugin.rtm.production.js +1 -1
  15. package/esm/veplayer.plugin.shaka.development.js +72 -4
  16. package/esm/veplayer.plugin.shaka.production.js +1 -1
  17. package/package.json +1 -1
  18. package/umd/veplayer.plugin.abr.development.js +71 -3
  19. package/umd/veplayer.plugin.abr.production.js +1 -1
  20. package/umd/veplayer.plugin.drm.development.js +71 -3
  21. package/umd/veplayer.plugin.drm.production.js +1 -1
  22. package/umd/veplayer.plugin.flv.development.js +729 -196
  23. package/umd/veplayer.plugin.flv.production.js +1 -1
  24. package/umd/veplayer.plugin.hls.development.js +1472 -345
  25. package/umd/veplayer.plugin.hls.production.js +1 -1
  26. package/umd/veplayer.plugin.mp4.development.js +73 -5
  27. package/umd/veplayer.plugin.mp4.production.js +1 -1
  28. package/umd/veplayer.plugin.rtm.development.js +213 -48
  29. package/umd/veplayer.plugin.rtm.production.js +1 -1
  30. package/umd/veplayer.plugin.shaka.development.js +72 -4
  31. package/umd/veplayer.plugin.shaka.production.js +1 -1
@@ -1538,7 +1538,7 @@ util.getCurrentTimeByOffset = function(offsetTime, segments) {
1538
1538
  }
1539
1539
  return offsetTime;
1540
1540
  };
1541
- var version = "3.0.19-rc.0";
1541
+ var version = "3.0.21-rc.2";
1542
1542
  var ERROR_MAP = {
1543
1543
  1: 5101,
1544
1544
  2: 5102,
@@ -1646,8 +1646,7 @@ function hook(hookName, handler) {
1646
1646
  }
1647
1647
  if (this.__hooks && this.__hooks[hookName]) {
1648
1648
  try {
1649
- var _this$__hooks$hookNam;
1650
- var preRet = (_this$__hooks$hookNam = this.__hooks[hookName]).call.apply(_this$__hooks$hookNam, [this, this].concat(Array.prototype.slice.call(arguments)));
1649
+ var preRet = runHooks(this, hookName, handler);
1651
1650
  if (preRet) {
1652
1651
  if (preRet.then) {
1653
1652
  preRet.then(function(isContinue) {
@@ -1672,6 +1671,19 @@ function hook(hookName, handler) {
1672
1671
  }
1673
1672
  }.bind(this);
1674
1673
  }
1674
+ function findHookIndex(hookName, handler) {
1675
+ var __hooks = this.__hooks;
1676
+ if (!__hooks || !Array.isArray(__hooks[hookName])) {
1677
+ return -1;
1678
+ }
1679
+ var hookHandlers = __hooks[hookName];
1680
+ for (var i = 0; i < hookHandlers.length; i++) {
1681
+ if (hookHandlers[i] === handler) {
1682
+ return i;
1683
+ }
1684
+ }
1685
+ return -1;
1686
+ }
1675
1687
  function useHooks(hookName, handler) {
1676
1688
  var __hooks = this.__hooks;
1677
1689
  if (!__hooks) {
@@ -1681,7 +1693,12 @@ function useHooks(hookName, handler) {
1681
1693
  console.warn("has no supported hook which name [".concat(hookName, "]"));
1682
1694
  return false;
1683
1695
  }
1684
- __hooks && (__hooks[hookName] = handler);
1696
+ if (!Array.isArray(__hooks[hookName])) {
1697
+ __hooks[hookName] = [];
1698
+ }
1699
+ if (findHookIndex.call(this, hookName, handler) === -1) {
1700
+ __hooks[hookName].push(handler);
1701
+ }
1685
1702
  return true;
1686
1703
  }
1687
1704
  function removeHooks(hookName, handler) {
@@ -1689,6 +1706,13 @@ function removeHooks(hookName, handler) {
1689
1706
  if (!__hooks) {
1690
1707
  return;
1691
1708
  }
1709
+ if (Array.isArray(__hooks[hookName])) {
1710
+ var hooks = __hooks[hookName];
1711
+ var index = findHookIndex.call(this, hookName, handler);
1712
+ if (index !== -1) {
1713
+ hooks.splice(index, 1);
1714
+ }
1715
+ }
1692
1716
  delete __hooks[hookName];
1693
1717
  }
1694
1718
  function hooksDescriptor(instance) {
@@ -1710,6 +1734,38 @@ function hooksDescriptor(instance) {
1710
1734
  function delHooksDescriptor(instance) {
1711
1735
  instance.__hooks = null;
1712
1736
  }
1737
+ function runHooks(obj, hookName, handler) {
1738
+ for (var _len5 = arguments.length, args = new Array(_len5 > 3 ? _len5 - 3 : 0), _key5 = 3; _key5 < _len5; _key5++) {
1739
+ args[_key5 - 3] = arguments[_key5];
1740
+ }
1741
+ if (obj.__hooks && Array.isArray(obj.__hooks[hookName])) {
1742
+ var hooks = obj.__hooks[hookName];
1743
+ var index = -1;
1744
+ var runHooksRecursive = function runHooksRecursive2(obj2, hookName2, handler2) {
1745
+ for (var _len6 = arguments.length, args2 = new Array(_len6 > 3 ? _len6 - 3 : 0), _key6 = 3; _key6 < _len6; _key6++) {
1746
+ args2[_key6 - 3] = arguments[_key6];
1747
+ }
1748
+ index++;
1749
+ if (hooks.length === 0 || index === hooks.length) {
1750
+ return handler2.call.apply(handler2, [obj2, obj2].concat(args2));
1751
+ }
1752
+ var hook2 = hooks[index];
1753
+ var ret = hook2.call.apply(hook2, [obj2, obj2].concat(args2));
1754
+ if (ret && ret.then) {
1755
+ return ret.then(function(data) {
1756
+ return data === false ? null : runHooksRecursive2.apply(void 0, [obj2, hookName2, handler2].concat(args2));
1757
+ }).catch(function(e) {
1758
+ console.warn("[runHooks]".concat(hookName2, " reject"), e.message);
1759
+ });
1760
+ } else if (ret !== false) {
1761
+ return runHooksRecursive2.apply(void 0, [obj2, hookName2, handler2].concat(args2));
1762
+ }
1763
+ };
1764
+ return runHooksRecursive.apply(void 0, [obj, hookName, handler].concat(args));
1765
+ } else {
1766
+ return handler.call.apply(handler, [obj, obj].concat(args));
1767
+ }
1768
+ }
1713
1769
  function showErrorMsg(pluginName, msg) {
1714
1770
  XG_DEBUG.logError("[".concat(pluginName, "] event or callback cant be undefined or null when call ").concat(msg));
1715
1771
  }
@@ -1949,6 +2005,18 @@ var BasePlugin = /* @__PURE__ */ function() {
1949
2005
  }
1950
2006
  }
1951
2007
  }
2008
+ }, {
2009
+ key: "defineMethod",
2010
+ value: function defineMethod(Obj, map) {
2011
+ for (var key in map) {
2012
+ if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === "function") {
2013
+ Object.defineProperty(Obj, key, {
2014
+ configurable: true,
2015
+ value: map[key]
2016
+ });
2017
+ }
2018
+ }
2019
+ }
1952
2020
  }, {
1953
2021
  key: "defaultConfig",
1954
2022
  get: function get() {
@@ -2759,6 +2827,21 @@ var Buffer$1 = /* @__PURE__ */ function() {
2759
2827
  length: Buffer2.totalLength && Buffer2.totalLength(buffers)
2760
2828
  };
2761
2829
  }
2830
+ }, {
2831
+ key: "isBuffered",
2832
+ value: function isBuffered(media, pos) {
2833
+ if (media) {
2834
+ var buffered = Buffer2.get(media);
2835
+ if (buffered !== null && buffered !== void 0 && buffered.length) {
2836
+ for (var i = 0; i < buffered.length; i++) {
2837
+ if (pos >= buffered.start(i) && pos <= buffered.end(i)) {
2838
+ return true;
2839
+ }
2840
+ }
2841
+ }
2842
+ }
2843
+ return false;
2844
+ }
2762
2845
  }]);
2763
2846
  return Buffer2;
2764
2847
  }();
@@ -2911,7 +2994,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2911
2994
  this.logCache.apply(this, [LogCacheLevel.DEBUG].concat(args));
2912
2995
  if (Logger2.disabled)
2913
2996
  return;
2914
- (_console = console).debug.apply(_console, [this._prefix, nowTime$1()].concat(args));
2997
+ (_console = console).debug.apply(_console, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2915
2998
  }
2916
2999
  }, {
2917
3000
  key: "log",
@@ -2923,7 +3006,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2923
3006
  this.logCache.apply(this, [LogCacheLevel.LOG].concat(args));
2924
3007
  if (Logger2.disabled)
2925
3008
  return;
2926
- (_console2 = console).log.apply(_console2, [this._prefix, nowTime$1()].concat(args));
3009
+ (_console2 = console).log.apply(_console2, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2927
3010
  }
2928
3011
  }, {
2929
3012
  key: "warn",
@@ -2935,7 +3018,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2935
3018
  this.logCache.apply(this, [LogCacheLevel.WARN].concat(args));
2936
3019
  if (Logger2.disabled)
2937
3020
  return;
2938
- (_console3 = console).warn.apply(_console3, [this._prefix, nowTime$1()].concat(args));
3021
+ (_console3 = console).warn.apply(_console3, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2939
3022
  }
2940
3023
  }, {
2941
3024
  key: "error",
@@ -2947,7 +3030,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2947
3030
  this.logCache.apply(this, [LogCacheLevel.ERROR].concat(args));
2948
3031
  if (Logger2.disabled)
2949
3032
  return;
2950
- (_console4 = console).error.apply(_console4, [this._prefix, nowTime$1()].concat(args));
3033
+ (_console4 = console).error.apply(_console4, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2951
3034
  }
2952
3035
  }, {
2953
3036
  key: "logCache",
@@ -2962,7 +3045,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2962
3045
  var finLogText = logText.map(function(item) {
2963
3046
  return logable(item);
2964
3047
  });
2965
- text = this._prefix + nowTime$1() + JSON.stringify(finLogText);
3048
+ text = "[".concat(nowTime$1(), "]") + this._prefix + JSON.stringify(finLogText);
2966
3049
  } catch (e) {
2967
3050
  return;
2968
3051
  }
@@ -3878,8 +3961,8 @@ function createResponse(data, done, response, contentLength, age, startTime, fir
3878
3961
  response
3879
3962
  };
3880
3963
  }
3881
- function calculateSpeed(byteLen, millisec) {
3882
- return Math.round(byteLen * 8 * 1e3 / millisec / 1024);
3964
+ function calculateSpeed(byteLen, milliSecond) {
3965
+ return Math.round(byteLen * 8 * 1e3 / milliSecond / 1024);
3883
3966
  }
3884
3967
  var EVENT = {
3885
3968
  ERROR: "error",
@@ -3891,6 +3974,7 @@ var EVENT = {
3891
3974
  SOURCEBUFFER_CREATED: "core.sourcebuffercreated",
3892
3975
  MEDIASOURCE_OPENED: "core.mediasourceopened",
3893
3976
  ANALYZE_DURATION_EXCEEDED: "core.analyzedurationexceeded",
3977
+ APPEND_BUFFER: "core.appendbuffer",
3894
3978
  REMOVE_BUFFER: "core.removebuffer",
3895
3979
  BUFFEREOS: "core.buffereos",
3896
3980
  KEYFRAME: "core.keyframe",
@@ -5523,13 +5607,16 @@ var TrackType = {
5523
5607
  METADATA: "metadata"
5524
5608
  };
5525
5609
  var VideoCodecType = {
5610
+ AV1: "av1",
5526
5611
  AVC: "avc",
5527
5612
  HEVC: "hevc"
5528
5613
  };
5529
5614
  var AudioCodecType = {
5530
5615
  AAC: "aac",
5531
5616
  G711PCMA: "g7110a",
5532
- G711PCMU: "g7110m"
5617
+ G711PCMU: "g7110m",
5618
+ OPUS: "opus",
5619
+ MP3: "mp3"
5533
5620
  };
5534
5621
  var WarningType = {
5535
5622
  LARGE_AV_SHIFT: "LARGE_AV_SHIFT",
@@ -5569,6 +5656,7 @@ var VideoTrack = /* @__PURE__ */ function() {
5569
5656
  _defineProperty(this, "isVideoEncryption", false);
5570
5657
  _defineProperty(this, "isAudioEncryption", false);
5571
5658
  _defineProperty(this, "isVideo", true);
5659
+ _defineProperty(this, "lastKeyFrameDts", 0);
5572
5660
  _defineProperty(this, "kid", null);
5573
5661
  _defineProperty(this, "pssh", null);
5574
5662
  _defineProperty(this, "ext", void 0);
@@ -5611,6 +5699,9 @@ var VideoTrack = /* @__PURE__ */ function() {
5611
5699
  }, {
5612
5700
  key: "exist",
5613
5701
  value: function exist() {
5702
+ if (/av01/.test(this.codec)) {
5703
+ return true;
5704
+ }
5614
5705
  return !!(this.pps.length && this.sps.length && this.codec);
5615
5706
  }
5616
5707
  }, {
@@ -5634,6 +5725,7 @@ var AudioTrack = /* @__PURE__ */ function() {
5634
5725
  _defineProperty(this, "codecType", AudioCodecType.AAC);
5635
5726
  _defineProperty(this, "pid", -1);
5636
5727
  _defineProperty(this, "codec", "");
5728
+ _defineProperty(this, "container", "");
5637
5729
  _defineProperty(this, "sequenceNumber", 0);
5638
5730
  _defineProperty(this, "sampleDuration", 0);
5639
5731
  _defineProperty(this, "timescale", 0);
@@ -5674,7 +5766,7 @@ var AudioTrack = /* @__PURE__ */ function() {
5674
5766
  }, {
5675
5767
  key: "exist",
5676
5768
  value: function exist() {
5677
- return !!(this.sampleRate && this.channelCount && this.codec && this.codecType === AudioCodecType.AAC);
5769
+ return !!(this.sampleRate && this.channelCount && (this.codec || this.container) && (this.codecType === AudioCodecType.AAC || this.codecType === AudioCodecType.G711PCMA || this.codecType === AudioCodecType.G711PCMU || this.codecType === AudioCodecType.OPUS || this.codecType === AudioCodecType.MP3));
5678
5770
  }
5679
5771
  }, {
5680
5772
  key: "hasSample",
@@ -5888,7 +5980,7 @@ var AAC = /* @__PURE__ */ function() {
5888
5980
  continue;
5889
5981
  }
5890
5982
  frameLength = (data[i + 3] & 3) << 11 | data[i + 4] << 3 | (data[i + 5] & 224) >> 5;
5891
- if (len - i < frameLength)
5983
+ if (!frameLength || len - i < frameLength)
5892
5984
  break;
5893
5985
  protectionSkipBytes = (~data[i + 1] & 1) * 2;
5894
5986
  frames.push({
@@ -6022,14 +6114,57 @@ var AAC = /* @__PURE__ */ function() {
6022
6114
  return AAC2;
6023
6115
  }();
6024
6116
  _defineProperty(AAC, "FREQ", [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350]);
6117
+ var OPUS = /* @__PURE__ */ function() {
6118
+ function OPUS2() {
6119
+ _classCallCheck$1(this, OPUS2);
6120
+ }
6121
+ _createClass$1(OPUS2, null, [{
6122
+ key: "getFrameDuration",
6123
+ value: function getFrameDuration(samples) {
6124
+ return 20;
6125
+ }
6126
+ }, {
6127
+ key: "parseHeaderPackets",
6128
+ value: function parseHeaderPackets(data) {
6129
+ if (!data.length)
6130
+ return;
6131
+ var dv = new DataView(data.buffer, data.byteOffset, data.byteLength);
6132
+ var magicSignature = "";
6133
+ for (var i = 0; i < 8; i++) {
6134
+ magicSignature += String.fromCodePoint(data[i]);
6135
+ }
6136
+ if (magicSignature !== "OpusHead") {
6137
+ throw new Error("Invalid Opus MagicSignature");
6138
+ }
6139
+ var channelCount = data[9];
6140
+ console.log("Pre-skip", data[10], data[11]);
6141
+ var sampleRate = dv.getUint32(12, true);
6142
+ var outputGain = dv.getInt16(16, true);
6143
+ if (!sampleRate)
6144
+ return;
6145
+ var codec = "opus";
6146
+ var originCodec = "opus";
6147
+ var config = new Uint8Array(data.buffer, data.byteOffset + 8, data.byteLength - 8);
6148
+ return {
6149
+ outputGain,
6150
+ sampleRate,
6151
+ channelCount,
6152
+ config,
6153
+ codec,
6154
+ originCodec
6155
+ };
6156
+ }
6157
+ }]);
6158
+ return OPUS2;
6159
+ }();
6025
6160
  var LARGE_AV_FIRST_FRAME_GAP = 500;
6026
6161
  var AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3;
6027
6162
  var MAX_SILENT_FRAME_DURATION = 1e3;
6028
- var AUDIO_EXCETION_LOG_EMIT_DURATION = 5e3;
6163
+ var AUDIO_EXCEPTION_LOG_EMIT_DURATION = 5e3;
6029
6164
  var MAX_VIDEO_FRAME_DURATION = 1e3;
6030
6165
  var MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200;
6031
- var VIDEO_EXCETION_LOG_EMIT_DURATION = 5e3;
6032
- var TRACK_BREACKED_CHECK_TIME = 5;
6166
+ var VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5e3;
6167
+ var TRACK_BROKEN_CHECK_TIME = 5;
6033
6168
  var FlvFixer = /* @__PURE__ */ function() {
6034
6169
  function FlvFixer2(videoTrack, audioTrack, metadataTrack) {
6035
6170
  _classCallCheck$1(this, FlvFixer2);
@@ -6145,7 +6280,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6145
6280
  var firstSample = samples[0];
6146
6281
  var vDelta = this._videoNextDts - firstSample.dts;
6147
6282
  if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {
6148
- if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {
6283
+ if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {
6149
6284
  var _samples$;
6150
6285
  this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts;
6151
6286
  videoTrack.warnings.push({
@@ -6156,7 +6291,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6156
6291
  sampleDuration: vDelta
6157
6292
  });
6158
6293
  }
6159
- if (this._videoTimestampBreak >= TRACK_BREACKED_CHECK_TIME) {
6294
+ if (this._videoTimestampBreak >= TRACK_BROKEN_CHECK_TIME) {
6160
6295
  this._videoNextDts = firstSample.dts;
6161
6296
  this._videoTimestampBreak = 0;
6162
6297
  } else {
@@ -6179,7 +6314,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6179
6314
  }
6180
6315
  if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {
6181
6316
  this._videoTimestampBreak++;
6182
- if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {
6317
+ if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {
6183
6318
  this._lastVideoExceptionLargeGapDot = dts;
6184
6319
  videoTrack.warnings.push({
6185
6320
  type: WarningType.LARGE_VIDEO_GAP,
@@ -6260,10 +6395,27 @@ var FlvFixer = /* @__PURE__ */ function() {
6260
6395
  key: "_doFixAudioInternal",
6261
6396
  value: function _doFixAudioInternal(audioTrack, samples, timescale) {
6262
6397
  if (!audioTrack.sampleDuration) {
6263
- audioTrack.sampleDuration = audioTrack.codecType === AudioCodecType.AAC ? AAC.getFrameDuration(audioTrack.timescale, timescale) : this._getG711Duration(audioTrack);
6398
+ switch (audioTrack.codecType) {
6399
+ case AudioCodecType.AAC: {
6400
+ audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale);
6401
+ break;
6402
+ }
6403
+ case AudioCodecType.OPUS: {
6404
+ audioTrack.sampleDuration = OPUS.getFrameDuration(audioTrack.samples, timescale);
6405
+ break;
6406
+ }
6407
+ case AudioCodecType.G711PCMA:
6408
+ case AudioCodecType.G711PCMU: {
6409
+ audioTrack.sampleDuration = this._getG711Duration(audioTrack);
6410
+ break;
6411
+ }
6412
+ default:
6413
+ console.error("can't fix audio codecType:", audioTrack.codecType);
6414
+ break;
6415
+ }
6264
6416
  }
6265
6417
  var refSampleDuration = audioTrack.sampleDuration;
6266
- var sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1e3;
6418
+ var sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.OPUS ? 20 : audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1e3;
6267
6419
  if (this._audioNextPts === void 0) {
6268
6420
  var samp0 = samples[0];
6269
6421
  this._audioNextPts = samp0.pts;
@@ -6272,7 +6424,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6272
6424
  var nextPts = this._audioNextPts;
6273
6425
  var sample = samples[i];
6274
6426
  var delta = sample.pts - nextPts;
6275
- if (i === 0 && this._audioTimestampBreak >= TRACK_BREACKED_CHECK_TIME && this._keyFrameInNextChunk) {
6427
+ if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_CHECK_TIME && this._keyFrameInNextChunk) {
6276
6428
  nextPts = this._audioNextPts = sample.dts;
6277
6429
  delta = 0;
6278
6430
  this._audioTimestampBreak = 0;
@@ -6280,7 +6432,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6280
6432
  if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {
6281
6433
  var silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray();
6282
6434
  var count = Math.floor(delta / refSampleDuration);
6283
- if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {
6435
+ if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {
6284
6436
  this._lastAudioExceptionGapDot = sample.pts;
6285
6437
  audioTrack.warnings.push({
6286
6438
  type: WarningType.AUDIO_FILLED,
@@ -6300,7 +6452,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6300
6452
  }
6301
6453
  i--;
6302
6454
  } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {
6303
- if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {
6455
+ if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {
6304
6456
  this._lastAudioExceptionOverlapDot = sample.pts;
6305
6457
  audioTrack.warnings.push({
6306
6458
  type: WarningType.AUDIO_DROPPED,
@@ -6315,7 +6467,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6315
6467
  } else {
6316
6468
  if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {
6317
6469
  this._audioTimestampBreak++;
6318
- if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {
6470
+ if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {
6319
6471
  this._lastAudioExceptionLargeGapDot = sample.pts;
6320
6472
  audioTrack.warnings.push({
6321
6473
  type: WarningType.LARGE_AUDIO_GAP,
@@ -6328,8 +6480,15 @@ var FlvFixer = /* @__PURE__ */ function() {
6328
6480
  });
6329
6481
  }
6330
6482
  }
6331
- sample.dts = sample.pts = nextPts;
6332
- sample.duration = sampleDurationInSampleRate;
6483
+ if (audioTrack.codecType === AudioCodecType.OPUS) {
6484
+ var lastSample = samples[samples.length - 1];
6485
+ if (lastSample) {
6486
+ lastSample.duration = sample.pts - lastSample.pts;
6487
+ }
6488
+ } else {
6489
+ sample.dts = sample.pts = nextPts;
6490
+ sample.duration = sampleDurationInSampleRate;
6491
+ }
6333
6492
  this._audioNextPts += refSampleDuration;
6334
6493
  }
6335
6494
  }
@@ -7288,6 +7447,13 @@ var AMF = /* @__PURE__ */ function() {
7288
7447
  }]);
7289
7448
  return AMF2;
7290
7449
  }();
7450
+ var FlvSoundFormat = {
7451
+ MP3: 2,
7452
+ G711A: 7,
7453
+ G711M: 8,
7454
+ AAC: 10,
7455
+ OPUS: 13
7456
+ };
7291
7457
  var logger$2 = new Logger$1("FlvDemuxer");
7292
7458
  var FlvDemuxer = /* @__PURE__ */ function() {
7293
7459
  function FlvDemuxer2(videoTrack, audioTrack, metadataTrack) {
@@ -7304,8 +7470,10 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7304
7470
  _createClass$1(FlvDemuxer2, [{
7305
7471
  key: "demux",
7306
7472
  value: function demux(data) {
7473
+ var _scriptDataObject$dat;
7307
7474
  var discontinuity = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
7308
7475
  var contiguous = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
7476
+ var seamlessLoadingSwitching = arguments.length > 3 ? arguments[3] : void 0;
7309
7477
  var audioTrack = this.audioTrack, videoTrack = this.videoTrack, metadataTrack = this.metadataTrack;
7310
7478
  if (discontinuity || !contiguous) {
7311
7479
  this._remainingData = null;
@@ -7363,6 +7531,8 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7363
7531
  if (tagType === 8) {
7364
7532
  this._parseAudio(bodyData, timestamp);
7365
7533
  } else if (tagType === 9) {
7534
+ if (seamlessLoadingSwitching)
7535
+ this.seamlessLoadingSwitching = true;
7366
7536
  this._parseVideo(bodyData, timestamp);
7367
7537
  } else if (tagType === 18) {
7368
7538
  this._parseScript(bodyData, timestamp);
@@ -7380,13 +7550,31 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7380
7550
  this._remainingData = data.subarray(offset);
7381
7551
  }
7382
7552
  audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1e3;
7383
- audioTrack.timescale = audioTrack.sampleRate || 0;
7553
+ audioTrack.timescale = audioTrack.codecType === AudioCodecType.OPUS ? 1e3 : audioTrack.sampleRate || 0;
7384
7554
  if (!audioTrack.exist() && audioTrack.hasSample()) {
7385
7555
  audioTrack.reset();
7386
7556
  }
7387
7557
  if (!videoTrack.exist() && videoTrack.hasSample()) {
7388
7558
  videoTrack.reset();
7389
7559
  }
7560
+ var scriptDataObject = metadataTrack.flvScriptSamples[metadataTrack.flvScriptSamples.length - 1];
7561
+ var metaData = scriptDataObject === null || scriptDataObject === void 0 ? void 0 : (_scriptDataObject$dat = scriptDataObject.data) === null || _scriptDataObject$dat === void 0 ? void 0 : _scriptDataObject$dat.onMetaData;
7562
+ if (metaData) {
7563
+ if (videoTrack !== null && videoTrack !== void 0 && videoTrack.exist()) {
7564
+ if (metaData.hasOwnProperty("duration")) {
7565
+ videoTrack.duration = metaData.duration * 1e3;
7566
+ }
7567
+ if (metaData.hasOwnProperty("width") && metaData.hasOwnProperty("height")) {
7568
+ videoTrack.width = metaData.width;
7569
+ videoTrack.height = metaData.height;
7570
+ }
7571
+ }
7572
+ if (audioTrack !== null && audioTrack !== void 0 && audioTrack.exist()) {
7573
+ if (metaData.hasOwnProperty("duration")) {
7574
+ audioTrack.duration = metaData.duration * 1e3;
7575
+ }
7576
+ }
7577
+ }
7390
7578
  return {
7391
7579
  videoTrack,
7392
7580
  audioTrack,
@@ -7405,8 +7593,8 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7405
7593
  }
7406
7594
  }, {
7407
7595
  key: "demuxAndFix",
7408
- value: function demuxAndFix(data, discontinuity, contiguous, startTime) {
7409
- this.demux(data, discontinuity, contiguous);
7596
+ value: function demuxAndFix(data, discontinuity, contiguous, startTime, seamlessLoadingSwitching) {
7597
+ this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching);
7410
7598
  return this.fix(startTime, discontinuity, contiguous);
7411
7599
  }
7412
7600
  }, {
@@ -7416,12 +7604,12 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7416
7604
  return;
7417
7605
  var format = (data[0] & 240) >>> 4;
7418
7606
  var track = this.audioTrack;
7419
- if (format !== 10 && format !== 7 && format !== 8) {
7607
+ if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.G711A && format !== FlvSoundFormat.G711M && format !== FlvSoundFormat.OPUS) {
7420
7608
  logger$2.warn("Unsupported sound format: ".concat(format));
7421
7609
  track.reset();
7422
7610
  return;
7423
7611
  }
7424
- if (format !== 10) {
7612
+ if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {
7425
7613
  var soundRate = (data[0] & 12) >> 2;
7426
7614
  var soundSize = (data[0] & 2) >> 1;
7427
7615
  var soundType = data[0] & 1;
@@ -7429,10 +7617,49 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7429
7617
  track.sampleSize = soundSize ? 16 : 8;
7430
7618
  track.channelCount = soundType + 1;
7431
7619
  }
7432
- if (format === 10) {
7433
- this._parseAac(data, pts);
7434
- } else {
7435
- this._parseG711(data, pts, format);
7620
+ switch (format) {
7621
+ case FlvSoundFormat.G711A:
7622
+ case FlvSoundFormat.G711M:
7623
+ this._parseG711(data, pts, format);
7624
+ break;
7625
+ case FlvSoundFormat.AAC:
7626
+ this._parseAac(data, pts);
7627
+ break;
7628
+ case FlvSoundFormat.OPUS:
7629
+ this._parseOpus(data, pts);
7630
+ break;
7631
+ }
7632
+ }
7633
+ }, {
7634
+ key: "_parseOpus",
7635
+ value: function _parseOpus(data, pts) {
7636
+ var track = this.audioTrack;
7637
+ var packetType = data[1];
7638
+ track.codecType = AudioCodecType.OPUS;
7639
+ switch (packetType) {
7640
+ case 0: {
7641
+ var ret = OPUS.parseHeaderPackets(data.subarray(2));
7642
+ if (ret) {
7643
+ track.codec = ret.codec;
7644
+ track.channelCount = ret.channelCount;
7645
+ track.sampleRate = ret.sampleRate;
7646
+ track.config = ret.config;
7647
+ track.sampleDuration = OPUS.getFrameDuration([], track.timescale);
7648
+ } else {
7649
+ track.reset();
7650
+ logger$2.warn("Cannot parse AudioSpecificConfig", data);
7651
+ }
7652
+ break;
7653
+ }
7654
+ case 1: {
7655
+ if (pts === void 0 || pts === null)
7656
+ return;
7657
+ var newSample = new AudioSample(pts, data.subarray(2), track.sampleDuration);
7658
+ track.samples.push(newSample);
7659
+ break;
7660
+ }
7661
+ default:
7662
+ logger$2.warn("Unknown OpusPacketType: ".concat(packetType));
7436
7663
  }
7437
7664
  }
7438
7665
  }, {
@@ -7520,8 +7747,13 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7520
7747
  units = this._checkAddMetaNalToUnits(isHevc, units, track);
7521
7748
  if (units && units.length) {
7522
7749
  var sample = new VideoSample(dts + cts, dts, units);
7750
+ if (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {
7751
+ return;
7752
+ }
7753
+ this.seamlessLoadingSwitching = false;
7523
7754
  if (frameType === 1) {
7524
7755
  sample.setToKeyframe();
7756
+ track.lastKeyFrameDts = dts;
7525
7757
  }
7526
7758
  track.samples.push(sample);
7527
7759
  units.forEach(function(unit) {
@@ -7995,10 +8227,16 @@ var MP4 = /* @__PURE__ */ function() {
7995
8227
  if (track.useEME && track.enca) {
7996
8228
  content = MP42.enca(track);
7997
8229
  } else {
7998
- content = MP42.mp4a(track);
8230
+ if (track.codecType === AudioCodecType.OPUS) {
8231
+ content = MP42.opus(track);
8232
+ } else {
8233
+ content = MP42.mp4a(track);
8234
+ }
7999
8235
  }
8000
8236
  } else if (track.useEME && track.encv) {
8001
8237
  content = MP42.encv(track);
8238
+ } else if (track.av1C) {
8239
+ content = MP42.av01(track);
8002
8240
  } else {
8003
8241
  content = MP42.avc1hev1(track);
8004
8242
  }
@@ -8211,6 +8449,90 @@ var MP4 = /* @__PURE__ */ function() {
8211
8449
  var schi = MP42.schi(data);
8212
8450
  return MP42.box(MP42.types.sinf, content, MP42.box(MP42.types.frma, frma), MP42.box(MP42.types.schm, schm), schi);
8213
8451
  }
8452
+ }, {
8453
+ key: "av01",
8454
+ value: function av01(track) {
8455
+ return MP42.box(MP42.types.av01, new Uint8Array([
8456
+ 0,
8457
+ 0,
8458
+ 0,
8459
+ 0,
8460
+ 0,
8461
+ 0,
8462
+ 0,
8463
+ 1,
8464
+ 0,
8465
+ 0,
8466
+ 0,
8467
+ 0,
8468
+ 0,
8469
+ 0,
8470
+ 0,
8471
+ 0,
8472
+ 0,
8473
+ 0,
8474
+ 0,
8475
+ 0,
8476
+ 0,
8477
+ 0,
8478
+ 0,
8479
+ 0,
8480
+ track.width >> 8 & 255,
8481
+ track.width & 255,
8482
+ track.height >> 8 & 255,
8483
+ track.height & 255,
8484
+ 0,
8485
+ 72,
8486
+ 0,
8487
+ 0,
8488
+ 0,
8489
+ 72,
8490
+ 0,
8491
+ 0,
8492
+ 0,
8493
+ 0,
8494
+ 0,
8495
+ 0,
8496
+ 0,
8497
+ 1,
8498
+ 0,
8499
+ 0,
8500
+ 0,
8501
+ 0,
8502
+ 0,
8503
+ 0,
8504
+ 0,
8505
+ 0,
8506
+ 0,
8507
+ 0,
8508
+ 0,
8509
+ 0,
8510
+ 0,
8511
+ 0,
8512
+ 0,
8513
+ 0,
8514
+ 0,
8515
+ 0,
8516
+ 0,
8517
+ 0,
8518
+ 0,
8519
+ 0,
8520
+ 0,
8521
+ 0,
8522
+ 0,
8523
+ 0,
8524
+ 0,
8525
+ 0,
8526
+ 0,
8527
+ 0,
8528
+ 0,
8529
+ 0,
8530
+ 0,
8531
+ 24,
8532
+ 17,
8533
+ 17
8534
+ ]), track.av1C, track.colr);
8535
+ }
8214
8536
  }, {
8215
8537
  key: "avc1hev1",
8216
8538
  value: function avc1hev1(track) {
@@ -8581,6 +8903,53 @@ var MP4 = /* @__PURE__ */ function() {
8581
8903
  )));
8582
8904
  return esds2;
8583
8905
  }
8906
+ }, {
8907
+ key: "opus",
8908
+ value: function opus(track) {
8909
+ var opusAudioDescription = new Uint8Array([
8910
+ 0,
8911
+ 0,
8912
+ 0,
8913
+ 0,
8914
+ 0,
8915
+ 0,
8916
+ 0,
8917
+ 1,
8918
+ 0,
8919
+ 0,
8920
+ 0,
8921
+ 0,
8922
+ 0,
8923
+ 0,
8924
+ 0,
8925
+ 0,
8926
+ 0,
8927
+ track.channelCount,
8928
+ 0,
8929
+ 16,
8930
+ 0,
8931
+ 0,
8932
+ 0,
8933
+ 0,
8934
+ track.sampleRate >> 8 & 255,
8935
+ track.sampleRate & 255,
8936
+ 0,
8937
+ 0
8938
+ ]);
8939
+ var opusSpecificConfig = track.config.length ? MP42.dOps(track) : [];
8940
+ return MP42.box(MP42.types.Opus, opusAudioDescription, opusSpecificConfig);
8941
+ }
8942
+ }, {
8943
+ key: "dOps",
8944
+ value: function dOps(track) {
8945
+ if (track.config) {
8946
+ track.config[4] = track.sampleRate >>> 24 & 255;
8947
+ track.config[5] = track.sampleRate >>> 16 & 255;
8948
+ track.config[6] = track.sampleRate >>> 8 & 255;
8949
+ track.config[7] = track.sampleRate & 255;
8950
+ return MP42.box(MP42.types.dOps, track.config);
8951
+ }
8952
+ }
8584
8953
  }, {
8585
8954
  key: "mvex",
8586
8955
  value: function mvex(tracks) {
@@ -9183,7 +9552,7 @@ var MP4 = /* @__PURE__ */ function() {
9183
9552
  }]);
9184
9553
  return MP42;
9185
9554
  }();
9186
- _defineProperty(MP4, "types", ["avc1", "avcC", "hvc1", "hvcC", "dinf", "dref", "esds", "ftyp", "hdlr", "mdat", "mdhd", "mdia", "mfhd", "minf", "moof", "moov", "mp4a", "mvex", "mvhd", "pasp", "stbl", "stco", "stsc", "stsd", "stsz", "stts", "tfdt", "tfhd", "traf", "trak", "trex", "tkhd", "vmhd", "smhd", "ctts", "stss", "styp", "pssh", "sidx", "sbgp", "saiz", "saio", "senc", "trun", "encv", "enca", "sinf", "btrt", "frma", "tenc", "schm", "schi", "mehd", "fiel", "sdtp"].reduce(function(p, c) {
9555
+ _defineProperty(MP4, "types", ["Opus", "dOps", "av01", "av1C", "avc1", "avcC", "hvc1", "hvcC", "dinf", "dref", "esds", "ftyp", "hdlr", "mdat", "mdhd", "mdia", "mfhd", "minf", "moof", "moov", "mp4a", "mvex", "mvhd", "pasp", "stbl", "stco", "stsc", "stsd", "stsz", "stts", "tfdt", "tfhd", "traf", "trak", "trex", "tkhd", "vmhd", "smhd", "ctts", "stss", "styp", "pssh", "sidx", "sbgp", "saiz", "saio", "senc", "trun", "encv", "enca", "sinf", "btrt", "frma", "tenc", "schm", "schi", "mehd", "fiel", "sdtp"].reduce(function(p, c) {
9187
9556
  p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)];
9188
9557
  return p;
9189
9558
  }, /* @__PURE__ */ Object.create(null)));
@@ -9518,30 +9887,46 @@ var FMP4Remuxer = /* @__PURE__ */ function() {
9518
9887
  };
9519
9888
  }
9520
9889
  var samples = track.samples;
9890
+ var isAV01 = /av01/.test(track.codec);
9521
9891
  var mdatSize = 0;
9522
- samples.forEach(function(s) {
9523
- mdatSize += s.units.reduce(function(t, c) {
9524
- return t + c.byteLength;
9525
- }, 0);
9526
- mdatSize += s.units.length * 4;
9527
- });
9528
- var mdata = new Uint8Array(mdatSize);
9529
- var mdatView = new DataView(mdata.buffer);
9530
- var _loop = function _loop2(_offset, _sample) {
9531
- _sample = samples[i];
9532
- var sampleSize = 0;
9533
- _sample.units.forEach(function(u) {
9534
- mdatView.setUint32(_offset, u.byteLength);
9535
- _offset += 4;
9536
- mdata.set(u, _offset);
9537
- _offset += u.byteLength;
9538
- sampleSize += 4 + u.byteLength;
9892
+ if (isAV01) {
9893
+ samples.forEach(function(s) {
9894
+ mdatSize += s.data.byteLength;
9539
9895
  });
9540
- _sample.size = sampleSize;
9541
- offset = _offset, sample = _sample;
9542
- };
9543
- for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
9544
- _loop(offset, sample);
9896
+ } else {
9897
+ samples.forEach(function(s) {
9898
+ mdatSize += s.units.reduce(function(t, c) {
9899
+ return t + c.byteLength;
9900
+ }, 0);
9901
+ mdatSize += s.units.length * 4;
9902
+ });
9903
+ }
9904
+ var mdata = new Uint8Array(mdatSize);
9905
+ if (isAV01) {
9906
+ for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
9907
+ sample = samples[i];
9908
+ mdata.set(sample.data, offset);
9909
+ sample.size = sample.data.byteLength;
9910
+ offset += sample.size;
9911
+ }
9912
+ } else {
9913
+ var mdatView = new DataView(mdata.buffer);
9914
+ var _loop = function _loop2(_offset2, _sample2) {
9915
+ _sample2 = samples[_i];
9916
+ var sampleSize = 0;
9917
+ _sample2.units.forEach(function(u) {
9918
+ mdatView.setUint32(_offset2, u.byteLength);
9919
+ _offset2 += 4;
9920
+ mdata.set(u, _offset2);
9921
+ _offset2 += u.byteLength;
9922
+ sampleSize += 4 + u.byteLength;
9923
+ });
9924
+ _sample2.size = sampleSize;
9925
+ _offset = _offset2, _sample = _sample2;
9926
+ };
9927
+ for (var _i = 0, _l = samples.length, _offset = 0, _sample; _i < _l; _i++) {
9928
+ _loop(_offset, _sample);
9929
+ }
9545
9930
  }
9546
9931
  var mdat = MP4.mdat(mdata);
9547
9932
  var moof = MP4.moof([track]);
@@ -9571,6 +9956,55 @@ var FMP4Remuxer = /* @__PURE__ */ function() {
9571
9956
  }]);
9572
9957
  return FMP4Remuxer2;
9573
9958
  }();
9959
+ var TransferCost = /* @__PURE__ */ function() {
9960
+ function TransferCost2() {
9961
+ _classCallCheck$4(this, TransferCost2);
9962
+ _defineProperty$3(this, "_ttfb", 0);
9963
+ _defineProperty$3(this, "_demuxStart", 0);
9964
+ _defineProperty$3(this, "_demuxEnd", 0);
9965
+ _defineProperty$3(this, "_demuxCost", 0);
9966
+ _defineProperty$3(this, "_remuxStart", 0);
9967
+ _defineProperty$3(this, "_remuxEnd", 0);
9968
+ _defineProperty$3(this, "_remuxCost", 0);
9969
+ _defineProperty$3(this, "_appendStart", 0);
9970
+ _defineProperty$3(this, "_appendEnd", 0);
9971
+ _defineProperty$3(this, "_appendCost", 0);
9972
+ }
9973
+ _createClass$4(TransferCost2, [{
9974
+ key: "set",
9975
+ value: function set(event, value) {
9976
+ this["_".concat(event)] = value;
9977
+ }
9978
+ }, {
9979
+ key: "start",
9980
+ value: function start(event) {
9981
+ this["_".concat(event, "Start")] = Date.now();
9982
+ }
9983
+ }, {
9984
+ key: "end",
9985
+ value: function end(event) {
9986
+ this["_".concat(event, "End")] = Date.now();
9987
+ this["_".concat(event, "Cost")] = this["_".concat(event, "Cost")] + (this["_".concat(event, "End")] - this["_".concat(event, "Start")]);
9988
+ }
9989
+ }, {
9990
+ key: "transferCost",
9991
+ get: function get() {
9992
+ return {
9993
+ ttfbCost: this._ttfb,
9994
+ demuxCost: this._demuxCost,
9995
+ remuxCost: this._remuxCost,
9996
+ appendCost: this._appendCost
9997
+ };
9998
+ }
9999
+ }]);
10000
+ return TransferCost2;
10001
+ }();
10002
+ var TRANSFER_EVENT = {
10003
+ TTFB: "ttfb",
10004
+ DEMUX: "demux",
10005
+ REMUX: "remux",
10006
+ APPEND: "append"
10007
+ };
9574
10008
  var logger$1 = new Logger$2("BufferService");
9575
10009
  var BufferService = /* @__PURE__ */ function() {
9576
10010
  function BufferService2(flv, softVideo) {
@@ -9658,7 +10092,8 @@ var BufferService = /* @__PURE__ */ function() {
9658
10092
  this._contiguous = false;
9659
10093
  this._sourceCreated = false;
9660
10094
  this._initSegmentId = "";
9661
- case 11:
10095
+ this.resetSeamlessSwitchStats();
10096
+ case 12:
9662
10097
  case "end":
9663
10098
  return _context.stop();
9664
10099
  }
@@ -9669,6 +10104,15 @@ var BufferService = /* @__PURE__ */ function() {
9669
10104
  }
9670
10105
  return reset;
9671
10106
  }()
10107
+ }, {
10108
+ key: "resetSeamlessSwitchStats",
10109
+ value: function resetSeamlessSwitchStats() {
10110
+ this.seamlessLoadingSwitch = null;
10111
+ this.seamlessLoadingSwitching = false;
10112
+ if (this._demuxer) {
10113
+ this._demuxer.seamlessLoadingSwitching = false;
10114
+ }
10115
+ }
9672
10116
  }, {
9673
10117
  key: "endOfStream",
9674
10118
  value: function() {
@@ -9774,32 +10218,56 @@ var BufferService = /* @__PURE__ */ function() {
9774
10218
  key: "appendBuffer",
9775
10219
  value: function() {
9776
10220
  var _appendBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(chunk) {
9777
- var demuxer, videoTrack, audioTrack, metadataTrack, videoExist, audioExist, duration, track, videoType, audioType, mse, newId, remuxResult, p;
10221
+ var _this = this;
10222
+ var switchingNoReset, demuxer, videoTrack, audioTrack, metadataTrack, idx, videoExist, audioExist, duration, track, videoType, audioType, mse, afterAppend, newId, remuxResult, p;
9778
10223
  return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
9779
10224
  while (1)
9780
10225
  switch (_context5.prev = _context5.next) {
9781
10226
  case 0:
10227
+ switchingNoReset = false;
9782
10228
  if (this._cachedBuffer) {
9783
10229
  chunk = concatUint8Array$1(this._cachedBuffer, chunk);
9784
10230
  this._cachedBuffer = null;
9785
10231
  }
9786
10232
  demuxer = this._demuxer;
9787
10233
  if (!(!chunk || !chunk.length || !demuxer)) {
9788
- _context5.next = 4;
10234
+ _context5.next = 5;
9789
10235
  break;
9790
10236
  }
9791
10237
  return _context5.abrupt("return");
9792
- case 4:
9793
- _context5.prev = 4;
9794
- demuxer.demuxAndFix(chunk, this._discontinuity, this._contiguous, this._demuxStartTime);
9795
- _context5.next = 11;
10238
+ case 5:
10239
+ _context5.prev = 5;
10240
+ this.flv._transferCost.start(TRANSFER_EVENT.DEMUX);
10241
+ demuxer.demuxAndFix(chunk, this.seamlessLoadingSwitching || this._discontinuity, this._contiguous, this._demuxStartTime, this.seamlessLoadingSwitching);
10242
+ this.seamlessLoadingSwitching = false;
10243
+ this.flv._transferCost.end(TRANSFER_EVENT.DEMUX);
10244
+ _context5.next = 15;
9796
10245
  break;
9797
- case 8:
9798
- _context5.prev = 8;
9799
- _context5.t0 = _context5["catch"](4);
10246
+ case 12:
10247
+ _context5.prev = 12;
10248
+ _context5.t0 = _context5["catch"](5);
9800
10249
  throw new StreamingError(ERR.DEMUX, ERR.SUB_TYPES.FLV, _context5.t0);
9801
- case 11:
10250
+ case 15:
9802
10251
  videoTrack = demuxer.videoTrack, audioTrack = demuxer.audioTrack, metadataTrack = demuxer.metadataTrack;
10252
+ if (!this.seamlessLoadingSwitch) {
10253
+ _context5.next = 25;
10254
+ break;
10255
+ }
10256
+ idx = videoTrack.samples.findIndex(function(sample) {
10257
+ return sample.originDts === videoTrack.lastKeyFrameDts;
10258
+ });
10259
+ if (!(idx >= 0)) {
10260
+ _context5.next = 25;
10261
+ break;
10262
+ }
10263
+ videoTrack.samples.splice(idx);
10264
+ _context5.next = 22;
10265
+ return this.seamlessLoadingSwitch();
10266
+ case 22:
10267
+ this.seamlessLoadingSwitch = null;
10268
+ chunk = null;
10269
+ switchingNoReset = true;
10270
+ case 25:
9803
10271
  videoExist = videoTrack.exist();
9804
10272
  audioExist = audioTrack.exist();
9805
10273
  if (this._opts.onlyAudio) {
@@ -9811,7 +10279,7 @@ var BufferService = /* @__PURE__ */ function() {
9811
10279
  audioTrack.present = false;
9812
10280
  }
9813
10281
  if (!(!videoExist && videoTrack.present || !audioExist && audioTrack.present)) {
9814
- _context5.next = 29;
10282
+ _context5.next = 42;
9815
10283
  break;
9816
10284
  }
9817
10285
  duration = 0;
@@ -9820,7 +10288,7 @@ var BufferService = /* @__PURE__ */ function() {
9820
10288
  duration = (track.samples[track.samples.length - 1].originPts - track.samples[0].originPts) / track.timescale * 1e3;
9821
10289
  }
9822
10290
  if (!(duration > this._opts.analyzeDuration)) {
9823
- _context5.next = 27;
10291
+ _context5.next = 40;
9824
10292
  break;
9825
10293
  }
9826
10294
  logger$1.warn("analyze duration exceeded, ".concat(duration, "ms"), track);
@@ -9829,19 +10297,28 @@ var BufferService = /* @__PURE__ */ function() {
9829
10297
  this.flv.emit(EVENT.ANALYZE_DURATION_EXCEEDED, {
9830
10298
  duration
9831
10299
  });
9832
- _context5.next = 29;
10300
+ _context5.next = 42;
9833
10301
  break;
9834
- case 27:
10302
+ case 40:
9835
10303
  this._cachedBuffer = chunk;
9836
10304
  return _context5.abrupt("return");
9837
- case 29:
10305
+ case 42:
9838
10306
  videoType = videoTrack.type;
9839
10307
  audioType = audioTrack.type;
9840
10308
  this._fireEvents(videoTrack, audioTrack, metadataTrack);
9841
- this._discontinuity = false;
9842
- this._contiguous = true;
9843
- this._demuxStartTime = 0;
10309
+ if (!switchingNoReset) {
10310
+ this._discontinuity = false;
10311
+ this._contiguous = true;
10312
+ this._demuxStartTime = 0;
10313
+ }
9844
10314
  mse = this._mse;
10315
+ afterAppend = function afterAppend2() {
10316
+ var _this$flv;
10317
+ if ((_this$flv = _this.flv) !== null && _this$flv !== void 0 && _this$flv.emit) {
10318
+ var _this$flv2;
10319
+ (_this$flv2 = _this.flv) === null || _this$flv2 === void 0 ? void 0 : _this$flv2.emit(EVENT.APPEND_BUFFER, {});
10320
+ }
10321
+ };
9845
10322
  this.flv.emit(EVENT.DEMUXED_TRACK, {
9846
10323
  videoTrack
9847
10324
  });
@@ -9852,16 +10329,16 @@ var BufferService = /* @__PURE__ */ function() {
9852
10329
  this._emitMetaParsedEvent(videoTrack, audioTrack);
9853
10330
  }
9854
10331
  if (!mse) {
9855
- _context5.next = 66;
10332
+ _context5.next = 81;
9856
10333
  break;
9857
10334
  }
9858
10335
  if (this._sourceCreated) {
9859
- _context5.next = 47;
10336
+ _context5.next = 59;
9860
10337
  break;
9861
10338
  }
9862
- _context5.next = 43;
10339
+ _context5.next = 55;
9863
10340
  return mse.open();
9864
- case 43:
10341
+ case 55:
9865
10342
  if (videoExist) {
9866
10343
  logger$1.log("codec: video/mp4;codecs=".concat(videoTrack.codec));
9867
10344
  mse.createSource(videoType, "video/mp4;codecs=".concat(videoTrack.codec));
@@ -9872,26 +10349,28 @@ var BufferService = /* @__PURE__ */ function() {
9872
10349
  }
9873
10350
  this._sourceCreated = true;
9874
10351
  this.flv.emit(EVENT.SOURCEBUFFER_CREATED);
9875
- case 47:
9876
- _context5.prev = 47;
10352
+ case 59:
10353
+ _context5.prev = 59;
9877
10354
  if (this._needInitSegment && !this._opts.mseLowLatency) {
9878
10355
  videoTrack.duration = this._opts.durationForMSELowLatencyOff * videoTrack.timescale;
9879
10356
  audioTrack.duration = this._opts.durationForMSELowLatencyOff * audioExist.timescale;
9880
10357
  }
10358
+ this.flv._transferCost.start(TRANSFER_EVENT.REMUX);
9881
10359
  remuxResult = this._remuxer.remux(this._needInitSegment);
9882
- _context5.next = 55;
10360
+ this.flv._transferCost.end(TRANSFER_EVENT.REMUX);
10361
+ _context5.next = 69;
9883
10362
  break;
9884
- case 52:
9885
- _context5.prev = 52;
9886
- _context5.t1 = _context5["catch"](47);
10363
+ case 66:
10364
+ _context5.prev = 66;
10365
+ _context5.t1 = _context5["catch"](59);
9887
10366
  throw new StreamingError(ERR.REMUX, ERR.SUB_TYPES.FMP4, _context5.t1);
9888
- case 55:
10367
+ case 69:
9889
10368
  if (!(this._needInitSegment && !remuxResult.videoInitSegment && !remuxResult.audioInitSegment)) {
9890
- _context5.next = 57;
10369
+ _context5.next = 71;
9891
10370
  break;
9892
10371
  }
9893
10372
  return _context5.abrupt("return");
9894
- case 57:
10373
+ case 71:
9895
10374
  this._needInitSegment = false;
9896
10375
  p = [];
9897
10376
  if (remuxResult.videoInitSegment)
@@ -9902,16 +10381,21 @@ var BufferService = /* @__PURE__ */ function() {
9902
10381
  p.push(mse.append(videoType, remuxResult.videoSegment));
9903
10382
  if (remuxResult.audioSegment)
9904
10383
  p.push(mse.append(audioType, remuxResult.audioSegment));
9905
- return _context5.abrupt("return", Promise.all(p));
9906
- case 66:
10384
+ this.flv._transferCost.start(TRANSFER_EVENT.APPEND);
10385
+ return _context5.abrupt("return", Promise.all(p).then(afterAppend).then(function() {
10386
+ _this.flv._transferCost.end(TRANSFER_EVENT.APPEND);
10387
+ afterAppend();
10388
+ }));
10389
+ case 81:
9907
10390
  if (this._softVideo) {
9908
10391
  this._softVideo.appendBuffer(videoTrack, audioTrack);
10392
+ afterAppend();
9909
10393
  }
9910
- case 67:
10394
+ case 82:
9911
10395
  case "end":
9912
10396
  return _context5.stop();
9913
10397
  }
9914
- }, _callee5, this, [[4, 8], [47, 52]]);
10398
+ }, _callee5, this, [[5, 12], [59, 66]]);
9915
10399
  }));
9916
10400
  function appendBuffer(_x2) {
9917
10401
  return _appendBuffer.apply(this, arguments);
@@ -9922,7 +10406,7 @@ var BufferService = /* @__PURE__ */ function() {
9922
10406
  key: "evictBuffer",
9923
10407
  value: function() {
9924
10408
  var _evictBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(bufferBehind) {
9925
- var _this = this;
10409
+ var _this2 = this;
9926
10410
  var media, currentTime, removeEnd, start;
9927
10411
  return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
9928
10412
  while (1)
@@ -9951,7 +10435,7 @@ var BufferService = /* @__PURE__ */ function() {
9951
10435
  return _context6.abrupt("return");
9952
10436
  case 10:
9953
10437
  return _context6.abrupt("return", this._mse.clearBuffer(0, removeEnd).then(function() {
9954
- return _this.flv.emit(EVENT.REMOVE_BUFFER, {
10438
+ return _this2.flv.emit(EVENT.REMOVE_BUFFER, {
9955
10439
  removeEnd
9956
10440
  });
9957
10441
  }));
@@ -10001,16 +10485,16 @@ var BufferService = /* @__PURE__ */ function() {
10001
10485
  }, {
10002
10486
  key: "_fireEvents",
10003
10487
  value: function _fireEvents(videoTrack, audioTrack, metadataTrack) {
10004
- var _this2 = this;
10005
- logger$1.debug(videoTrack.samples, audioTrack.samples);
10488
+ var _this3 = this;
10489
+ logger$1.debug("videoTrack samples count: ".concat(videoTrack.samples.length, ", audioTrack samples count: ").concat(audioTrack.samples.length));
10006
10490
  metadataTrack.flvScriptSamples.forEach(function(sample) {
10007
- _this2.flv.emit(EVENT.FLV_SCRIPT_DATA, sample);
10491
+ _this3.flv.emit(EVENT.FLV_SCRIPT_DATA, sample);
10008
10492
  logger$1.debug("flvScriptData", sample);
10009
10493
  });
10010
10494
  videoTrack.samples.forEach(function(sample) {
10011
10495
  if (sample.keyframe) {
10012
- _this2.flv.emit(EVENT.KEYFRAME, {
10013
- pts: sample.pts
10496
+ _this3.flv.emit(EVENT.KEYFRAME, {
10497
+ pts: sample.originPts
10014
10498
  });
10015
10499
  }
10016
10500
  });
@@ -10028,7 +10512,7 @@ var BufferService = /* @__PURE__ */ function() {
10028
10512
  break;
10029
10513
  }
10030
10514
  if (type)
10031
- _this2.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10515
+ _this3.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10032
10516
  type
10033
10517
  }));
10034
10518
  logger$1.warn("video exception", warn);
@@ -10047,13 +10531,13 @@ var BufferService = /* @__PURE__ */ function() {
10047
10531
  break;
10048
10532
  }
10049
10533
  if (type)
10050
- _this2.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10534
+ _this3.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10051
10535
  type
10052
10536
  }));
10053
10537
  logger$1.warn("audio exception", warn);
10054
10538
  });
10055
10539
  metadataTrack.seiSamples.forEach(function(sei) {
10056
- _this2.flv.emit(EVENT.SEI, _objectSpread2$2(_objectSpread2$2({}, sei), {}, {
10540
+ _this3.flv.emit(EVENT.SEI, _objectSpread2$2(_objectSpread2$2({}, sei), {}, {
10057
10541
  sei: {
10058
10542
  code: sei.data.type,
10059
10543
  content: sei.data.payload,
@@ -10088,7 +10572,8 @@ function getOption(opts) {
10088
10572
  durationForMSELowLatencyOff: 6,
10089
10573
  chunkCountForSpeed: 50,
10090
10574
  skipChunkSize: 1e3,
10091
- longtimeNoReceived: 3e3
10575
+ longtimeNoReceived: 3e3,
10576
+ enableStartGapJump: true
10092
10577
  }, opts);
10093
10578
  if (ret.isLive) {
10094
10579
  if (ret.preloadTime) {
@@ -10156,7 +10641,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10156
10641
  _defineProperty$3(_assertThisInitialized$3(_this), "_acceptRanges", true);
10157
10642
  _defineProperty$3(_assertThisInitialized$3(_this), "_onProgress", /* @__PURE__ */ function() {
10158
10643
  var _ref2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee(chunk, done, _ref, response) {
10159
- var startTime, endTime, st, firstByteTime, _this$_mediaLoader, headers, _this$_bufferService, remaining, maxReaderInterval;
10644
+ var startTime, endTime, st, firstByteTime, _this$_mediaLoader, headers, elapsed, _this$_bufferService, remaining, maxReaderInterval;
10160
10645
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
10161
10646
  while (1)
10162
10647
  switch (_context.prev = _context.next) {
@@ -10164,7 +10649,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10164
10649
  startTime = _ref.startTime, endTime = _ref.endTime, st = _ref.st, firstByteTime = _ref.firstByteTime;
10165
10650
  _this._loading = !done;
10166
10651
  if (_this._firstProgressEmit) {
10167
- _context.next = 11;
10652
+ _context.next = 13;
10168
10653
  break;
10169
10654
  }
10170
10655
  if (_this.media) {
@@ -10175,49 +10660,51 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10175
10660
  return _context.abrupt("return");
10176
10661
  case 6:
10177
10662
  headers = response.headers;
10663
+ elapsed = st ? firstByteTime - st : endTime - startTime;
10178
10664
  _this.emit(EVENT.TTFB, {
10179
10665
  url: _this._opts.url,
10180
10666
  responseUrl: response.url,
10181
- elapsed: st ? firstByteTime - st : endTime - startTime
10667
+ elapsed
10182
10668
  });
10183
10669
  _this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
10184
10670
  headers
10185
10671
  });
10672
+ _this._transferCost.set(TRANSFER_EVENT.TTFB, elapsed);
10186
10673
  _this._acceptRanges = !!(headers !== null && headers !== void 0 && headers.get("Accept-Ranges")) || !!(headers !== null && headers !== void 0 && headers.get("Content-Range"));
10187
10674
  _this._firstProgressEmit = true;
10188
- case 11:
10675
+ case 13:
10189
10676
  if (_this._bufferService) {
10190
- _context.next = 13;
10677
+ _context.next = 15;
10191
10678
  break;
10192
10679
  }
10193
10680
  return _context.abrupt("return");
10194
- case 13:
10681
+ case 15:
10195
10682
  clearTimeout(_this._maxChunkWaitTimer);
10196
10683
  _this._bandwidthService.addChunkRecord(chunk === null || chunk === void 0 ? void 0 : chunk.byteLength, endTime - startTime);
10197
- _context.prev = 15;
10198
- _context.next = 18;
10684
+ _context.prev = 17;
10685
+ _context.next = 20;
10199
10686
  return _this._bufferService.appendBuffer(chunk);
10200
- case 18:
10687
+ case 20:
10201
10688
  (_this$_bufferService = _this._bufferService) === null || _this$_bufferService === void 0 ? void 0 : _this$_bufferService.evictBuffer(_this._opts.bufferBehind);
10202
- _context.next = 31;
10689
+ _context.next = 33;
10203
10690
  break;
10204
- case 21:
10205
- _context.prev = 21;
10206
- _context.t0 = _context["catch"](15);
10691
+ case 23:
10692
+ _context.prev = 23;
10693
+ _context.t0 = _context["catch"](17);
10207
10694
  if (!(!_this.isLive && _this._bufferService.isFull())) {
10208
- _context.next = 30;
10695
+ _context.next = 32;
10209
10696
  break;
10210
10697
  }
10211
- _context.next = 26;
10698
+ _context.next = 28;
10212
10699
  return _this._mediaLoader.cancel();
10213
- case 26:
10700
+ case 28:
10214
10701
  _this._loading = false;
10215
10702
  remaining = _this.bufferInfo().remaining;
10216
10703
  _this._opts.preloadTime = parseInt(remaining) / 2;
10217
10704
  return _context.abrupt("return");
10218
- case 30:
10705
+ case 32:
10219
10706
  return _context.abrupt("return", _this._emitError(StreamingError.create(_context.t0)));
10220
- case 31:
10707
+ case 33:
10221
10708
  if (_this._urlSwitching) {
10222
10709
  _this._urlSwitching = false;
10223
10710
  _this.emit(EVENT.SWITCH_URL_SUCCESS, {
@@ -10229,7 +10716,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10229
10716
  _this._tick();
10230
10717
  }
10231
10718
  if (!(done && !_this.media.seeking)) {
10232
- _context.next = 38;
10719
+ _context.next = 40;
10233
10720
  break;
10234
10721
  }
10235
10722
  _this.emit(EVENT.LOAD_COMPLETE);
@@ -10238,13 +10725,13 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10238
10725
  _this._end();
10239
10726
  }
10240
10727
  return _context.abrupt("return");
10241
- case 38:
10728
+ case 40:
10242
10729
  if (_this.isLive) {
10243
- _context.next = 40;
10730
+ _context.next = 42;
10244
10731
  break;
10245
10732
  }
10246
10733
  return _context.abrupt("return");
10247
- case 40:
10734
+ case 42:
10248
10735
  maxReaderInterval = _this._opts.maxReaderInterval;
10249
10736
  if (maxReaderInterval && _this._firstProgressEmit) {
10250
10737
  clearTimeout(_this._maxChunkWaitTimer);
@@ -10258,11 +10745,11 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10258
10745
  _this._end();
10259
10746
  }, maxReaderInterval);
10260
10747
  }
10261
- case 42:
10748
+ case 44:
10262
10749
  case "end":
10263
10750
  return _context.stop();
10264
10751
  }
10265
- }, _callee, null, [[15, 21]]);
10752
+ }, _callee, null, [[17, 23]]);
10266
10753
  }));
10267
10754
  return function(_x, _x2, _x3, _x4) {
10268
10755
  return _ref2.apply(this, arguments);
@@ -10295,19 +10782,19 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10295
10782
  if (bufferEnd < MAX_HOLE || !media.readyState)
10296
10783
  return;
10297
10784
  var opts = _this._opts;
10298
- if (isMediaPlaying(media)) {
10785
+ if (isMediaPlaying(media) && media.currentTime) {
10299
10786
  if (_this._gapService) {
10300
10787
  _this._gapService.do(media, opts.maxJumpDistance, _this.isLive, 3);
10301
10788
  }
10302
10789
  } else {
10303
- if (!media.currentTime && _this._gapService) {
10790
+ if (!media.currentTime && _this._gapService && opts.enableStartGapJump) {
10304
10791
  var gapJump = _this._opts.mseLowLatency || _this._opts.mseLowLatency === false && _this.bufferInfo(MAX_START_GAP).nextStart;
10305
10792
  if (gapJump) {
10306
10793
  _this._gapService.do(media, opts.maxJumpDistance, _this.isLive, 3);
10307
10794
  }
10308
10795
  return;
10309
10796
  }
10310
- if (opts.isLive && media.readyState === 4 && bufferEnd > opts.disconnectTime) {
10797
+ if (opts.isLive && media.readyState === 4 && bufferEnd - media.currentTime > opts.disconnectTime) {
10311
10798
  _this.disconnect();
10312
10799
  }
10313
10800
  }
@@ -10456,6 +10943,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10456
10943
  responseType: "arraybuffer"
10457
10944
  }));
10458
10945
  _this._disconnectRetryCount = _this._opts.disconnectRetryCount;
10946
+ _this._transferCost = new TransferCost();
10459
10947
  _this._bufferService = new BufferService(_assertThisInitialized$3(_this), _this._opts.softDecode ? _this.media : void 0, _this._opts);
10460
10948
  _this._seiService = new SeiService(_assertThisInitialized$3(_this));
10461
10949
  _this._bandwidthService = new BandwidthService({
@@ -10479,7 +10967,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10479
10967
  _createClass$4(Flv2, [{
10480
10968
  key: "version",
10481
10969
  get: function get() {
10482
- return "3.0.19-rc.0";
10970
+ return "3.0.21-rc.2";
10483
10971
  }
10484
10972
  }, {
10485
10973
  key: "isLive",
@@ -10595,9 +11083,9 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10595
11083
  return this._clear();
10596
11084
  case 8:
10597
11085
  setTimeout(function() {
11086
+ _this2._seamlessSwitching = true;
10598
11087
  _this2._loadData(_this2._opts.url);
10599
11088
  _this2._bufferService.seamlessSwitch();
10600
- _this2._seamlessSwitching = true;
10601
11089
  });
10602
11090
  _context5.next = 13;
10603
11091
  break;
@@ -10621,50 +11109,82 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10621
11109
  }, {
10622
11110
  key: "disconnect",
10623
11111
  value: function disconnect() {
11112
+ var _this$_bufferService4;
10624
11113
  logger.debug("disconnect!");
11114
+ (_this$_bufferService4 = this._bufferService) === null || _this$_bufferService4 === void 0 ? void 0 : _this$_bufferService4.resetSeamlessSwitchStats();
10625
11115
  return this._clear();
10626
11116
  }
10627
11117
  }, {
10628
11118
  key: "switchURL",
10629
11119
  value: function() {
10630
- var _switchURL = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(url, seamless) {
11120
+ var _switchURL = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7(url, seamless) {
10631
11121
  var _this3 = this;
10632
- return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
11122
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
10633
11123
  while (1)
10634
- switch (_context6.prev = _context6.next) {
11124
+ switch (_context7.prev = _context7.next) {
10635
11125
  case 0:
10636
11126
  if (this._bufferService) {
10637
- _context6.next = 2;
11127
+ _context7.next = 2;
10638
11128
  break;
10639
11129
  }
10640
- return _context6.abrupt("return");
11130
+ return _context7.abrupt("return");
10641
11131
  case 2:
10642
11132
  this._resetDisconnectCount();
11133
+ if (!(this._loading && seamless)) {
11134
+ _context7.next = 6;
11135
+ break;
11136
+ }
11137
+ this._bufferService.seamlessLoadingSwitch = /* @__PURE__ */ function() {
11138
+ var _ref5 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(pts) {
11139
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
11140
+ while (1)
11141
+ switch (_context6.prev = _context6.next) {
11142
+ case 0:
11143
+ _context6.next = 2;
11144
+ return _this3._clear();
11145
+ case 2:
11146
+ _this3._bufferService.seamlessLoadingSwitching = true;
11147
+ _this3._urlSwitching = true;
11148
+ _this3._seamlessSwitching = true;
11149
+ _this3._bufferService.seamlessSwitch();
11150
+ _this3._loadData(url);
11151
+ case 7:
11152
+ case "end":
11153
+ return _context6.stop();
11154
+ }
11155
+ }, _callee6);
11156
+ }));
11157
+ return function(_x8) {
11158
+ return _ref5.apply(this, arguments);
11159
+ };
11160
+ }();
11161
+ return _context7.abrupt("return");
11162
+ case 6:
10643
11163
  if (!(!seamless || !this._opts.isLive)) {
10644
- _context6.next = 8;
11164
+ _context7.next = 11;
10645
11165
  break;
10646
11166
  }
10647
- _context6.next = 6;
11167
+ _context7.next = 9;
10648
11168
  return this.load(url);
10649
- case 6:
11169
+ case 9:
10650
11170
  this._urlSwitching = true;
10651
- return _context6.abrupt("return", this.media.play(true).catch(function() {
11171
+ return _context7.abrupt("return", this.media.play(true).catch(function() {
10652
11172
  }));
10653
- case 8:
10654
- _context6.next = 10;
11173
+ case 11:
11174
+ _context7.next = 13;
10655
11175
  return this._clear();
10656
- case 10:
11176
+ case 13:
10657
11177
  setTimeout(function() {
10658
11178
  _this3._urlSwitching = true;
10659
11179
  _this3._seamlessSwitching = true;
10660
11180
  _this3._loadData(url);
10661
11181
  _this3._bufferService.seamlessSwitch();
10662
11182
  });
10663
- case 11:
11183
+ case 14:
10664
11184
  case "end":
10665
- return _context6.stop();
11185
+ return _context7.stop();
10666
11186
  }
10667
- }, _callee6, this);
11187
+ }, _callee7, this);
10668
11188
  }));
10669
11189
  function switchURL(_x6, _x7) {
10670
11190
  return _switchURL.apply(this, arguments);
@@ -10674,16 +11194,16 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10674
11194
  }, {
10675
11195
  key: "destroy",
10676
11196
  value: function() {
10677
- var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7() {
10678
- return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
11197
+ var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
11198
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
10679
11199
  while (1)
10680
- switch (_context7.prev = _context7.next) {
11200
+ switch (_context8.prev = _context8.next) {
10681
11201
  case 0:
10682
11202
  if (this.media) {
10683
- _context7.next = 2;
11203
+ _context8.next = 2;
10684
11204
  break;
10685
11205
  }
10686
- return _context7.abrupt("return");
11206
+ return _context8.abrupt("return");
10687
11207
  case 2:
10688
11208
  this.removeAllListeners();
10689
11209
  this._seiService.reset();
@@ -10693,16 +11213,16 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10693
11213
  this.media.removeEventListener("timeupdate", this._onTimeupdate);
10694
11214
  this.media.removeEventListener("waiting", this._onWaiting);
10695
11215
  this.media.removeEventListener("progress", this._onBufferUpdate);
10696
- _context7.next = 12;
11216
+ _context8.next = 12;
10697
11217
  return Promise.all([this._clear(), this._bufferService.destroy()]);
10698
11218
  case 12:
10699
11219
  this.media = null;
10700
11220
  this._bufferService = null;
10701
11221
  case 14:
10702
11222
  case "end":
10703
- return _context7.stop();
11223
+ return _context8.stop();
10704
11224
  }
10705
- }, _callee7, this);
11225
+ }, _callee8, this);
10706
11226
  }));
10707
11227
  function destroy() {
10708
11228
  return _destroy.apply(this, arguments);
@@ -10731,26 +11251,26 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10731
11251
  }, {
10732
11252
  key: "_reset",
10733
11253
  value: function() {
10734
- var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
10735
- var reuseMse, _args8 = arguments;
10736
- return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
11254
+ var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
11255
+ var reuseMse, _args9 = arguments;
11256
+ return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
10737
11257
  while (1)
10738
- switch (_context8.prev = _context8.next) {
11258
+ switch (_context9.prev = _context9.next) {
10739
11259
  case 0:
10740
- reuseMse = _args8.length > 0 && _args8[0] !== void 0 ? _args8[0] : false;
11260
+ reuseMse = _args9.length > 0 && _args9[0] !== void 0 ? _args9[0] : false;
10741
11261
  this._seiService.reset();
10742
11262
  this._bandwidthService.reset();
10743
11263
  this._stats.reset();
10744
- _context8.next = 6;
11264
+ _context9.next = 6;
10745
11265
  return this._clear();
10746
11266
  case 6:
10747
- _context8.next = 8;
11267
+ _context9.next = 8;
10748
11268
  return this._bufferService.reset(reuseMse);
10749
11269
  case 8:
10750
11270
  case "end":
10751
- return _context8.stop();
11271
+ return _context9.stop();
10752
11272
  }
10753
- }, _callee8, this);
11273
+ }, _callee9, this);
10754
11274
  }));
10755
11275
  function _reset() {
10756
11276
  return _reset2.apply(this, arguments);
@@ -10760,17 +11280,17 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10760
11280
  }, {
10761
11281
  key: "_loadData",
10762
11282
  value: function() {
10763
- var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9(url, range) {
11283
+ var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10(url, range) {
10764
11284
  var finnalUrl;
10765
- return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
11285
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
10766
11286
  while (1)
10767
- switch (_context9.prev = _context9.next) {
11287
+ switch (_context10.prev = _context10.next) {
10768
11288
  case 0:
10769
11289
  if (url)
10770
11290
  this._opts.url = url;
10771
11291
  finnalUrl = url = this._opts.url;
10772
11292
  if (url) {
10773
- _context9.next = 4;
11293
+ _context10.next = 4;
10774
11294
  break;
10775
11295
  }
10776
11296
  throw new Error("Source url is missing");
@@ -10785,34 +11305,34 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10785
11305
  });
10786
11306
  logger.debug("load data, loading:", this._loading, finnalUrl);
10787
11307
  if (!this._loading) {
10788
- _context9.next = 11;
11308
+ _context10.next = 11;
10789
11309
  break;
10790
11310
  }
10791
- _context9.next = 11;
11311
+ _context10.next = 11;
10792
11312
  return this._mediaLoader.cancel();
10793
11313
  case 11:
10794
11314
  this._loading = true;
10795
- _context9.prev = 12;
10796
- _context9.next = 15;
11315
+ _context10.prev = 12;
11316
+ _context10.next = 15;
10797
11317
  return this._mediaLoader.load({
10798
11318
  url: finnalUrl,
10799
11319
  range
10800
11320
  });
10801
11321
  case 15:
10802
- _context9.next = 21;
11322
+ _context10.next = 21;
10803
11323
  break;
10804
11324
  case 17:
10805
- _context9.prev = 17;
10806
- _context9.t0 = _context9["catch"](12);
11325
+ _context10.prev = 17;
11326
+ _context10.t0 = _context10["catch"](12);
10807
11327
  this._loading = false;
10808
- return _context9.abrupt("return", this._emitError(StreamingError.network(_context9.t0), false));
11328
+ return _context10.abrupt("return", this._emitError(StreamingError.network(_context10.t0), false));
10809
11329
  case 21:
10810
11330
  case "end":
10811
- return _context9.stop();
11331
+ return _context10.stop();
10812
11332
  }
10813
- }, _callee9, this, [[12, 17]]);
11333
+ }, _callee10, this, [[12, 17]]);
10814
11334
  }));
10815
- function _loadData(_x8, _x9) {
11335
+ function _loadData(_x9, _x10) {
10816
11336
  return _loadData2.apply(this, arguments);
10817
11337
  }
10818
11338
  return _loadData;
@@ -10820,16 +11340,16 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10820
11340
  }, {
10821
11341
  key: "_clear",
10822
11342
  value: function() {
10823
- var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
10824
- return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
11343
+ var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee11() {
11344
+ return _regeneratorRuntime$1().wrap(function _callee11$(_context11) {
10825
11345
  while (1)
10826
- switch (_context10.prev = _context10.next) {
11346
+ switch (_context11.prev = _context11.next) {
10827
11347
  case 0:
10828
11348
  if (!this._mediaLoader) {
10829
- _context10.next = 3;
11349
+ _context11.next = 3;
10830
11350
  break;
10831
11351
  }
10832
- _context10.next = 3;
11352
+ _context11.next = 3;
10833
11353
  return this._mediaLoader.cancel();
10834
11354
  case 3:
10835
11355
  clearTimeout(this._maxChunkWaitTimer);
@@ -10838,9 +11358,9 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10838
11358
  this._firstProgressEmit = false;
10839
11359
  case 7:
10840
11360
  case "end":
10841
- return _context10.stop();
11361
+ return _context11.stop();
10842
11362
  }
10843
- }, _callee10, this);
11363
+ }, _callee11, this);
10844
11364
  }));
10845
11365
  function _clear() {
10846
11366
  return _clear2.apply(this, arguments);
@@ -10927,9 +11447,13 @@ var PluginExtension = /* @__PURE__ */ function() {
10927
11447
  _createClass$4(PluginExtension2, [{
10928
11448
  key: "_init",
10929
11449
  value: function _init() {
10930
- var _this$_opts2 = this._opts, media = _this$_opts2.media, preloadTime = _this$_opts2.preloadTime, innerDegrade = _this$_opts2.innerDegrade, decodeMode = _this$_opts2.decodeMode;
11450
+ var _this$_opts2 = this._opts, media = _this$_opts2.media, isLive = _this$_opts2.isLive, preloadTime = _this$_opts2.preloadTime, innerDegrade = _this$_opts2.innerDegrade, decodeMode = _this$_opts2.decodeMode;
10931
11451
  if (!media)
10932
11452
  return;
11453
+ if (!isLive && media.setPlayMode) {
11454
+ media.setPlayMode("VOD");
11455
+ return;
11456
+ }
10933
11457
  if (innerDegrade) {
10934
11458
  media.setAttribute("innerdegrade", innerDegrade);
10935
11459
  }
@@ -10967,6 +11491,7 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
10967
11491
  args[_key] = arguments[_key];
10968
11492
  }
10969
11493
  _this = _super.call.apply(_super, [this].concat(args));
11494
+ _defineProperty$3(_assertThisInitialized$3(_this), "logger", logger);
10970
11495
  _defineProperty$3(_assertThisInitialized$3(_this), "flv", null);
10971
11496
  _defineProperty$3(_assertThisInitialized$3(_this), "pluginExtension", null);
10972
11497
  _defineProperty$3(_assertThisInitialized$3(_this), "getStats", function() {
@@ -11034,11 +11559,17 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11034
11559
  var _this$flv3;
11035
11560
  return (_this$flv3 = this.flv) === null || _this$flv3 === void 0 ? void 0 : _this$flv3.loader;
11036
11561
  }
11562
+ }, {
11563
+ key: "transferCost",
11564
+ get: function get() {
11565
+ return this.flv._transferCost.transferCost;
11566
+ }
11037
11567
  }, {
11038
11568
  key: "beforePlayerInit",
11039
11569
  value: function beforePlayerInit() {
11040
11570
  var _this2 = this;
11041
11571
  var config = this.player.config;
11572
+ var mediaElem = this.player.media || this.player.video;
11042
11573
  if (!config.url)
11043
11574
  return;
11044
11575
  if (this.flv)
@@ -11051,10 +11582,10 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11051
11582
  this.flv = new Flv(_objectSpread2$2({
11052
11583
  softDecode: this.softDecode,
11053
11584
  isLive: config.isLive,
11054
- media: this.player.video,
11585
+ media: mediaElem,
11055
11586
  preProcessUrl: function preProcessUrl(url, ext) {
11056
- var _this2$player$preProc, _this2$player;
11057
- return ((_this2$player$preProc = (_this2$player = _this2.player).preProcessUrl) === null || _this2$player$preProc === void 0 ? void 0 : _this2$player$preProc.call(_this2$player, url, ext)) || {
11587
+ var _this2$player, _this2$player$preProc;
11588
+ return ((_this2$player = _this2.player) === null || _this2$player === void 0 ? void 0 : (_this2$player$preProc = _this2$player.preProcessUrl) === null || _this2$player$preProc === void 0 ? void 0 : _this2$player$preProc.call(_this2$player, url, ext)) || {
11058
11589
  url,
11059
11590
  ext
11060
11591
  };
@@ -11073,7 +11604,8 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11073
11604
  }
11074
11605
  if (this.softDecode) {
11075
11606
  this.pluginExtension = new PluginExtension(_objectSpread2$2({
11076
- media: this.player.video
11607
+ media: this.player.video,
11608
+ isLive: config.isLive
11077
11609
  }, config.flv), this);
11078
11610
  this.player.forceDegradeToVideo = function() {
11079
11611
  var _this2$pluginExtensio;
@@ -11100,6 +11632,7 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11100
11632
  this._transCoreEvent(EVENT.LOAD_RETRY);
11101
11633
  this._transCoreEvent(EVENT.SOURCEBUFFER_CREATED);
11102
11634
  this._transCoreEvent(EVENT.ANALYZE_DURATION_EXCEEDED);
11635
+ this._transCoreEvent(EVENT.APPEND_BUFFER);
11103
11636
  this._transCoreEvent(EVENT.REMOVE_BUFFER);
11104
11637
  this._transCoreEvent(EVENT.BUFFEREOS);
11105
11638
  this._transCoreEvent(EVENT.KEYFRAME);