@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 parseMdiaAndCheckVideo;
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":"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"}
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 isVideoTrack = false;
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
- isVideoTrack = this.parseMdiaAndCheckVideo(data, offset, boxSize);
483
- if (isVideoTrack && currentTrackId !== null) {
484
- this.trackId = currentTrackId;
485
- console.log("[fMP4Demuxer] Found video track, trackId:", currentTrackId);
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
- parseMdiaAndCheckVideo(data, mdiaOffset, mdiaSize) {
498
+ parseMdiaAndGetHandlerType(data, mdiaOffset, mdiaSize) {
495
499
  let offset = mdiaOffset + 8;
496
500
  const endOffset = mdiaOffset + mdiaSize;
497
- let isVideo = false;
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
- const handlerType = readFourCC(data, offset + 8 + 8);
506
- isVideo = handlerType === "vide";
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 isVideo;
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
- if (traf.tfhd.trackId !== this.trackId) {
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
- try {
1527
- const response = await fetch(url, { headers });
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
- let offset = 22;
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;