@give-tech/ec-player 0.0.1-beta.21 → 0.0.1-beta.23
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.
|
@@ -59,6 +59,7 @@ export declare class fMP4Demuxer {
|
|
|
59
59
|
private avcC;
|
|
60
60
|
private hvcC;
|
|
61
61
|
private isHevc;
|
|
62
|
+
private trackHandlers;
|
|
62
63
|
/**
|
|
63
64
|
* 解析初始化段 (ftyp + moov)
|
|
64
65
|
*/
|
|
@@ -72,9 +73,9 @@ export declare class fMP4Demuxer {
|
|
|
72
73
|
*/
|
|
73
74
|
private parseTrak;
|
|
74
75
|
/**
|
|
75
|
-
* 解析 mdia box
|
|
76
|
+
* 解析 mdia box 并返回 handler type
|
|
76
77
|
*/
|
|
77
|
-
private
|
|
78
|
+
private parseMdiaAndGetHandlerType;
|
|
78
79
|
/**
|
|
79
80
|
* 解析 mdhd box 获取 timescale
|
|
80
81
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fMP4Demuxer.d.ts","sourceRoot":"","sources":["../../src/demuxer/fMP4Demuxer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8CH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAMD,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,MAAM,CAAQ;IAEtB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAyBtD;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"fMP4Demuxer.d.ts","sourceRoot":"","sources":["../../src/demuxer/fMP4Demuxer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -417,6 +417,7 @@ class fMP4Demuxer {
|
|
|
417
417
|
this.avcC = null;
|
|
418
418
|
this.hvcC = null;
|
|
419
419
|
this.isHevc = false;
|
|
420
|
+
this.trackHandlers = /* @__PURE__ */ new Map();
|
|
420
421
|
}
|
|
421
422
|
/**
|
|
422
423
|
* 解析初始化段 (ftyp + moov)
|
|
@@ -463,7 +464,7 @@ class fMP4Demuxer {
|
|
|
463
464
|
let offset = trakOffset + 8;
|
|
464
465
|
const endOffset = trakOffset + trakSize;
|
|
465
466
|
let currentTrackId = null;
|
|
466
|
-
let
|
|
467
|
+
let handlerType = null;
|
|
467
468
|
console.log("[fMP4Demuxer] parseTrak called, size:", trakSize);
|
|
468
469
|
while (offset < endOffset - 8) {
|
|
469
470
|
const boxSize = readUint32$1(data, offset);
|
|
@@ -479,22 +480,25 @@ class fMP4Demuxer {
|
|
|
479
480
|
}
|
|
480
481
|
console.log("[fMP4Demuxer] tkhd: version=", version, "trackId=", currentTrackId);
|
|
481
482
|
} else if (boxType === "mdia") {
|
|
482
|
-
|
|
483
|
-
if (
|
|
484
|
-
this.
|
|
485
|
-
console.log("[fMP4Demuxer]
|
|
483
|
+
handlerType = this.parseMdiaAndGetHandlerType(data, offset, boxSize);
|
|
484
|
+
if (handlerType && currentTrackId !== null) {
|
|
485
|
+
this.trackHandlers.set(currentTrackId, handlerType);
|
|
486
|
+
console.log("[fMP4Demuxer] Track", currentTrackId, "handler:", handlerType);
|
|
487
|
+
if (handlerType === "vide") {
|
|
488
|
+
this.trackId = currentTrackId;
|
|
489
|
+
}
|
|
486
490
|
}
|
|
487
491
|
}
|
|
488
492
|
offset += boxSize;
|
|
489
493
|
}
|
|
490
494
|
}
|
|
491
495
|
/**
|
|
492
|
-
* 解析 mdia box
|
|
496
|
+
* 解析 mdia box 并返回 handler type
|
|
493
497
|
*/
|
|
494
|
-
|
|
498
|
+
parseMdiaAndGetHandlerType(data, mdiaOffset, mdiaSize) {
|
|
495
499
|
let offset = mdiaOffset + 8;
|
|
496
500
|
const endOffset = mdiaOffset + mdiaSize;
|
|
497
|
-
let
|
|
501
|
+
let handlerType = null;
|
|
498
502
|
while (offset < endOffset - 8) {
|
|
499
503
|
const boxSize = readUint32$1(data, offset);
|
|
500
504
|
const boxType = readFourCC(data, offset + 4);
|
|
@@ -502,14 +506,13 @@ class fMP4Demuxer {
|
|
|
502
506
|
if (boxType === "mdhd") {
|
|
503
507
|
this.parseMdhd(data, offset + 8);
|
|
504
508
|
} else if (boxType === "hdlr") {
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
} else if (boxType === "minf" && isVideo) {
|
|
509
|
+
handlerType = readFourCC(data, offset + 8 + 8);
|
|
510
|
+
} else if (boxType === "minf" && handlerType === "vide") {
|
|
508
511
|
this.parseMinf(data, offset, boxSize);
|
|
509
512
|
}
|
|
510
513
|
offset += boxSize;
|
|
511
514
|
}
|
|
512
|
-
return
|
|
515
|
+
return handlerType;
|
|
513
516
|
}
|
|
514
517
|
/**
|
|
515
518
|
* 解析 mdhd box 获取 timescale
|
|
@@ -766,13 +769,23 @@ class fMP4Demuxer {
|
|
|
766
769
|
*/
|
|
767
770
|
extractSamples(moof, mdatData, moofOffset, mdatOffset) {
|
|
768
771
|
const samples = [];
|
|
772
|
+
console.log(`[fMP4Demuxer] extractSamples: moof.trafs=${moof.trafs.length}, trackHandlers=${JSON.stringify(Object.fromEntries(this.trackHandlers))}`);
|
|
769
773
|
for (const traf of moof.trafs) {
|
|
770
774
|
if (!traf.tfhd || !traf.tfdt) {
|
|
775
|
+
console.log(`[fMP4Demuxer] traf missing tfhd or tfdt`);
|
|
771
776
|
continue;
|
|
772
777
|
}
|
|
773
|
-
|
|
778
|
+
const trackId = traf.tfhd.trackId;
|
|
779
|
+
const handlerType = this.trackHandlers.get(trackId);
|
|
780
|
+
if (handlerType && handlerType !== "vide") {
|
|
781
|
+
console.log(`[fMP4Demuxer] Skipping non-video track: trackId=${trackId}, handler=${handlerType}`);
|
|
774
782
|
continue;
|
|
775
783
|
}
|
|
784
|
+
if (!handlerType) {
|
|
785
|
+
console.log(`[fMP4Demuxer] Unknown trackId=${trackId}, will filter by sample size`);
|
|
786
|
+
} else {
|
|
787
|
+
console.log(`[fMP4Demuxer] Processing video track: trackId=${trackId}, truns=${traf.truns.length}`);
|
|
788
|
+
}
|
|
776
789
|
let baseDts = traf.tfdt.baseMediaDecodeTime;
|
|
777
790
|
const baseDataOffset = traf.tfhd.baseDataOffset ?? moofOffset;
|
|
778
791
|
for (const trun of traf.truns) {
|
|
@@ -790,6 +803,11 @@ class fMP4Demuxer {
|
|
|
790
803
|
console.log(`[fMP4Demuxer] Skipping sample: no data available`);
|
|
791
804
|
continue;
|
|
792
805
|
}
|
|
806
|
+
if (!handlerType && sampleSize < 1e3) {
|
|
807
|
+
dataOffset += sampleSize;
|
|
808
|
+
baseDts += sample.duration ?? 0;
|
|
809
|
+
continue;
|
|
810
|
+
}
|
|
793
811
|
const sampleData = mdatData.slice(dataOffset, dataOffset + sampleSize);
|
|
794
812
|
const isSync = (sample.flags ?? 0) & 16777216;
|
|
795
813
|
const cto = sample.compositionTimeOffset ?? 0;
|
|
@@ -1509,7 +1527,6 @@ class HLSSegmentPrefetcher extends SegmentPrefetcher {
|
|
|
1509
1527
|
* 获取分片数据
|
|
1510
1528
|
*/
|
|
1511
1529
|
async fetchSegment(segment, index) {
|
|
1512
|
-
console.log("[HLSSegmentPrefetcher] fetchSegment called, index=", index, "uri=", segment.uri);
|
|
1513
1530
|
if (segment.initSegmentUri && segment.initSegmentUri !== this.currentInitSegmentUri) {
|
|
1514
1531
|
console.log("[HLSSegmentPrefetcher] Init segment changed:", segment.initSegmentUri);
|
|
1515
1532
|
await this.player.loadNewInitSegment(segment.initSegmentUri);
|
|
@@ -1517,22 +1534,13 @@ class HLSSegmentPrefetcher extends SegmentPrefetcher {
|
|
|
1517
1534
|
}
|
|
1518
1535
|
const baseUrl = this.baseUrl;
|
|
1519
1536
|
const url = segment.uri.startsWith("http") ? segment.uri : baseUrl + segment.uri;
|
|
1520
|
-
console.log("[HLSSegmentPrefetcher] Fetching URL:", url);
|
|
1521
1537
|
const headers = {};
|
|
1522
1538
|
if (segment.byteRange) {
|
|
1523
1539
|
const { start, end } = segment.byteRange;
|
|
1524
1540
|
headers["Range"] = `bytes=${start}-${end}`;
|
|
1525
1541
|
}
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
console.log("[HLSSegmentPrefetcher] Fetch response:", response.status, response.ok);
|
|
1529
|
-
const buffer = await response.arrayBuffer();
|
|
1530
|
-
console.log("[HLSSegmentPrefetcher] Fetched data size:", buffer.byteLength);
|
|
1531
|
-
return new Uint8Array(buffer);
|
|
1532
|
-
} catch (error) {
|
|
1533
|
-
console.error("[HLSSegmentPrefetcher] Fetch error:", error);
|
|
1534
|
-
throw error;
|
|
1535
|
-
}
|
|
1542
|
+
const response = await fetch(url, { headers });
|
|
1543
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
1536
1544
|
}
|
|
1537
1545
|
/**
|
|
1538
1546
|
* 解析分片数据
|
|
@@ -1613,7 +1621,7 @@ class HLSPlayer extends BasePlayer {
|
|
|
1613
1621
|
this.frameBuffer.shift();
|
|
1614
1622
|
this.renderer.render(frame);
|
|
1615
1623
|
this.accumulatedMediaTime += frameDurationMs;
|
|
1616
|
-
this.setCurrentTime(this.accumulatedMediaTime);
|
|
1624
|
+
this.setCurrentTime(this.accumulatedMediaTime / 1e3);
|
|
1617
1625
|
this.updateState({ resolution: `${frame.width}x${frame.height}` });
|
|
1618
1626
|
const fps = this.renderer.updateFps();
|
|
1619
1627
|
this.updateState({ fps });
|
|
@@ -1736,8 +1744,6 @@ class HLSPlayer extends BasePlayer {
|
|
|
1736
1744
|
if (this.prefetcher) {
|
|
1737
1745
|
this.prefetcher.setCurrentSegmentIndex(targetIndex);
|
|
1738
1746
|
}
|
|
1739
|
-
this.playStartTime = performance.now();
|
|
1740
|
-
this.accumulatedMediaTime = time;
|
|
1741
1747
|
this.setCurrentTime(time);
|
|
1742
1748
|
console.log("[HLSPlayer] Seek to", time, "ms, segment:", targetIndex);
|
|
1743
1749
|
}
|
|
@@ -1893,7 +1899,9 @@ class HLSPlayer extends BasePlayer {
|
|
|
1893
1899
|
this._sampleQueue.push({ sample });
|
|
1894
1900
|
}
|
|
1895
1901
|
totalSampleCount += samples.length;
|
|
1902
|
+
console.log("[parseFMP4Data] Pushed", samples.length, "samples, totalQueue=", this._sampleQueue.length);
|
|
1896
1903
|
}
|
|
1904
|
+
console.log("[parseFMP4Data] Total samples parsed:", totalSampleCount);
|
|
1897
1905
|
return totalSampleCount;
|
|
1898
1906
|
}
|
|
1899
1907
|
/**
|
|
@@ -2055,10 +2063,13 @@ class HLSPlayer extends BasePlayer {
|
|
|
2055
2063
|
*/
|
|
2056
2064
|
initDecoderFromHvcC(hvcC) {
|
|
2057
2065
|
if (this.decoderInitialized || !this.hevcDecoder) return;
|
|
2058
|
-
|
|
2066
|
+
console.log("[fMP4] hvcC length:", hvcC.length);
|
|
2067
|
+
console.log("[fMP4] hvcC first 8 bytes:", Array.from(hvcC.slice(0, 8)).map((b) => b.toString(16).padStart(2, "0")).join(" "));
|
|
2068
|
+
console.log("[fMP4] hvcC bytes 8-24:", Array.from(hvcC.slice(8, 24)).map((b) => b.toString(16).padStart(2, "0")).join(" "));
|
|
2069
|
+
let offset = 8 + 22;
|
|
2059
2070
|
const numOfArrays = hvcC[offset];
|
|
2071
|
+
console.log("[fMP4] hvcC[30] (numOfArrays):", numOfArrays, "0x" + numOfArrays.toString(16));
|
|
2060
2072
|
offset += 1;
|
|
2061
|
-
console.log(`[fMP4] hvcC: numOfArrays=${numOfArrays}`);
|
|
2062
2073
|
for (let i = 0; i < numOfArrays && offset < hvcC.length - 3; i++) {
|
|
2063
2074
|
const typeCompressed = hvcC[offset];
|
|
2064
2075
|
const arrayType = typeCompressed & 63;
|