@give-tech/ec-player 0.0.1-beta.10 → 0.0.1-beta.12

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.
@@ -123,7 +123,7 @@ export declare class fMP4Demuxer {
123
123
  * 从 moof + mdat 提取视频样本
124
124
  * 只提取视频轨道(trackId 匹配)的数据
125
125
  */
126
- extractSamples(moof: MoofBox, mdatData: Uint8Array, mdatOffset: number): VideoSample[];
126
+ extractSamples(moof: MoofBox, mdatData: Uint8Array, moofOffset: number, mdatOffset: number): VideoSample[];
127
127
  /**
128
128
  * 获取 timescale
129
129
  */
@@ -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;IAsCjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IA0BjB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAiCxD;;OAEG;IACH,OAAO,CAAC,SAAS;IA8BjB;;OAEG;IACH,OAAO,CAAC,SAAS;IA+BjB;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAiEjB;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE;IAkDtF;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,OAAO,IAAI,UAAU,GAAG,IAAI;IAI5B;;OAEG;IACH,OAAO,IAAI,UAAU,GAAG,IAAI;IAI5B;;OAEG;IACH,YAAY,IAAI,OAAO;CAGxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAuBzD"}
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;IAwCjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAkBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IA0BjB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAiCxD;;OAEG;IACH,OAAO,CAAC,SAAS;IA8BjB;;OAEG;IACH,OAAO,CAAC,SAAS;IA+BjB;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAiEjB;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE;IA4D1G;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,OAAO,IAAI,UAAU,GAAG,IAAI;IAI5B;;OAEG;IACH,OAAO,IAAI,UAAU,GAAG,IAAI;IAI5B;;OAEG;IACH,YAAY,IAAI,OAAO;CAGxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAuBzD"}
package/dist/index.js CHANGED
@@ -464,6 +464,7 @@ class fMP4Demuxer {
464
464
  const endOffset = trakOffset + trakSize;
465
465
  let currentTrackId = null;
466
466
  let isVideoTrack = false;
467
+ console.log("[fMP4Demuxer] parseTrak called, size:", trakSize);
467
468
  while (offset < endOffset - 8) {
468
469
  const boxSize = readUint32$1(data, offset);
469
470
  const boxType = readFourCC(data, offset + 4);
@@ -763,19 +764,22 @@ class fMP4Demuxer {
763
764
  * 从 moof + mdat 提取视频样本
764
765
  * 只提取视频轨道(trackId 匹配)的数据
765
766
  */
766
- extractSamples(moof, mdatData, mdatOffset) {
767
+ extractSamples(moof, mdatData, moofOffset, mdatOffset) {
767
768
  const samples = [];
768
769
  for (const traf of moof.trafs) {
769
770
  if (!traf.tfhd || !traf.tfdt) continue;
771
+ console.log(`[fMP4Demuxer] extractSamples: traf.trackId=${traf.tfhd.trackId}, videoTrackId=${this.trackId}`);
770
772
  if (traf.tfhd.trackId !== this.trackId) {
771
- console.log(`[fMP4Demuxer] Skipping track ${traf.tfhd.trackId} (expected video track ${this.trackId})`);
773
+ console.log(`[fMP4Demuxer] Skipping track ${traf.tfhd.trackId}`);
772
774
  continue;
773
775
  }
774
776
  let baseDts = traf.tfdt.baseMediaDecodeTime;
777
+ const baseDataOffset = traf.tfhd.baseDataOffset ?? moofOffset;
775
778
  for (const trun of traf.truns) {
776
779
  let dataOffset = 0;
777
780
  if (trun.dataOffset !== void 0) {
778
- dataOffset = trun.dataOffset - mdatOffset - 8;
781
+ const absoluteOffset = baseDataOffset + trun.dataOffset;
782
+ dataOffset = absoluteOffset - mdatOffset - 8;
779
783
  }
780
784
  for (const sample of trun.samples) {
781
785
  if (sample.size === void 0 || sample.size <= 0) continue;
@@ -1548,6 +1552,8 @@ class HLSPlayer extends BasePlayer {
1548
1552
  this._sampleQueue = [];
1549
1553
  this.prefetcher = null;
1550
1554
  this.lastRenderTime = 0;
1555
+ this.playStartTime = 0;
1556
+ this.firstFramePts = null;
1551
1557
  this.renderLoop = (timestamp = 0) => {
1552
1558
  if (!this.isPlaying) return;
1553
1559
  const downloaded = this.isFMP4 ? this.sampleQueue.length : this.nalQueue.length;
@@ -1561,17 +1567,24 @@ class HLSPlayer extends BasePlayer {
1561
1567
  totalSegments
1562
1568
  });
1563
1569
  if (this.frameBuffer.length > 0 && this.renderer) {
1564
- const frame = this.frameBuffer.shift();
1565
- this.renderer.render(frame);
1566
- if (this.lastRenderTime > 0) {
1567
- const elapsed = timestamp - this.lastRenderTime;
1568
- this.setCurrentTime(this._currentTime + elapsed);
1570
+ const frame = this.frameBuffer[0];
1571
+ if (this.playStartTime === 0 || this.firstFramePts === null) {
1572
+ this.playStartTime = performance.now();
1573
+ this.firstFramePts = frame.pts ?? 0;
1574
+ }
1575
+ const elapsedMs = performance.now() - this.playStartTime;
1576
+ const timescale = this.fmp4Demuxer.getTimescale();
1577
+ const currentTargetPts = this.firstFramePts + elapsedMs * timescale / 1e3;
1578
+ const framePts = frame.pts ?? 0;
1579
+ if (framePts <= currentTargetPts) {
1580
+ this.frameBuffer.shift();
1581
+ this.renderer.render(frame);
1582
+ this.setCurrentTime(framePts / timescale);
1583
+ this.updateState({ resolution: `${frame.width}x${frame.height}` });
1584
+ const fps = this.renderer.updateFps();
1585
+ this.updateState({ fps });
1586
+ this.callbacks.onFrameRender?.(frame);
1569
1587
  }
1570
- this.lastRenderTime = timestamp;
1571
- this.updateState({ resolution: `${frame.width}x${frame.height}` });
1572
- const fps = this.renderer.updateFps();
1573
- this.updateState({ fps });
1574
- this.callbacks.onFrameRender?.(frame);
1575
1588
  } else {
1576
1589
  this.lastRenderTime = 0;
1577
1590
  }
@@ -1651,6 +1664,8 @@ class HLSPlayer extends BasePlayer {
1651
1664
  this.isPlaying = true;
1652
1665
  this.decodeLoopAbort = false;
1653
1666
  this.lastRenderTime = 0;
1667
+ this.playStartTime = 0;
1668
+ this.firstFramePts = null;
1654
1669
  this.updateState({ isPlaying: true });
1655
1670
  if (!this.prefetcher) {
1656
1671
  this.initPrefetcher();
@@ -1817,7 +1832,7 @@ class HLSPlayer extends BasePlayer {
1817
1832
  if (mdatOffset < 0) break;
1818
1833
  const moof = this.fmp4Demuxer.parseMoof(data, moofOffset);
1819
1834
  const mdatData = data.slice(mdatOffset + 8, mdatOffset + mdatSize);
1820
- const samples = this.fmp4Demuxer.extractSamples(moof, mdatData, mdatOffset);
1835
+ const samples = this.fmp4Demuxer.extractSamples(moof, mdatData, moofOffset, mdatOffset);
1821
1836
  for (const sample of samples) {
1822
1837
  this._sampleQueue.push({ sample });
1823
1838
  }
@@ -2196,6 +2211,10 @@ class HLSPlayer extends BasePlayer {
2196
2211
  data: annexBData,
2197
2212
  size: annexBData.length
2198
2213
  });
2214
+ if (frame) {
2215
+ frame.pts = sample.pts;
2216
+ frame.dts = sample.dts;
2217
+ }
2199
2218
  return frame;
2200
2219
  }
2201
2220
  /**