@give-tech/ec-player 0.0.1-beta.35 → 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 +94 -6
- package/dist/index.js.map +1 -1
- package/dist/player/FLVPlayer.d.ts +1 -0
- package/dist/player/FLVPlayer.d.ts.map +1 -1
- package/dist/player/HLSPlayer.d.ts +7 -0
- package/dist/player/HLSPlayer.d.ts.map +1 -1
- package/dist/prefetch/SegmentPrefetcher.d.ts.map +1 -1
- package/dist/prefetch/StreamPrefetcher.d.ts.map +1 -1
- package/package.json +1 -1
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
|
|
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;
|
|
@@ -1768,7 +1778,7 @@ class HLSPlayer extends BasePlayer {
|
|
|
1768
1778
|
this.frameBuffer.shift();
|
|
1769
1779
|
this.renderer.render(frame);
|
|
1770
1780
|
this.accumulatedMediaTime += frameDurationMs;
|
|
1771
|
-
this.setCurrentTime(this.accumulatedMediaTime
|
|
1781
|
+
this.setCurrentTime(this.accumulatedMediaTime);
|
|
1772
1782
|
this.updateState({ resolution: `${frame.width}x${frame.height}` });
|
|
1773
1783
|
const fps = this.renderer.updateFps();
|
|
1774
1784
|
this.updateState({ fps });
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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;
|