@volcengine/veplayer-plugin 2.5.0-rc.0 → 2.5.1-rc.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 (43) hide show
  1. package/esm/index.d.ts +0 -1
  2. package/esm/index.development.css +0 -7
  3. package/esm/index.development.js +47274 -53342
  4. package/esm/index.production.css +1 -1
  5. package/esm/index.production.js +4 -13
  6. package/esm/veplayer.plugin.abr.development.js +12 -0
  7. package/esm/veplayer.plugin.abr.production.js +1 -1
  8. package/esm/veplayer.plugin.drm.development.js +12 -0
  9. package/esm/veplayer.plugin.drm.production.js +1 -1
  10. package/esm/veplayer.plugin.flv.development.js +675 -194
  11. package/esm/veplayer.plugin.flv.production.js +1 -1
  12. package/esm/veplayer.plugin.hls.development.js +1159 -369
  13. package/esm/veplayer.plugin.hls.production.js +1 -1
  14. package/esm/veplayer.plugin.mp4.development.js +13 -1
  15. package/esm/veplayer.plugin.mp4.production.js +1 -1
  16. package/esm/veplayer.plugin.rtm.development.js +167 -51
  17. package/esm/veplayer.plugin.rtm.production.js +1 -1
  18. package/esm/veplayer.plugin.shaka.development.js +12 -0
  19. package/esm/veplayer.plugin.shaka.production.js +1 -1
  20. package/package.json +1 -1
  21. package/umd/index.d.ts +0 -1
  22. package/umd/veplayer.plugin.abr.development.js +12 -0
  23. package/umd/veplayer.plugin.abr.production.js +1 -1
  24. package/umd/veplayer.plugin.drm.development.js +12 -0
  25. package/umd/veplayer.plugin.drm.production.js +1 -1
  26. package/umd/veplayer.plugin.flv.development.js +675 -194
  27. package/umd/veplayer.plugin.flv.production.js +1 -1
  28. package/umd/veplayer.plugin.hls.development.js +1126 -336
  29. package/umd/veplayer.plugin.hls.production.js +1 -1
  30. package/umd/veplayer.plugin.mp4.development.js +13 -1
  31. package/umd/veplayer.plugin.mp4.production.js +1 -1
  32. package/umd/veplayer.plugin.rtm.development.js +167 -51
  33. package/umd/veplayer.plugin.rtm.production.js +1 -1
  34. package/umd/veplayer.plugin.shaka.development.js +12 -0
  35. package/umd/veplayer.plugin.shaka.production.js +1 -1
  36. package/esm/veplayer.plugin.ad.development.css +0 -7
  37. package/esm/veplayer.plugin.ad.development.js +0 -9042
  38. package/esm/veplayer.plugin.ad.production.css +0 -1
  39. package/esm/veplayer.plugin.ad.production.js +0 -4
  40. package/umd/veplayer.plugin.ad.development.css +0 -7
  41. package/umd/veplayer.plugin.ad.development.js +0 -9045
  42. package/umd/veplayer.plugin.ad.production.css +0 -1
  43. package/umd/veplayer.plugin.ad.production.js +0 -1
@@ -1538,7 +1538,7 @@ util.getCurrentTimeByOffset = function(offsetTime, segments) {
1538
1538
  }
1539
1539
  return offsetTime;
1540
1540
  };
1541
- var version = "3.0.20-alpha.4";
1541
+ var version = "3.0.21-rc.5";
1542
1542
  var ERROR_MAP = {
1543
1543
  1: 5101,
1544
1544
  2: 5102,
@@ -2005,6 +2005,18 @@ var BasePlugin = /* @__PURE__ */ function() {
2005
2005
  }
2006
2006
  }
2007
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
+ }
2008
2020
  }, {
2009
2021
  key: "defaultConfig",
2010
2022
  get: function get() {
@@ -2815,6 +2827,21 @@ var Buffer$1 = /* @__PURE__ */ function() {
2815
2827
  length: Buffer2.totalLength && Buffer2.totalLength(buffers)
2816
2828
  };
2817
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
+ }
2818
2845
  }]);
2819
2846
  return Buffer2;
2820
2847
  }();
@@ -2967,7 +2994,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2967
2994
  this.logCache.apply(this, [LogCacheLevel.DEBUG].concat(args));
2968
2995
  if (Logger2.disabled)
2969
2996
  return;
2970
- (_console = console).debug.apply(_console, [this._prefix, nowTime$1()].concat(args));
2997
+ (_console = console).debug.apply(_console, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2971
2998
  }
2972
2999
  }, {
2973
3000
  key: "log",
@@ -2979,7 +3006,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2979
3006
  this.logCache.apply(this, [LogCacheLevel.LOG].concat(args));
2980
3007
  if (Logger2.disabled)
2981
3008
  return;
2982
- (_console2 = console).log.apply(_console2, [this._prefix, nowTime$1()].concat(args));
3009
+ (_console2 = console).log.apply(_console2, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2983
3010
  }
2984
3011
  }, {
2985
3012
  key: "warn",
@@ -2991,7 +3018,7 @@ var Logger$2 = /* @__PURE__ */ function() {
2991
3018
  this.logCache.apply(this, [LogCacheLevel.WARN].concat(args));
2992
3019
  if (Logger2.disabled)
2993
3020
  return;
2994
- (_console3 = console).warn.apply(_console3, [this._prefix, nowTime$1()].concat(args));
3021
+ (_console3 = console).warn.apply(_console3, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2995
3022
  }
2996
3023
  }, {
2997
3024
  key: "error",
@@ -3003,7 +3030,7 @@ var Logger$2 = /* @__PURE__ */ function() {
3003
3030
  this.logCache.apply(this, [LogCacheLevel.ERROR].concat(args));
3004
3031
  if (Logger2.disabled)
3005
3032
  return;
3006
- (_console4 = console).error.apply(_console4, [this._prefix, nowTime$1()].concat(args));
3033
+ (_console4 = console).error.apply(_console4, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
3007
3034
  }
3008
3035
  }, {
3009
3036
  key: "logCache",
@@ -3018,7 +3045,7 @@ var Logger$2 = /* @__PURE__ */ function() {
3018
3045
  var finLogText = logText.map(function(item) {
3019
3046
  return logable(item);
3020
3047
  });
3021
- text = this._prefix + nowTime$1() + JSON.stringify(finLogText);
3048
+ text = "[".concat(nowTime$1(), "]") + this._prefix + JSON.stringify(finLogText);
3022
3049
  } catch (e) {
3023
3050
  return;
3024
3051
  }
@@ -3934,8 +3961,8 @@ function createResponse(data, done, response, contentLength, age, startTime, fir
3934
3961
  response
3935
3962
  };
3936
3963
  }
3937
- function calculateSpeed(byteLen, millisec) {
3938
- return Math.round(byteLen * 8 * 1e3 / millisec / 1024);
3964
+ function calculateSpeed(byteLen, milliSecond) {
3965
+ return Math.round(byteLen * 8 * 1e3 / milliSecond / 1024);
3939
3966
  }
3940
3967
  var EVENT = {
3941
3968
  ERROR: "error",
@@ -3947,6 +3974,7 @@ var EVENT = {
3947
3974
  SOURCEBUFFER_CREATED: "core.sourcebuffercreated",
3948
3975
  MEDIASOURCE_OPENED: "core.mediasourceopened",
3949
3976
  ANALYZE_DURATION_EXCEEDED: "core.analyzedurationexceeded",
3977
+ APPEND_BUFFER: "core.appendbuffer",
3950
3978
  REMOVE_BUFFER: "core.removebuffer",
3951
3979
  BUFFEREOS: "core.buffereos",
3952
3980
  KEYFRAME: "core.keyframe",
@@ -5579,13 +5607,16 @@ var TrackType = {
5579
5607
  METADATA: "metadata"
5580
5608
  };
5581
5609
  var VideoCodecType = {
5610
+ AV1: "av1",
5582
5611
  AVC: "avc",
5583
5612
  HEVC: "hevc"
5584
5613
  };
5585
5614
  var AudioCodecType = {
5586
5615
  AAC: "aac",
5587
5616
  G711PCMA: "g7110a",
5588
- G711PCMU: "g7110m"
5617
+ G711PCMU: "g7110m",
5618
+ OPUS: "opus",
5619
+ MP3: "mp3"
5589
5620
  };
5590
5621
  var WarningType = {
5591
5622
  LARGE_AV_SHIFT: "LARGE_AV_SHIFT",
@@ -5625,6 +5656,7 @@ var VideoTrack = /* @__PURE__ */ function() {
5625
5656
  _defineProperty(this, "isVideoEncryption", false);
5626
5657
  _defineProperty(this, "isAudioEncryption", false);
5627
5658
  _defineProperty(this, "isVideo", true);
5659
+ _defineProperty(this, "lastKeyFrameDts", 0);
5628
5660
  _defineProperty(this, "kid", null);
5629
5661
  _defineProperty(this, "pssh", null);
5630
5662
  _defineProperty(this, "ext", void 0);
@@ -5667,6 +5699,9 @@ var VideoTrack = /* @__PURE__ */ function() {
5667
5699
  }, {
5668
5700
  key: "exist",
5669
5701
  value: function exist() {
5702
+ if (/av01/.test(this.codec)) {
5703
+ return true;
5704
+ }
5670
5705
  return !!(this.pps.length && this.sps.length && this.codec);
5671
5706
  }
5672
5707
  }, {
@@ -5690,6 +5725,7 @@ var AudioTrack = /* @__PURE__ */ function() {
5690
5725
  _defineProperty(this, "codecType", AudioCodecType.AAC);
5691
5726
  _defineProperty(this, "pid", -1);
5692
5727
  _defineProperty(this, "codec", "");
5728
+ _defineProperty(this, "container", "");
5693
5729
  _defineProperty(this, "sequenceNumber", 0);
5694
5730
  _defineProperty(this, "sampleDuration", 0);
5695
5731
  _defineProperty(this, "timescale", 0);
@@ -5730,7 +5766,7 @@ var AudioTrack = /* @__PURE__ */ function() {
5730
5766
  }, {
5731
5767
  key: "exist",
5732
5768
  value: function exist() {
5733
- 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));
5734
5770
  }
5735
5771
  }, {
5736
5772
  key: "hasSample",
@@ -5944,7 +5980,7 @@ var AAC = /* @__PURE__ */ function() {
5944
5980
  continue;
5945
5981
  }
5946
5982
  frameLength = (data[i + 3] & 3) << 11 | data[i + 4] << 3 | (data[i + 5] & 224) >> 5;
5947
- if (len - i < frameLength)
5983
+ if (!frameLength || len - i < frameLength)
5948
5984
  break;
5949
5985
  protectionSkipBytes = (~data[i + 1] & 1) * 2;
5950
5986
  frames.push({
@@ -6078,14 +6114,57 @@ var AAC = /* @__PURE__ */ function() {
6078
6114
  return AAC2;
6079
6115
  }();
6080
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
+ }();
6081
6160
  var LARGE_AV_FIRST_FRAME_GAP = 500;
6082
6161
  var AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3;
6083
6162
  var MAX_SILENT_FRAME_DURATION = 1e3;
6084
- var AUDIO_EXCETION_LOG_EMIT_DURATION = 5e3;
6163
+ var AUDIO_EXCEPTION_LOG_EMIT_DURATION = 5e3;
6085
6164
  var MAX_VIDEO_FRAME_DURATION = 1e3;
6086
6165
  var MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200;
6087
- var VIDEO_EXCETION_LOG_EMIT_DURATION = 5e3;
6088
- var TRACK_BREACKED_CHECK_TIME = 5;
6166
+ var VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5e3;
6167
+ var TRACK_BROKEN_CHECK_TIME = 5;
6089
6168
  var FlvFixer = /* @__PURE__ */ function() {
6090
6169
  function FlvFixer2(videoTrack, audioTrack, metadataTrack) {
6091
6170
  _classCallCheck$1(this, FlvFixer2);
@@ -6201,7 +6280,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6201
6280
  var firstSample = samples[0];
6202
6281
  var vDelta = this._videoNextDts - firstSample.dts;
6203
6282
  if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {
6204
- 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) {
6205
6284
  var _samples$;
6206
6285
  this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts;
6207
6286
  videoTrack.warnings.push({
@@ -6212,7 +6291,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6212
6291
  sampleDuration: vDelta
6213
6292
  });
6214
6293
  }
6215
- if (this._videoTimestampBreak >= TRACK_BREACKED_CHECK_TIME) {
6294
+ if (this._videoTimestampBreak >= TRACK_BROKEN_CHECK_TIME) {
6216
6295
  this._videoNextDts = firstSample.dts;
6217
6296
  this._videoTimestampBreak = 0;
6218
6297
  } else {
@@ -6235,7 +6314,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6235
6314
  }
6236
6315
  if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {
6237
6316
  this._videoTimestampBreak++;
6238
- if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {
6317
+ if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {
6239
6318
  this._lastVideoExceptionLargeGapDot = dts;
6240
6319
  videoTrack.warnings.push({
6241
6320
  type: WarningType.LARGE_VIDEO_GAP,
@@ -6316,10 +6395,27 @@ var FlvFixer = /* @__PURE__ */ function() {
6316
6395
  key: "_doFixAudioInternal",
6317
6396
  value: function _doFixAudioInternal(audioTrack, samples, timescale) {
6318
6397
  if (!audioTrack.sampleDuration) {
6319
- 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
+ }
6320
6416
  }
6321
6417
  var refSampleDuration = audioTrack.sampleDuration;
6322
- 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;
6323
6419
  if (this._audioNextPts === void 0) {
6324
6420
  var samp0 = samples[0];
6325
6421
  this._audioNextPts = samp0.pts;
@@ -6328,7 +6424,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6328
6424
  var nextPts = this._audioNextPts;
6329
6425
  var sample = samples[i];
6330
6426
  var delta = sample.pts - nextPts;
6331
- if (i === 0 && this._audioTimestampBreak >= TRACK_BREACKED_CHECK_TIME && this._keyFrameInNextChunk) {
6427
+ if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_CHECK_TIME && this._keyFrameInNextChunk) {
6332
6428
  nextPts = this._audioNextPts = sample.dts;
6333
6429
  delta = 0;
6334
6430
  this._audioTimestampBreak = 0;
@@ -6336,7 +6432,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6336
6432
  if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {
6337
6433
  var silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray();
6338
6434
  var count = Math.floor(delta / refSampleDuration);
6339
- 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) {
6340
6436
  this._lastAudioExceptionGapDot = sample.pts;
6341
6437
  audioTrack.warnings.push({
6342
6438
  type: WarningType.AUDIO_FILLED,
@@ -6356,7 +6452,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6356
6452
  }
6357
6453
  i--;
6358
6454
  } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {
6359
- 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) {
6360
6456
  this._lastAudioExceptionOverlapDot = sample.pts;
6361
6457
  audioTrack.warnings.push({
6362
6458
  type: WarningType.AUDIO_DROPPED,
@@ -6371,7 +6467,7 @@ var FlvFixer = /* @__PURE__ */ function() {
6371
6467
  } else {
6372
6468
  if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {
6373
6469
  this._audioTimestampBreak++;
6374
- 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) {
6375
6471
  this._lastAudioExceptionLargeGapDot = sample.pts;
6376
6472
  audioTrack.warnings.push({
6377
6473
  type: WarningType.LARGE_AUDIO_GAP,
@@ -6384,8 +6480,15 @@ var FlvFixer = /* @__PURE__ */ function() {
6384
6480
  });
6385
6481
  }
6386
6482
  }
6387
- sample.dts = sample.pts = nextPts;
6388
- 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
+ }
6389
6492
  this._audioNextPts += refSampleDuration;
6390
6493
  }
6391
6494
  }
@@ -7344,6 +7447,13 @@ var AMF = /* @__PURE__ */ function() {
7344
7447
  }]);
7345
7448
  return AMF2;
7346
7449
  }();
7450
+ var FlvSoundFormat = {
7451
+ MP3: 2,
7452
+ G711A: 7,
7453
+ G711M: 8,
7454
+ AAC: 10,
7455
+ OPUS: 13
7456
+ };
7347
7457
  var logger$2 = new Logger$1("FlvDemuxer");
7348
7458
  var FlvDemuxer = /* @__PURE__ */ function() {
7349
7459
  function FlvDemuxer2(videoTrack, audioTrack, metadataTrack) {
@@ -7360,8 +7470,10 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7360
7470
  _createClass$1(FlvDemuxer2, [{
7361
7471
  key: "demux",
7362
7472
  value: function demux(data) {
7473
+ var _scriptDataObject$dat;
7363
7474
  var discontinuity = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
7364
7475
  var contiguous = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
7476
+ var seamlessLoadingSwitching = arguments.length > 3 ? arguments[3] : void 0;
7365
7477
  var audioTrack = this.audioTrack, videoTrack = this.videoTrack, metadataTrack = this.metadataTrack;
7366
7478
  if (discontinuity || !contiguous) {
7367
7479
  this._remainingData = null;
@@ -7419,6 +7531,8 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7419
7531
  if (tagType === 8) {
7420
7532
  this._parseAudio(bodyData, timestamp);
7421
7533
  } else if (tagType === 9) {
7534
+ if (seamlessLoadingSwitching)
7535
+ this.seamlessLoadingSwitching = true;
7422
7536
  this._parseVideo(bodyData, timestamp);
7423
7537
  } else if (tagType === 18) {
7424
7538
  this._parseScript(bodyData, timestamp);
@@ -7436,13 +7550,31 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7436
7550
  this._remainingData = data.subarray(offset);
7437
7551
  }
7438
7552
  audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1e3;
7439
- audioTrack.timescale = audioTrack.sampleRate || 0;
7553
+ audioTrack.timescale = audioTrack.codecType === AudioCodecType.OPUS ? 1e3 : audioTrack.sampleRate || 0;
7440
7554
  if (!audioTrack.exist() && audioTrack.hasSample()) {
7441
7555
  audioTrack.reset();
7442
7556
  }
7443
7557
  if (!videoTrack.exist() && videoTrack.hasSample()) {
7444
7558
  videoTrack.reset();
7445
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
+ }
7446
7578
  return {
7447
7579
  videoTrack,
7448
7580
  audioTrack,
@@ -7461,8 +7593,8 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7461
7593
  }
7462
7594
  }, {
7463
7595
  key: "demuxAndFix",
7464
- value: function demuxAndFix(data, discontinuity, contiguous, startTime) {
7465
- this.demux(data, discontinuity, contiguous);
7596
+ value: function demuxAndFix(data, discontinuity, contiguous, startTime, seamlessLoadingSwitching) {
7597
+ this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching);
7466
7598
  return this.fix(startTime, discontinuity, contiguous);
7467
7599
  }
7468
7600
  }, {
@@ -7472,12 +7604,12 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7472
7604
  return;
7473
7605
  var format = (data[0] & 240) >>> 4;
7474
7606
  var track = this.audioTrack;
7475
- if (format !== 10 && format !== 7 && format !== 8) {
7607
+ if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.G711A && format !== FlvSoundFormat.G711M && format !== FlvSoundFormat.OPUS) {
7476
7608
  logger$2.warn("Unsupported sound format: ".concat(format));
7477
7609
  track.reset();
7478
7610
  return;
7479
7611
  }
7480
- if (format !== 10) {
7612
+ if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {
7481
7613
  var soundRate = (data[0] & 12) >> 2;
7482
7614
  var soundSize = (data[0] & 2) >> 1;
7483
7615
  var soundType = data[0] & 1;
@@ -7485,20 +7617,63 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7485
7617
  track.sampleSize = soundSize ? 16 : 8;
7486
7618
  track.channelCount = soundType + 1;
7487
7619
  }
7488
- if (format === 10) {
7489
- this._parseAac(data, pts);
7490
- } else {
7491
- 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));
7492
7663
  }
7493
7664
  }
7494
7665
  }, {
7495
7666
  key: "_parseG711",
7496
7667
  value: function _parseG711(data, pts, format) {
7497
7668
  var track = this.audioTrack;
7669
+ var audioData = data.subarray(1);
7670
+ if (audioData.byteLength < 1)
7671
+ return;
7672
+ var sample = new AudioSample(pts, audioData);
7498
7673
  track.codecType = format === 7 ? AudioCodecType.G711PCMA : AudioCodecType.G711PCMU;
7499
7674
  track.sampleRate = 8e3;
7500
7675
  track.codec = track.codecType;
7501
- track.samples.push(new AudioSample(pts, data.subarray(1)));
7676
+ track.samples.push(sample);
7502
7677
  }
7503
7678
  }, {
7504
7679
  key: "_parseAac",
@@ -7576,8 +7751,13 @@ var FlvDemuxer = /* @__PURE__ */ function() {
7576
7751
  units = this._checkAddMetaNalToUnits(isHevc, units, track);
7577
7752
  if (units && units.length) {
7578
7753
  var sample = new VideoSample(dts + cts, dts, units);
7754
+ if (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {
7755
+ return;
7756
+ }
7757
+ this.seamlessLoadingSwitching = false;
7579
7758
  if (frameType === 1) {
7580
7759
  sample.setToKeyframe();
7760
+ track.lastKeyFrameDts = dts;
7581
7761
  }
7582
7762
  track.samples.push(sample);
7583
7763
  units.forEach(function(unit) {
@@ -8051,10 +8231,16 @@ var MP4 = /* @__PURE__ */ function() {
8051
8231
  if (track.useEME && track.enca) {
8052
8232
  content = MP42.enca(track);
8053
8233
  } else {
8054
- content = MP42.mp4a(track);
8234
+ if (track.codecType === AudioCodecType.OPUS) {
8235
+ content = MP42.opus(track);
8236
+ } else {
8237
+ content = MP42.mp4a(track);
8238
+ }
8055
8239
  }
8056
8240
  } else if (track.useEME && track.encv) {
8057
8241
  content = MP42.encv(track);
8242
+ } else if (track.av1C) {
8243
+ content = MP42.av01(track);
8058
8244
  } else {
8059
8245
  content = MP42.avc1hev1(track);
8060
8246
  }
@@ -8267,6 +8453,90 @@ var MP4 = /* @__PURE__ */ function() {
8267
8453
  var schi = MP42.schi(data);
8268
8454
  return MP42.box(MP42.types.sinf, content, MP42.box(MP42.types.frma, frma), MP42.box(MP42.types.schm, schm), schi);
8269
8455
  }
8456
+ }, {
8457
+ key: "av01",
8458
+ value: function av01(track) {
8459
+ return MP42.box(MP42.types.av01, new Uint8Array([
8460
+ 0,
8461
+ 0,
8462
+ 0,
8463
+ 0,
8464
+ 0,
8465
+ 0,
8466
+ 0,
8467
+ 1,
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
+ 0,
8481
+ 0,
8482
+ 0,
8483
+ 0,
8484
+ track.width >> 8 & 255,
8485
+ track.width & 255,
8486
+ track.height >> 8 & 255,
8487
+ track.height & 255,
8488
+ 0,
8489
+ 72,
8490
+ 0,
8491
+ 0,
8492
+ 0,
8493
+ 72,
8494
+ 0,
8495
+ 0,
8496
+ 0,
8497
+ 0,
8498
+ 0,
8499
+ 0,
8500
+ 0,
8501
+ 1,
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
+ 0,
8532
+ 0,
8533
+ 0,
8534
+ 0,
8535
+ 24,
8536
+ 17,
8537
+ 17
8538
+ ]), track.av1C, track.colr);
8539
+ }
8270
8540
  }, {
8271
8541
  key: "avc1hev1",
8272
8542
  value: function avc1hev1(track) {
@@ -8637,6 +8907,53 @@ var MP4 = /* @__PURE__ */ function() {
8637
8907
  )));
8638
8908
  return esds2;
8639
8909
  }
8910
+ }, {
8911
+ key: "opus",
8912
+ value: function opus(track) {
8913
+ var opusAudioDescription = new Uint8Array([
8914
+ 0,
8915
+ 0,
8916
+ 0,
8917
+ 0,
8918
+ 0,
8919
+ 0,
8920
+ 0,
8921
+ 1,
8922
+ 0,
8923
+ 0,
8924
+ 0,
8925
+ 0,
8926
+ 0,
8927
+ 0,
8928
+ 0,
8929
+ 0,
8930
+ 0,
8931
+ track.channelCount,
8932
+ 0,
8933
+ 16,
8934
+ 0,
8935
+ 0,
8936
+ 0,
8937
+ 0,
8938
+ track.sampleRate >> 8 & 255,
8939
+ track.sampleRate & 255,
8940
+ 0,
8941
+ 0
8942
+ ]);
8943
+ var opusSpecificConfig = track.config.length ? MP42.dOps(track) : [];
8944
+ return MP42.box(MP42.types.Opus, opusAudioDescription, opusSpecificConfig);
8945
+ }
8946
+ }, {
8947
+ key: "dOps",
8948
+ value: function dOps(track) {
8949
+ if (track.config) {
8950
+ track.config[4] = track.sampleRate >>> 24 & 255;
8951
+ track.config[5] = track.sampleRate >>> 16 & 255;
8952
+ track.config[6] = track.sampleRate >>> 8 & 255;
8953
+ track.config[7] = track.sampleRate & 255;
8954
+ return MP42.box(MP42.types.dOps, track.config);
8955
+ }
8956
+ }
8640
8957
  }, {
8641
8958
  key: "mvex",
8642
8959
  value: function mvex(tracks) {
@@ -9239,7 +9556,7 @@ var MP4 = /* @__PURE__ */ function() {
9239
9556
  }]);
9240
9557
  return MP42;
9241
9558
  }();
9242
- _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) {
9559
+ _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) {
9243
9560
  p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)];
9244
9561
  return p;
9245
9562
  }, /* @__PURE__ */ Object.create(null)));
@@ -9574,30 +9891,46 @@ var FMP4Remuxer = /* @__PURE__ */ function() {
9574
9891
  };
9575
9892
  }
9576
9893
  var samples = track.samples;
9894
+ var isAV01 = /av01/.test(track.codec);
9577
9895
  var mdatSize = 0;
9578
- samples.forEach(function(s) {
9579
- mdatSize += s.units.reduce(function(t, c) {
9580
- return t + c.byteLength;
9581
- }, 0);
9582
- mdatSize += s.units.length * 4;
9583
- });
9584
- var mdata = new Uint8Array(mdatSize);
9585
- var mdatView = new DataView(mdata.buffer);
9586
- var _loop = function _loop2(_offset, _sample) {
9587
- _sample = samples[i];
9588
- var sampleSize = 0;
9589
- _sample.units.forEach(function(u) {
9590
- mdatView.setUint32(_offset, u.byteLength);
9591
- _offset += 4;
9592
- mdata.set(u, _offset);
9593
- _offset += u.byteLength;
9594
- sampleSize += 4 + u.byteLength;
9896
+ if (isAV01) {
9897
+ samples.forEach(function(s) {
9898
+ mdatSize += s.data.byteLength;
9899
+ });
9900
+ } else {
9901
+ samples.forEach(function(s) {
9902
+ mdatSize += s.units.reduce(function(t, c) {
9903
+ return t + c.byteLength;
9904
+ }, 0);
9905
+ mdatSize += s.units.length * 4;
9595
9906
  });
9596
- _sample.size = sampleSize;
9597
- offset = _offset, sample = _sample;
9598
- };
9599
- for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
9600
- _loop(offset, sample);
9907
+ }
9908
+ var mdata = new Uint8Array(mdatSize);
9909
+ if (isAV01) {
9910
+ for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
9911
+ sample = samples[i];
9912
+ mdata.set(sample.data, offset);
9913
+ sample.size = sample.data.byteLength;
9914
+ offset += sample.size;
9915
+ }
9916
+ } else {
9917
+ var mdatView = new DataView(mdata.buffer);
9918
+ var _loop = function _loop2(_offset2, _sample2) {
9919
+ _sample2 = samples[_i];
9920
+ var sampleSize = 0;
9921
+ _sample2.units.forEach(function(u) {
9922
+ mdatView.setUint32(_offset2, u.byteLength);
9923
+ _offset2 += 4;
9924
+ mdata.set(u, _offset2);
9925
+ _offset2 += u.byteLength;
9926
+ sampleSize += 4 + u.byteLength;
9927
+ });
9928
+ _sample2.size = sampleSize;
9929
+ _offset = _offset2, _sample = _sample2;
9930
+ };
9931
+ for (var _i = 0, _l = samples.length, _offset = 0, _sample; _i < _l; _i++) {
9932
+ _loop(_offset, _sample);
9933
+ }
9601
9934
  }
9602
9935
  var mdat = MP4.mdat(mdata);
9603
9936
  var moof = MP4.moof([track]);
@@ -9627,6 +9960,55 @@ var FMP4Remuxer = /* @__PURE__ */ function() {
9627
9960
  }]);
9628
9961
  return FMP4Remuxer2;
9629
9962
  }();
9963
+ var TransferCost = /* @__PURE__ */ function() {
9964
+ function TransferCost2() {
9965
+ _classCallCheck$4(this, TransferCost2);
9966
+ _defineProperty$3(this, "_ttfb", 0);
9967
+ _defineProperty$3(this, "_demuxStart", 0);
9968
+ _defineProperty$3(this, "_demuxEnd", 0);
9969
+ _defineProperty$3(this, "_demuxCost", 0);
9970
+ _defineProperty$3(this, "_remuxStart", 0);
9971
+ _defineProperty$3(this, "_remuxEnd", 0);
9972
+ _defineProperty$3(this, "_remuxCost", 0);
9973
+ _defineProperty$3(this, "_appendStart", 0);
9974
+ _defineProperty$3(this, "_appendEnd", 0);
9975
+ _defineProperty$3(this, "_appendCost", 0);
9976
+ }
9977
+ _createClass$4(TransferCost2, [{
9978
+ key: "set",
9979
+ value: function set(event, value) {
9980
+ this["_".concat(event)] = value;
9981
+ }
9982
+ }, {
9983
+ key: "start",
9984
+ value: function start(event) {
9985
+ this["_".concat(event, "Start")] = Date.now();
9986
+ }
9987
+ }, {
9988
+ key: "end",
9989
+ value: function end(event) {
9990
+ this["_".concat(event, "End")] = Date.now();
9991
+ this["_".concat(event, "Cost")] = this["_".concat(event, "Cost")] + (this["_".concat(event, "End")] - this["_".concat(event, "Start")]);
9992
+ }
9993
+ }, {
9994
+ key: "transferCost",
9995
+ get: function get() {
9996
+ return {
9997
+ ttfbCost: this._ttfb,
9998
+ demuxCost: this._demuxCost,
9999
+ remuxCost: this._remuxCost,
10000
+ appendCost: this._appendCost
10001
+ };
10002
+ }
10003
+ }]);
10004
+ return TransferCost2;
10005
+ }();
10006
+ var TRANSFER_EVENT = {
10007
+ TTFB: "ttfb",
10008
+ DEMUX: "demux",
10009
+ REMUX: "remux",
10010
+ APPEND: "append"
10011
+ };
9630
10012
  var logger$1 = new Logger$2("BufferService");
9631
10013
  var BufferService = /* @__PURE__ */ function() {
9632
10014
  function BufferService2(flv, softVideo) {
@@ -9714,7 +10096,8 @@ var BufferService = /* @__PURE__ */ function() {
9714
10096
  this._contiguous = false;
9715
10097
  this._sourceCreated = false;
9716
10098
  this._initSegmentId = "";
9717
- case 11:
10099
+ this.resetSeamlessSwitchStats();
10100
+ case 12:
9718
10101
  case "end":
9719
10102
  return _context.stop();
9720
10103
  }
@@ -9725,6 +10108,15 @@ var BufferService = /* @__PURE__ */ function() {
9725
10108
  }
9726
10109
  return reset;
9727
10110
  }()
10111
+ }, {
10112
+ key: "resetSeamlessSwitchStats",
10113
+ value: function resetSeamlessSwitchStats() {
10114
+ this.seamlessLoadingSwitch = null;
10115
+ this.seamlessLoadingSwitching = false;
10116
+ if (this._demuxer) {
10117
+ this._demuxer.seamlessLoadingSwitching = false;
10118
+ }
10119
+ }
9728
10120
  }, {
9729
10121
  key: "endOfStream",
9730
10122
  value: function() {
@@ -9830,32 +10222,56 @@ var BufferService = /* @__PURE__ */ function() {
9830
10222
  key: "appendBuffer",
9831
10223
  value: function() {
9832
10224
  var _appendBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(chunk) {
9833
- var demuxer, videoTrack, audioTrack, metadataTrack, videoExist, audioExist, duration, track, videoType, audioType, mse, newId, remuxResult, p;
10225
+ var _this = this;
10226
+ var switchingNoReset, demuxer, videoTrack, audioTrack, metadataTrack, idx, videoExist, audioExist, duration, track, videoType, audioType, mse, afterAppend, newId, remuxResult, p;
9834
10227
  return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
9835
10228
  while (1)
9836
10229
  switch (_context5.prev = _context5.next) {
9837
10230
  case 0:
10231
+ switchingNoReset = false;
9838
10232
  if (this._cachedBuffer) {
9839
10233
  chunk = concatUint8Array$1(this._cachedBuffer, chunk);
9840
10234
  this._cachedBuffer = null;
9841
10235
  }
9842
10236
  demuxer = this._demuxer;
9843
10237
  if (!(!chunk || !chunk.length || !demuxer)) {
9844
- _context5.next = 4;
10238
+ _context5.next = 5;
9845
10239
  break;
9846
10240
  }
9847
10241
  return _context5.abrupt("return");
9848
- case 4:
9849
- _context5.prev = 4;
9850
- demuxer.demuxAndFix(chunk, this._discontinuity, this._contiguous, this._demuxStartTime);
9851
- _context5.next = 11;
10242
+ case 5:
10243
+ _context5.prev = 5;
10244
+ this.flv._transferCost.start(TRANSFER_EVENT.DEMUX);
10245
+ demuxer.demuxAndFix(chunk, this.seamlessLoadingSwitching || this._discontinuity, this._contiguous, this._demuxStartTime, this.seamlessLoadingSwitching);
10246
+ this.seamlessLoadingSwitching = false;
10247
+ this.flv._transferCost.end(TRANSFER_EVENT.DEMUX);
10248
+ _context5.next = 15;
9852
10249
  break;
9853
- case 8:
9854
- _context5.prev = 8;
9855
- _context5.t0 = _context5["catch"](4);
10250
+ case 12:
10251
+ _context5.prev = 12;
10252
+ _context5.t0 = _context5["catch"](5);
9856
10253
  throw new StreamingError(ERR.DEMUX, ERR.SUB_TYPES.FLV, _context5.t0);
9857
- case 11:
10254
+ case 15:
9858
10255
  videoTrack = demuxer.videoTrack, audioTrack = demuxer.audioTrack, metadataTrack = demuxer.metadataTrack;
10256
+ if (!this.seamlessLoadingSwitch) {
10257
+ _context5.next = 25;
10258
+ break;
10259
+ }
10260
+ idx = videoTrack.samples.findIndex(function(sample) {
10261
+ return sample.originDts === videoTrack.lastKeyFrameDts;
10262
+ });
10263
+ if (!(idx >= 0)) {
10264
+ _context5.next = 25;
10265
+ break;
10266
+ }
10267
+ videoTrack.samples.splice(idx);
10268
+ _context5.next = 22;
10269
+ return this.seamlessLoadingSwitch();
10270
+ case 22:
10271
+ this.seamlessLoadingSwitch = null;
10272
+ chunk = null;
10273
+ switchingNoReset = true;
10274
+ case 25:
9859
10275
  videoExist = videoTrack.exist();
9860
10276
  audioExist = audioTrack.exist();
9861
10277
  if (this._opts.onlyAudio) {
@@ -9867,7 +10283,7 @@ var BufferService = /* @__PURE__ */ function() {
9867
10283
  audioTrack.present = false;
9868
10284
  }
9869
10285
  if (!(!videoExist && videoTrack.present || !audioExist && audioTrack.present)) {
9870
- _context5.next = 29;
10286
+ _context5.next = 42;
9871
10287
  break;
9872
10288
  }
9873
10289
  duration = 0;
@@ -9876,7 +10292,7 @@ var BufferService = /* @__PURE__ */ function() {
9876
10292
  duration = (track.samples[track.samples.length - 1].originPts - track.samples[0].originPts) / track.timescale * 1e3;
9877
10293
  }
9878
10294
  if (!(duration > this._opts.analyzeDuration)) {
9879
- _context5.next = 27;
10295
+ _context5.next = 40;
9880
10296
  break;
9881
10297
  }
9882
10298
  logger$1.warn("analyze duration exceeded, ".concat(duration, "ms"), track);
@@ -9885,19 +10301,28 @@ var BufferService = /* @__PURE__ */ function() {
9885
10301
  this.flv.emit(EVENT.ANALYZE_DURATION_EXCEEDED, {
9886
10302
  duration
9887
10303
  });
9888
- _context5.next = 29;
10304
+ _context5.next = 42;
9889
10305
  break;
9890
- case 27:
10306
+ case 40:
9891
10307
  this._cachedBuffer = chunk;
9892
10308
  return _context5.abrupt("return");
9893
- case 29:
10309
+ case 42:
9894
10310
  videoType = videoTrack.type;
9895
10311
  audioType = audioTrack.type;
9896
10312
  this._fireEvents(videoTrack, audioTrack, metadataTrack);
9897
- this._discontinuity = false;
9898
- this._contiguous = true;
9899
- this._demuxStartTime = 0;
10313
+ if (!switchingNoReset) {
10314
+ this._discontinuity = false;
10315
+ this._contiguous = true;
10316
+ this._demuxStartTime = 0;
10317
+ }
9900
10318
  mse = this._mse;
10319
+ afterAppend = function afterAppend2() {
10320
+ var _this$flv;
10321
+ if ((_this$flv = _this.flv) !== null && _this$flv !== void 0 && _this$flv.emit) {
10322
+ var _this$flv2;
10323
+ (_this$flv2 = _this.flv) === null || _this$flv2 === void 0 ? void 0 : _this$flv2.emit(EVENT.APPEND_BUFFER, {});
10324
+ }
10325
+ };
9901
10326
  this.flv.emit(EVENT.DEMUXED_TRACK, {
9902
10327
  videoTrack
9903
10328
  });
@@ -9908,16 +10333,16 @@ var BufferService = /* @__PURE__ */ function() {
9908
10333
  this._emitMetaParsedEvent(videoTrack, audioTrack);
9909
10334
  }
9910
10335
  if (!mse) {
9911
- _context5.next = 66;
10336
+ _context5.next = 81;
9912
10337
  break;
9913
10338
  }
9914
10339
  if (this._sourceCreated) {
9915
- _context5.next = 47;
10340
+ _context5.next = 59;
9916
10341
  break;
9917
10342
  }
9918
- _context5.next = 43;
10343
+ _context5.next = 55;
9919
10344
  return mse.open();
9920
- case 43:
10345
+ case 55:
9921
10346
  if (videoExist) {
9922
10347
  logger$1.log("codec: video/mp4;codecs=".concat(videoTrack.codec));
9923
10348
  mse.createSource(videoType, "video/mp4;codecs=".concat(videoTrack.codec));
@@ -9928,26 +10353,28 @@ var BufferService = /* @__PURE__ */ function() {
9928
10353
  }
9929
10354
  this._sourceCreated = true;
9930
10355
  this.flv.emit(EVENT.SOURCEBUFFER_CREATED);
9931
- case 47:
9932
- _context5.prev = 47;
10356
+ case 59:
10357
+ _context5.prev = 59;
9933
10358
  if (this._needInitSegment && !this._opts.mseLowLatency) {
9934
10359
  videoTrack.duration = this._opts.durationForMSELowLatencyOff * videoTrack.timescale;
9935
10360
  audioTrack.duration = this._opts.durationForMSELowLatencyOff * audioExist.timescale;
9936
10361
  }
10362
+ this.flv._transferCost.start(TRANSFER_EVENT.REMUX);
9937
10363
  remuxResult = this._remuxer.remux(this._needInitSegment);
9938
- _context5.next = 55;
10364
+ this.flv._transferCost.end(TRANSFER_EVENT.REMUX);
10365
+ _context5.next = 69;
9939
10366
  break;
9940
- case 52:
9941
- _context5.prev = 52;
9942
- _context5.t1 = _context5["catch"](47);
10367
+ case 66:
10368
+ _context5.prev = 66;
10369
+ _context5.t1 = _context5["catch"](59);
9943
10370
  throw new StreamingError(ERR.REMUX, ERR.SUB_TYPES.FMP4, _context5.t1);
9944
- case 55:
10371
+ case 69:
9945
10372
  if (!(this._needInitSegment && !remuxResult.videoInitSegment && !remuxResult.audioInitSegment)) {
9946
- _context5.next = 57;
10373
+ _context5.next = 71;
9947
10374
  break;
9948
10375
  }
9949
10376
  return _context5.abrupt("return");
9950
- case 57:
10377
+ case 71:
9951
10378
  this._needInitSegment = false;
9952
10379
  p = [];
9953
10380
  if (remuxResult.videoInitSegment)
@@ -9958,16 +10385,21 @@ var BufferService = /* @__PURE__ */ function() {
9958
10385
  p.push(mse.append(videoType, remuxResult.videoSegment));
9959
10386
  if (remuxResult.audioSegment)
9960
10387
  p.push(mse.append(audioType, remuxResult.audioSegment));
9961
- return _context5.abrupt("return", Promise.all(p));
9962
- case 66:
10388
+ this.flv._transferCost.start(TRANSFER_EVENT.APPEND);
10389
+ return _context5.abrupt("return", Promise.all(p).then(afterAppend).then(function() {
10390
+ _this.flv._transferCost.end(TRANSFER_EVENT.APPEND);
10391
+ afterAppend();
10392
+ }));
10393
+ case 81:
9963
10394
  if (this._softVideo) {
9964
10395
  this._softVideo.appendBuffer(videoTrack, audioTrack);
10396
+ afterAppend();
9965
10397
  }
9966
- case 67:
10398
+ case 82:
9967
10399
  case "end":
9968
10400
  return _context5.stop();
9969
10401
  }
9970
- }, _callee5, this, [[4, 8], [47, 52]]);
10402
+ }, _callee5, this, [[5, 12], [59, 66]]);
9971
10403
  }));
9972
10404
  function appendBuffer(_x2) {
9973
10405
  return _appendBuffer.apply(this, arguments);
@@ -9978,7 +10410,7 @@ var BufferService = /* @__PURE__ */ function() {
9978
10410
  key: "evictBuffer",
9979
10411
  value: function() {
9980
10412
  var _evictBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(bufferBehind) {
9981
- var _this = this;
10413
+ var _this2 = this;
9982
10414
  var media, currentTime, removeEnd, start;
9983
10415
  return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
9984
10416
  while (1)
@@ -10007,7 +10439,7 @@ var BufferService = /* @__PURE__ */ function() {
10007
10439
  return _context6.abrupt("return");
10008
10440
  case 10:
10009
10441
  return _context6.abrupt("return", this._mse.clearBuffer(0, removeEnd).then(function() {
10010
- return _this.flv.emit(EVENT.REMOVE_BUFFER, {
10442
+ return _this2.flv.emit(EVENT.REMOVE_BUFFER, {
10011
10443
  removeEnd
10012
10444
  });
10013
10445
  }));
@@ -10057,16 +10489,16 @@ var BufferService = /* @__PURE__ */ function() {
10057
10489
  }, {
10058
10490
  key: "_fireEvents",
10059
10491
  value: function _fireEvents(videoTrack, audioTrack, metadataTrack) {
10060
- var _this2 = this;
10061
- logger$1.debug(videoTrack.samples, audioTrack.samples);
10492
+ var _this3 = this;
10493
+ logger$1.debug("videoTrack samples count: ".concat(videoTrack.samples.length, ", audioTrack samples count: ").concat(audioTrack.samples.length));
10062
10494
  metadataTrack.flvScriptSamples.forEach(function(sample) {
10063
- _this2.flv.emit(EVENT.FLV_SCRIPT_DATA, sample);
10495
+ _this3.flv.emit(EVENT.FLV_SCRIPT_DATA, sample);
10064
10496
  logger$1.debug("flvScriptData", sample);
10065
10497
  });
10066
10498
  videoTrack.samples.forEach(function(sample) {
10067
10499
  if (sample.keyframe) {
10068
- _this2.flv.emit(EVENT.KEYFRAME, {
10069
- pts: sample.pts
10500
+ _this3.flv.emit(EVENT.KEYFRAME, {
10501
+ pts: sample.originPts
10070
10502
  });
10071
10503
  }
10072
10504
  });
@@ -10084,7 +10516,7 @@ var BufferService = /* @__PURE__ */ function() {
10084
10516
  break;
10085
10517
  }
10086
10518
  if (type)
10087
- _this2.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10519
+ _this3.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10088
10520
  type
10089
10521
  }));
10090
10522
  logger$1.warn("video exception", warn);
@@ -10103,13 +10535,13 @@ var BufferService = /* @__PURE__ */ function() {
10103
10535
  break;
10104
10536
  }
10105
10537
  if (type)
10106
- _this2.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10538
+ _this3.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10107
10539
  type
10108
10540
  }));
10109
10541
  logger$1.warn("audio exception", warn);
10110
10542
  });
10111
10543
  metadataTrack.seiSamples.forEach(function(sei) {
10112
- _this2.flv.emit(EVENT.SEI, _objectSpread2$2(_objectSpread2$2({}, sei), {}, {
10544
+ _this3.flv.emit(EVENT.SEI, _objectSpread2$2(_objectSpread2$2({}, sei), {}, {
10113
10545
  sei: {
10114
10546
  code: sei.data.type,
10115
10547
  content: sei.data.payload,
@@ -10144,7 +10576,8 @@ function getOption(opts) {
10144
10576
  durationForMSELowLatencyOff: 6,
10145
10577
  chunkCountForSpeed: 50,
10146
10578
  skipChunkSize: 1e3,
10147
- longtimeNoReceived: 3e3
10579
+ longtimeNoReceived: 3e3,
10580
+ enableStartGapJump: true
10148
10581
  }, opts);
10149
10582
  if (ret.isLive) {
10150
10583
  if (ret.preloadTime) {
@@ -10212,7 +10645,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10212
10645
  _defineProperty$3(_assertThisInitialized$3(_this), "_acceptRanges", true);
10213
10646
  _defineProperty$3(_assertThisInitialized$3(_this), "_onProgress", /* @__PURE__ */ function() {
10214
10647
  var _ref2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee(chunk, done, _ref, response) {
10215
- var startTime, endTime, st, firstByteTime, _this$_mediaLoader, headers, _this$_bufferService, remaining, maxReaderInterval;
10648
+ var startTime, endTime, st, firstByteTime, _this$_mediaLoader, headers, elapsed, _this$_bufferService, remaining, maxReaderInterval;
10216
10649
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
10217
10650
  while (1)
10218
10651
  switch (_context.prev = _context.next) {
@@ -10220,7 +10653,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10220
10653
  startTime = _ref.startTime, endTime = _ref.endTime, st = _ref.st, firstByteTime = _ref.firstByteTime;
10221
10654
  _this._loading = !done;
10222
10655
  if (_this._firstProgressEmit) {
10223
- _context.next = 11;
10656
+ _context.next = 13;
10224
10657
  break;
10225
10658
  }
10226
10659
  if (_this.media) {
@@ -10231,49 +10664,51 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10231
10664
  return _context.abrupt("return");
10232
10665
  case 6:
10233
10666
  headers = response.headers;
10667
+ elapsed = st ? firstByteTime - st : endTime - startTime;
10234
10668
  _this.emit(EVENT.TTFB, {
10235
10669
  url: _this._opts.url,
10236
10670
  responseUrl: response.url,
10237
- elapsed: st ? firstByteTime - st : endTime - startTime
10671
+ elapsed
10238
10672
  });
10239
10673
  _this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
10240
10674
  headers
10241
10675
  });
10676
+ _this._transferCost.set(TRANSFER_EVENT.TTFB, elapsed);
10242
10677
  _this._acceptRanges = !!(headers !== null && headers !== void 0 && headers.get("Accept-Ranges")) || !!(headers !== null && headers !== void 0 && headers.get("Content-Range"));
10243
10678
  _this._firstProgressEmit = true;
10244
- case 11:
10679
+ case 13:
10245
10680
  if (_this._bufferService) {
10246
- _context.next = 13;
10681
+ _context.next = 15;
10247
10682
  break;
10248
10683
  }
10249
10684
  return _context.abrupt("return");
10250
- case 13:
10685
+ case 15:
10251
10686
  clearTimeout(_this._maxChunkWaitTimer);
10252
10687
  _this._bandwidthService.addChunkRecord(chunk === null || chunk === void 0 ? void 0 : chunk.byteLength, endTime - startTime);
10253
- _context.prev = 15;
10254
- _context.next = 18;
10688
+ _context.prev = 17;
10689
+ _context.next = 20;
10255
10690
  return _this._bufferService.appendBuffer(chunk);
10256
- case 18:
10691
+ case 20:
10257
10692
  (_this$_bufferService = _this._bufferService) === null || _this$_bufferService === void 0 ? void 0 : _this$_bufferService.evictBuffer(_this._opts.bufferBehind);
10258
- _context.next = 31;
10693
+ _context.next = 33;
10259
10694
  break;
10260
- case 21:
10261
- _context.prev = 21;
10262
- _context.t0 = _context["catch"](15);
10695
+ case 23:
10696
+ _context.prev = 23;
10697
+ _context.t0 = _context["catch"](17);
10263
10698
  if (!(!_this.isLive && _this._bufferService.isFull())) {
10264
- _context.next = 30;
10699
+ _context.next = 32;
10265
10700
  break;
10266
10701
  }
10267
- _context.next = 26;
10702
+ _context.next = 28;
10268
10703
  return _this._mediaLoader.cancel();
10269
- case 26:
10704
+ case 28:
10270
10705
  _this._loading = false;
10271
10706
  remaining = _this.bufferInfo().remaining;
10272
10707
  _this._opts.preloadTime = parseInt(remaining) / 2;
10273
10708
  return _context.abrupt("return");
10274
- case 30:
10709
+ case 32:
10275
10710
  return _context.abrupt("return", _this._emitError(StreamingError.create(_context.t0)));
10276
- case 31:
10711
+ case 33:
10277
10712
  if (_this._urlSwitching) {
10278
10713
  _this._urlSwitching = false;
10279
10714
  _this.emit(EVENT.SWITCH_URL_SUCCESS, {
@@ -10285,7 +10720,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10285
10720
  _this._tick();
10286
10721
  }
10287
10722
  if (!(done && !_this.media.seeking)) {
10288
- _context.next = 38;
10723
+ _context.next = 40;
10289
10724
  break;
10290
10725
  }
10291
10726
  _this.emit(EVENT.LOAD_COMPLETE);
@@ -10294,13 +10729,13 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10294
10729
  _this._end();
10295
10730
  }
10296
10731
  return _context.abrupt("return");
10297
- case 38:
10732
+ case 40:
10298
10733
  if (_this.isLive) {
10299
- _context.next = 40;
10734
+ _context.next = 42;
10300
10735
  break;
10301
10736
  }
10302
10737
  return _context.abrupt("return");
10303
- case 40:
10738
+ case 42:
10304
10739
  maxReaderInterval = _this._opts.maxReaderInterval;
10305
10740
  if (maxReaderInterval && _this._firstProgressEmit) {
10306
10741
  clearTimeout(_this._maxChunkWaitTimer);
@@ -10314,11 +10749,11 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10314
10749
  _this._end();
10315
10750
  }, maxReaderInterval);
10316
10751
  }
10317
- case 42:
10752
+ case 44:
10318
10753
  case "end":
10319
10754
  return _context.stop();
10320
10755
  }
10321
- }, _callee, null, [[15, 21]]);
10756
+ }, _callee, null, [[17, 23]]);
10322
10757
  }));
10323
10758
  return function(_x, _x2, _x3, _x4) {
10324
10759
  return _ref2.apply(this, arguments);
@@ -10351,19 +10786,19 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10351
10786
  if (bufferEnd < MAX_HOLE || !media.readyState)
10352
10787
  return;
10353
10788
  var opts = _this._opts;
10354
- if (isMediaPlaying(media)) {
10789
+ if (isMediaPlaying(media) && media.currentTime) {
10355
10790
  if (_this._gapService) {
10356
10791
  _this._gapService.do(media, opts.maxJumpDistance, _this.isLive, 3);
10357
10792
  }
10358
10793
  } else {
10359
- if (!media.currentTime && _this._gapService) {
10794
+ if (!media.currentTime && _this._gapService && opts.enableStartGapJump) {
10360
10795
  var gapJump = _this._opts.mseLowLatency || _this._opts.mseLowLatency === false && _this.bufferInfo(MAX_START_GAP).nextStart;
10361
10796
  if (gapJump) {
10362
10797
  _this._gapService.do(media, opts.maxJumpDistance, _this.isLive, 3);
10363
10798
  }
10364
10799
  return;
10365
10800
  }
10366
- if (opts.isLive && media.readyState === 4 && bufferEnd > opts.disconnectTime) {
10801
+ if (opts.isLive && media.readyState === 4 && bufferEnd - media.currentTime > opts.disconnectTime) {
10367
10802
  _this.disconnect();
10368
10803
  }
10369
10804
  }
@@ -10512,6 +10947,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10512
10947
  responseType: "arraybuffer"
10513
10948
  }));
10514
10949
  _this._disconnectRetryCount = _this._opts.disconnectRetryCount;
10950
+ _this._transferCost = new TransferCost();
10515
10951
  _this._bufferService = new BufferService(_assertThisInitialized$3(_this), _this._opts.softDecode ? _this.media : void 0, _this._opts);
10516
10952
  _this._seiService = new SeiService(_assertThisInitialized$3(_this));
10517
10953
  _this._bandwidthService = new BandwidthService({
@@ -10535,7 +10971,7 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10535
10971
  _createClass$4(Flv2, [{
10536
10972
  key: "version",
10537
10973
  get: function get() {
10538
- return "3.0.19-rc.0";
10974
+ return "3.0.21-rc.5";
10539
10975
  }
10540
10976
  }, {
10541
10977
  key: "isLive",
@@ -10651,9 +11087,9 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10651
11087
  return this._clear();
10652
11088
  case 8:
10653
11089
  setTimeout(function() {
11090
+ _this2._seamlessSwitching = true;
10654
11091
  _this2._loadData(_this2._opts.url);
10655
11092
  _this2._bufferService.seamlessSwitch();
10656
- _this2._seamlessSwitching = true;
10657
11093
  });
10658
11094
  _context5.next = 13;
10659
11095
  break;
@@ -10677,50 +11113,82 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10677
11113
  }, {
10678
11114
  key: "disconnect",
10679
11115
  value: function disconnect() {
11116
+ var _this$_bufferService4;
10680
11117
  logger.debug("disconnect!");
11118
+ (_this$_bufferService4 = this._bufferService) === null || _this$_bufferService4 === void 0 ? void 0 : _this$_bufferService4.resetSeamlessSwitchStats();
10681
11119
  return this._clear();
10682
11120
  }
10683
11121
  }, {
10684
11122
  key: "switchURL",
10685
11123
  value: function() {
10686
- var _switchURL = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(url, seamless) {
11124
+ var _switchURL = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7(url, seamless) {
10687
11125
  var _this3 = this;
10688
- return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
11126
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
10689
11127
  while (1)
10690
- switch (_context6.prev = _context6.next) {
11128
+ switch (_context7.prev = _context7.next) {
10691
11129
  case 0:
10692
11130
  if (this._bufferService) {
10693
- _context6.next = 2;
11131
+ _context7.next = 2;
10694
11132
  break;
10695
11133
  }
10696
- return _context6.abrupt("return");
11134
+ return _context7.abrupt("return");
10697
11135
  case 2:
10698
11136
  this._resetDisconnectCount();
11137
+ if (!(this._loading && seamless)) {
11138
+ _context7.next = 6;
11139
+ break;
11140
+ }
11141
+ this._bufferService.seamlessLoadingSwitch = /* @__PURE__ */ function() {
11142
+ var _ref5 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(pts) {
11143
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
11144
+ while (1)
11145
+ switch (_context6.prev = _context6.next) {
11146
+ case 0:
11147
+ _context6.next = 2;
11148
+ return _this3._clear();
11149
+ case 2:
11150
+ _this3._bufferService.seamlessLoadingSwitching = true;
11151
+ _this3._urlSwitching = true;
11152
+ _this3._seamlessSwitching = true;
11153
+ _this3._bufferService.seamlessSwitch();
11154
+ _this3._loadData(url);
11155
+ case 7:
11156
+ case "end":
11157
+ return _context6.stop();
11158
+ }
11159
+ }, _callee6);
11160
+ }));
11161
+ return function(_x8) {
11162
+ return _ref5.apply(this, arguments);
11163
+ };
11164
+ }();
11165
+ return _context7.abrupt("return");
11166
+ case 6:
10699
11167
  if (!(!seamless || !this._opts.isLive)) {
10700
- _context6.next = 8;
11168
+ _context7.next = 11;
10701
11169
  break;
10702
11170
  }
10703
- _context6.next = 6;
11171
+ _context7.next = 9;
10704
11172
  return this.load(url);
10705
- case 6:
11173
+ case 9:
10706
11174
  this._urlSwitching = true;
10707
- return _context6.abrupt("return", this.media.play(true).catch(function() {
11175
+ return _context7.abrupt("return", this.media.play(true).catch(function() {
10708
11176
  }));
10709
- case 8:
10710
- _context6.next = 10;
11177
+ case 11:
11178
+ _context7.next = 13;
10711
11179
  return this._clear();
10712
- case 10:
11180
+ case 13:
10713
11181
  setTimeout(function() {
10714
11182
  _this3._urlSwitching = true;
10715
11183
  _this3._seamlessSwitching = true;
10716
11184
  _this3._loadData(url);
10717
11185
  _this3._bufferService.seamlessSwitch();
10718
11186
  });
10719
- case 11:
11187
+ case 14:
10720
11188
  case "end":
10721
- return _context6.stop();
11189
+ return _context7.stop();
10722
11190
  }
10723
- }, _callee6, this);
11191
+ }, _callee7, this);
10724
11192
  }));
10725
11193
  function switchURL(_x6, _x7) {
10726
11194
  return _switchURL.apply(this, arguments);
@@ -10730,16 +11198,16 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10730
11198
  }, {
10731
11199
  key: "destroy",
10732
11200
  value: function() {
10733
- var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7() {
10734
- return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
11201
+ var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
11202
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
10735
11203
  while (1)
10736
- switch (_context7.prev = _context7.next) {
11204
+ switch (_context8.prev = _context8.next) {
10737
11205
  case 0:
10738
11206
  if (this.media) {
10739
- _context7.next = 2;
11207
+ _context8.next = 2;
10740
11208
  break;
10741
11209
  }
10742
- return _context7.abrupt("return");
11210
+ return _context8.abrupt("return");
10743
11211
  case 2:
10744
11212
  this.removeAllListeners();
10745
11213
  this._seiService.reset();
@@ -10749,16 +11217,16 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10749
11217
  this.media.removeEventListener("timeupdate", this._onTimeupdate);
10750
11218
  this.media.removeEventListener("waiting", this._onWaiting);
10751
11219
  this.media.removeEventListener("progress", this._onBufferUpdate);
10752
- _context7.next = 12;
11220
+ _context8.next = 12;
10753
11221
  return Promise.all([this._clear(), this._bufferService.destroy()]);
10754
11222
  case 12:
10755
11223
  this.media = null;
10756
11224
  this._bufferService = null;
10757
11225
  case 14:
10758
11226
  case "end":
10759
- return _context7.stop();
11227
+ return _context8.stop();
10760
11228
  }
10761
- }, _callee7, this);
11229
+ }, _callee8, this);
10762
11230
  }));
10763
11231
  function destroy() {
10764
11232
  return _destroy.apply(this, arguments);
@@ -10787,26 +11255,26 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10787
11255
  }, {
10788
11256
  key: "_reset",
10789
11257
  value: function() {
10790
- var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
10791
- var reuseMse, _args8 = arguments;
10792
- return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
11258
+ var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
11259
+ var reuseMse, _args9 = arguments;
11260
+ return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
10793
11261
  while (1)
10794
- switch (_context8.prev = _context8.next) {
11262
+ switch (_context9.prev = _context9.next) {
10795
11263
  case 0:
10796
- reuseMse = _args8.length > 0 && _args8[0] !== void 0 ? _args8[0] : false;
11264
+ reuseMse = _args9.length > 0 && _args9[0] !== void 0 ? _args9[0] : false;
10797
11265
  this._seiService.reset();
10798
11266
  this._bandwidthService.reset();
10799
11267
  this._stats.reset();
10800
- _context8.next = 6;
11268
+ _context9.next = 6;
10801
11269
  return this._clear();
10802
11270
  case 6:
10803
- _context8.next = 8;
11271
+ _context9.next = 8;
10804
11272
  return this._bufferService.reset(reuseMse);
10805
11273
  case 8:
10806
11274
  case "end":
10807
- return _context8.stop();
11275
+ return _context9.stop();
10808
11276
  }
10809
- }, _callee8, this);
11277
+ }, _callee9, this);
10810
11278
  }));
10811
11279
  function _reset() {
10812
11280
  return _reset2.apply(this, arguments);
@@ -10816,17 +11284,17 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10816
11284
  }, {
10817
11285
  key: "_loadData",
10818
11286
  value: function() {
10819
- var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9(url, range) {
11287
+ var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10(url, range) {
10820
11288
  var finnalUrl;
10821
- return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
11289
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
10822
11290
  while (1)
10823
- switch (_context9.prev = _context9.next) {
11291
+ switch (_context10.prev = _context10.next) {
10824
11292
  case 0:
10825
11293
  if (url)
10826
11294
  this._opts.url = url;
10827
11295
  finnalUrl = url = this._opts.url;
10828
11296
  if (url) {
10829
- _context9.next = 4;
11297
+ _context10.next = 4;
10830
11298
  break;
10831
11299
  }
10832
11300
  throw new Error("Source url is missing");
@@ -10841,34 +11309,34 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10841
11309
  });
10842
11310
  logger.debug("load data, loading:", this._loading, finnalUrl);
10843
11311
  if (!this._loading) {
10844
- _context9.next = 11;
11312
+ _context10.next = 11;
10845
11313
  break;
10846
11314
  }
10847
- _context9.next = 11;
11315
+ _context10.next = 11;
10848
11316
  return this._mediaLoader.cancel();
10849
11317
  case 11:
10850
11318
  this._loading = true;
10851
- _context9.prev = 12;
10852
- _context9.next = 15;
11319
+ _context10.prev = 12;
11320
+ _context10.next = 15;
10853
11321
  return this._mediaLoader.load({
10854
11322
  url: finnalUrl,
10855
11323
  range
10856
11324
  });
10857
11325
  case 15:
10858
- _context9.next = 21;
11326
+ _context10.next = 21;
10859
11327
  break;
10860
11328
  case 17:
10861
- _context9.prev = 17;
10862
- _context9.t0 = _context9["catch"](12);
11329
+ _context10.prev = 17;
11330
+ _context10.t0 = _context10["catch"](12);
10863
11331
  this._loading = false;
10864
- return _context9.abrupt("return", this._emitError(StreamingError.network(_context9.t0), false));
11332
+ return _context10.abrupt("return", this._emitError(StreamingError.network(_context10.t0), false));
10865
11333
  case 21:
10866
11334
  case "end":
10867
- return _context9.stop();
11335
+ return _context10.stop();
10868
11336
  }
10869
- }, _callee9, this, [[12, 17]]);
11337
+ }, _callee10, this, [[12, 17]]);
10870
11338
  }));
10871
- function _loadData(_x8, _x9) {
11339
+ function _loadData(_x9, _x10) {
10872
11340
  return _loadData2.apply(this, arguments);
10873
11341
  }
10874
11342
  return _loadData;
@@ -10876,16 +11344,16 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10876
11344
  }, {
10877
11345
  key: "_clear",
10878
11346
  value: function() {
10879
- var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
10880
- return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
11347
+ var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee11() {
11348
+ return _regeneratorRuntime$1().wrap(function _callee11$(_context11) {
10881
11349
  while (1)
10882
- switch (_context10.prev = _context10.next) {
11350
+ switch (_context11.prev = _context11.next) {
10883
11351
  case 0:
10884
11352
  if (!this._mediaLoader) {
10885
- _context10.next = 3;
11353
+ _context11.next = 3;
10886
11354
  break;
10887
11355
  }
10888
- _context10.next = 3;
11356
+ _context11.next = 3;
10889
11357
  return this._mediaLoader.cancel();
10890
11358
  case 3:
10891
11359
  clearTimeout(this._maxChunkWaitTimer);
@@ -10894,9 +11362,9 @@ var Flv = /* @__PURE__ */ function(_EventEmitter) {
10894
11362
  this._firstProgressEmit = false;
10895
11363
  case 7:
10896
11364
  case "end":
10897
- return _context10.stop();
11365
+ return _context11.stop();
10898
11366
  }
10899
- }, _callee10, this);
11367
+ }, _callee11, this);
10900
11368
  }));
10901
11369
  function _clear() {
10902
11370
  return _clear2.apply(this, arguments);
@@ -10983,9 +11451,13 @@ var PluginExtension = /* @__PURE__ */ function() {
10983
11451
  _createClass$4(PluginExtension2, [{
10984
11452
  key: "_init",
10985
11453
  value: function _init() {
10986
- var _this$_opts2 = this._opts, media = _this$_opts2.media, preloadTime = _this$_opts2.preloadTime, innerDegrade = _this$_opts2.innerDegrade, decodeMode = _this$_opts2.decodeMode;
11454
+ 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;
10987
11455
  if (!media)
10988
11456
  return;
11457
+ if (!isLive && media.setPlayMode) {
11458
+ media.setPlayMode("VOD");
11459
+ return;
11460
+ }
10989
11461
  if (innerDegrade) {
10990
11462
  media.setAttribute("innerdegrade", innerDegrade);
10991
11463
  }
@@ -11023,6 +11495,7 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11023
11495
  args[_key] = arguments[_key];
11024
11496
  }
11025
11497
  _this = _super.call.apply(_super, [this].concat(args));
11498
+ _defineProperty$3(_assertThisInitialized$3(_this), "logger", logger);
11026
11499
  _defineProperty$3(_assertThisInitialized$3(_this), "flv", null);
11027
11500
  _defineProperty$3(_assertThisInitialized$3(_this), "pluginExtension", null);
11028
11501
  _defineProperty$3(_assertThisInitialized$3(_this), "getStats", function() {
@@ -11090,11 +11563,17 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11090
11563
  var _this$flv3;
11091
11564
  return (_this$flv3 = this.flv) === null || _this$flv3 === void 0 ? void 0 : _this$flv3.loader;
11092
11565
  }
11566
+ }, {
11567
+ key: "transferCost",
11568
+ get: function get() {
11569
+ return this.flv._transferCost.transferCost;
11570
+ }
11093
11571
  }, {
11094
11572
  key: "beforePlayerInit",
11095
11573
  value: function beforePlayerInit() {
11096
11574
  var _this2 = this;
11097
11575
  var config = this.player.config;
11576
+ var mediaElem = this.player.media || this.player.video;
11098
11577
  if (!config.url)
11099
11578
  return;
11100
11579
  if (this.flv)
@@ -11107,10 +11586,10 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11107
11586
  this.flv = new Flv(_objectSpread2$2({
11108
11587
  softDecode: this.softDecode,
11109
11588
  isLive: config.isLive,
11110
- media: this.player.video,
11589
+ media: mediaElem,
11111
11590
  preProcessUrl: function preProcessUrl(url, ext) {
11112
- var _this2$player$preProc, _this2$player;
11113
- 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)) || {
11591
+ var _this2$player, _this2$player$preProc;
11592
+ 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)) || {
11114
11593
  url,
11115
11594
  ext
11116
11595
  };
@@ -11129,7 +11608,8 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11129
11608
  }
11130
11609
  if (this.softDecode) {
11131
11610
  this.pluginExtension = new PluginExtension(_objectSpread2$2({
11132
- media: this.player.video
11611
+ media: this.player.video,
11612
+ isLive: config.isLive
11133
11613
  }, config.flv), this);
11134
11614
  this.player.forceDegradeToVideo = function() {
11135
11615
  var _this2$pluginExtensio;
@@ -11156,6 +11636,7 @@ var FlvPlugin = /* @__PURE__ */ function(_BasePlugin) {
11156
11636
  this._transCoreEvent(EVENT.LOAD_RETRY);
11157
11637
  this._transCoreEvent(EVENT.SOURCEBUFFER_CREATED);
11158
11638
  this._transCoreEvent(EVENT.ANALYZE_DURATION_EXCEEDED);
11639
+ this._transCoreEvent(EVENT.APPEND_BUFFER);
11159
11640
  this._transCoreEvent(EVENT.REMOVE_BUFFER);
11160
11641
  this._transCoreEvent(EVENT.BUFFEREOS);
11161
11642
  this._transCoreEvent(EVENT.KEYFRAME);