@give-tech/ec-player 0.0.1-beta.36 → 0.0.1-beta.37

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.
package/dist/index.js CHANGED
@@ -1371,6 +1371,10 @@ class SegmentPrefetcher extends BasePrefetcher {
1371
1371
  callbacks.onSegmentFetched?.(nextIndex, data);
1372
1372
  console.log(`[SegmentPrefetcher] Fetched segment #${nextIndex}: ${data.length} bytes, ${fetchTime.toFixed(0)}ms`);
1373
1373
  } catch (error) {
1374
+ if (error.name === "AbortError") {
1375
+ console.log(`[SegmentPrefetcher] Fetch aborted`);
1376
+ return;
1377
+ }
1374
1378
  console.error(`[SegmentPrefetcher] Fetch failed:`, error.message);
1375
1379
  this.callbacks.onError?.(error);
1376
1380
  } finally {
@@ -1544,6 +1548,10 @@ class StreamPrefetcher extends BasePrefetcher {
1544
1548
  console.log(`[StreamPrefetcher] Download complete: ${this.totalDownloadedBytes} bytes`);
1545
1549
  }
1546
1550
  } catch (error) {
1551
+ if (error.name === "AbortError") {
1552
+ console.log(`[StreamPrefetcher] Read aborted`);
1553
+ return;
1554
+ }
1547
1555
  console.error(`[StreamPrefetcher] Read error:`, error.message);
1548
1556
  this.callbacks.onError?.(error);
1549
1557
  }
@@ -1664,7 +1672,8 @@ class HLSSegmentPrefetcher extends SegmentPrefetcher {
1664
1672
  const { start, end } = segment.byteRange;
1665
1673
  headers["Range"] = `bytes=${start}-${end}`;
1666
1674
  }
1667
- const response = await fetch(url, { headers });
1675
+ const signal = this.player.getAbortSignal();
1676
+ const response = await fetch(url, { headers, signal });
1668
1677
  return new Uint8Array(await response.arrayBuffer());
1669
1678
  }
1670
1679
  /**
@@ -1708,6 +1717,7 @@ class HLSPlayer extends BasePlayer {
1708
1717
  this._sampleQueue = [];
1709
1718
  this._currentSegmentDuration = 0;
1710
1719
  this.prefetcher = null;
1720
+ this.abortController = null;
1711
1721
  this._nalCountInCurrentSegment = 0;
1712
1722
  this.lastRenderTime = 0;
1713
1723
  this.playStartTime = 0;
@@ -1797,11 +1807,24 @@ class HLSPlayer extends BasePlayer {
1797
1807
  get sampleQueue() {
1798
1808
  return this._sampleQueue;
1799
1809
  }
1810
+ /** 获取 AbortSignal(供预取器使用) */
1811
+ getAbortSignal() {
1812
+ if (!this.abortController) {
1813
+ const controller = new AbortController();
1814
+ controller.abort();
1815
+ return controller.signal;
1816
+ }
1817
+ return this.abortController.signal;
1818
+ }
1800
1819
  /**
1801
1820
  * 加载 HLS 播放列表
1802
1821
  */
1803
1822
  async load(url) {
1804
1823
  this.currentPlaylistUrl = url;
1824
+ if (this.abortController) {
1825
+ this.abortController.abort();
1826
+ }
1827
+ this.abortController = new AbortController();
1805
1828
  this.segments = [];
1806
1829
  this.fmp4Segments = [];
1807
1830
  this.initSegment = null;
@@ -1869,6 +1892,24 @@ class HLSPlayer extends BasePlayer {
1869
1892
  this.decodeLoop();
1870
1893
  this.frameTimer = requestAnimationFrame(this.renderLoop);
1871
1894
  }
1895
+ /**
1896
+ * 销毁播放器,释放所有资源
1897
+ */
1898
+ destroy() {
1899
+ if (this.abortController) {
1900
+ this.abortController.abort();
1901
+ this.abortController = null;
1902
+ }
1903
+ if (this.prefetcher) {
1904
+ this.prefetcher.reset();
1905
+ this.prefetcher = null;
1906
+ }
1907
+ if (this.hevcDecoder) {
1908
+ this.hevcDecoder.destroy();
1909
+ this.hevcDecoder = null;
1910
+ }
1911
+ super.destroy();
1912
+ }
1872
1913
  /**
1873
1914
  * 跳转到指定时间
1874
1915
  */
@@ -2101,7 +2142,16 @@ class HLSPlayer extends BasePlayer {
2101
2142
  const { start, end } = this.initSegment.byteRange;
2102
2143
  headers["Range"] = `bytes=${start}-${end}`;
2103
2144
  }
2104
- const response = await fetch(url, { headers });
2145
+ let response;
2146
+ try {
2147
+ response = await fetch(url, { headers, signal: this.abortController?.signal });
2148
+ } catch (error) {
2149
+ if (error.name === "AbortError") {
2150
+ console.log("[fMP4] Load init segment aborted");
2151
+ return;
2152
+ }
2153
+ throw error;
2154
+ }
2105
2155
  const data = new Uint8Array(await response.arrayBuffer());
2106
2156
  console.log("[fMP4] Init segment data size:", data.length, "bytes");
2107
2157
  const initInfo = this.fmp4Demuxer.parseInitSegment(data);
@@ -2141,7 +2191,16 @@ class HLSPlayer extends BasePlayer {
2141
2191
  headers["Range"] = `bytes=${start}-${end}`;
2142
2192
  console.log("[fMP4] Using byte range for init segment:", { start, end });
2143
2193
  }
2144
- const response = await fetch(url, { headers });
2194
+ let response;
2195
+ try {
2196
+ response = await fetch(url, { headers, signal: this.abortController?.signal });
2197
+ } catch (error) {
2198
+ if (error.name === "AbortError") {
2199
+ console.log("[fMP4] Load new init segment aborted");
2200
+ return;
2201
+ }
2202
+ throw error;
2203
+ }
2145
2204
  const data = new Uint8Array(await response.arrayBuffer());
2146
2205
  console.log("[fMP4] New init segment data size:", data.length, "bytes");
2147
2206
  const initInfo = this.fmp4Demuxer.parseInitSegment(data);
@@ -2265,7 +2324,16 @@ class HLSPlayer extends BasePlayer {
2265
2324
  * 解析 HLS 播放列表
2266
2325
  */
2267
2326
  async parsePlaylist(url) {
2268
- const response = await fetch(url);
2327
+ let response;
2328
+ try {
2329
+ response = await fetch(url, { signal: this.abortController?.signal });
2330
+ } catch (error) {
2331
+ if (error.name === "AbortError") {
2332
+ console.log("[HLSPlayer] Parse playlist aborted");
2333
+ return { isMaster: true, isFMP4: false, segments: [], fmp4Segments: [], variants: 0 };
2334
+ }
2335
+ throw error;
2336
+ }
2269
2337
  const content = await response.text();
2270
2338
  const lines = content.split("\n");
2271
2339
  const segments = [];
@@ -3010,6 +3078,7 @@ class FLVPlayer extends BasePlayer {
3010
3078
  this.liveReader = null;
3011
3079
  this.liveDownloadAbort = false;
3012
3080
  this._lastQueuedTimestamp = -1;
3081
+ this.abortController = null;
3013
3082
  this._currentDownloadSpeed = 0;
3014
3083
  this.renderedFrames = 0;
3015
3084
  this.lastRenderLogTime = 0;
@@ -3149,6 +3218,7 @@ class FLVPlayer extends BasePlayer {
3149
3218
  console.log("[FLVPlayer] Loading URL:", url);
3150
3219
  this.currentUrl = url;
3151
3220
  this.stopLiveDownload();
3221
+ this.abortController = new AbortController();
3152
3222
  this._timedFrameBuffer = [];
3153
3223
  this._videoTagQueue = [];
3154
3224
  this.liveDownloadAbort = false;
@@ -3449,7 +3519,17 @@ class FLVPlayer extends BasePlayer {
3449
3519
  */
3450
3520
  async loadFLV(url) {
3451
3521
  console.log("[FLVPlayer] Fetching FLV...");
3452
- const response = await fetch(url);
3522
+ const signal = this.abortController?.signal;
3523
+ let response;
3524
+ try {
3525
+ response = await fetch(url, { signal });
3526
+ } catch (error) {
3527
+ if (error.name === "AbortError") {
3528
+ console.log("[FLVPlayer] Fetch aborted");
3529
+ return;
3530
+ }
3531
+ throw error;
3532
+ }
3453
3533
  if (!response.ok) {
3454
3534
  throw new Error(`Failed to fetch FLV: ${response.status}`);
3455
3535
  }
@@ -3524,6 +3604,10 @@ class FLVPlayer extends BasePlayer {
3524
3604
  }
3525
3605
  }
3526
3606
  } catch (error) {
3607
+ if (error.name === "AbortError" || this.liveDownloadAbort) {
3608
+ console.log("[FLVPlayer] Loading aborted");
3609
+ return;
3610
+ }
3527
3611
  console.error("[FLVPlayer] Error loading FLV:", error);
3528
3612
  throw error;
3529
3613
  } finally {
@@ -3568,6 +3652,10 @@ class FLVPlayer extends BasePlayer {
3568
3652
  */
3569
3653
  stopLiveDownload() {
3570
3654
  this.liveDownloadAbort = true;
3655
+ if (this.abortController) {
3656
+ this.abortController.abort();
3657
+ this.abortController = null;
3658
+ }
3571
3659
  if (this.liveReader) {
3572
3660
  this.liveReader.cancel();
3573
3661
  this.liveReader = null;