@give-tech/ec-player 0.0.1-beta.7 → 0.0.1-beta.9
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.
|
@@ -72,9 +72,9 @@ export declare class fMP4Demuxer {
|
|
|
72
72
|
*/
|
|
73
73
|
private parseTrak;
|
|
74
74
|
/**
|
|
75
|
-
* 解析 mdia box
|
|
75
|
+
* 解析 mdia box 并检查是否为视频轨道
|
|
76
76
|
*/
|
|
77
|
-
private
|
|
77
|
+
private parseMdiaAndCheckVideo;
|
|
78
78
|
/**
|
|
79
79
|
* 解析 mdhd box 获取 timescale
|
|
80
80
|
*/
|
|
@@ -121,6 +121,7 @@ export declare class fMP4Demuxer {
|
|
|
121
121
|
private parseTrun;
|
|
122
122
|
/**
|
|
123
123
|
* 从 moof + mdat 提取视频样本
|
|
124
|
+
* 只提取视频轨道(trackId 匹配)的数据
|
|
124
125
|
*/
|
|
125
126
|
extractSamples(moof: MoofBox, mdatData: Uint8Array, mdatOffset: number): VideoSample[];
|
|
126
127
|
/**
|
|
@@ -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
|
@@ -462,33 +462,51 @@ class fMP4Demuxer {
|
|
|
462
462
|
parseTrak(data, trakOffset, trakSize) {
|
|
463
463
|
let offset = trakOffset + 8;
|
|
464
464
|
const endOffset = trakOffset + trakSize;
|
|
465
|
+
let currentTrackId = null;
|
|
466
|
+
let isVideoTrack = false;
|
|
465
467
|
while (offset < endOffset - 8) {
|
|
466
468
|
const boxSize = readUint32$1(data, offset);
|
|
467
469
|
const boxType = readFourCC(data, offset + 4);
|
|
468
470
|
if (boxSize < 8) break;
|
|
469
|
-
if (boxType === "
|
|
470
|
-
|
|
471
|
+
if (boxType === "tkhd") {
|
|
472
|
+
const version = data[offset + 8];
|
|
473
|
+
if (version === 1) {
|
|
474
|
+
currentTrackId = readUint32$1(data, offset + 8 + 16 + 4);
|
|
475
|
+
} else {
|
|
476
|
+
currentTrackId = readUint32$1(data, offset + 8 + 8 + 4);
|
|
477
|
+
}
|
|
478
|
+
} else if (boxType === "mdia") {
|
|
479
|
+
isVideoTrack = this.parseMdiaAndCheckVideo(data, offset, boxSize);
|
|
480
|
+
if (isVideoTrack && currentTrackId !== null) {
|
|
481
|
+
this.trackId = currentTrackId;
|
|
482
|
+
console.log("[fMP4Demuxer] Found video track, trackId:", currentTrackId);
|
|
483
|
+
}
|
|
471
484
|
}
|
|
472
485
|
offset += boxSize;
|
|
473
486
|
}
|
|
474
487
|
}
|
|
475
488
|
/**
|
|
476
|
-
* 解析 mdia box
|
|
489
|
+
* 解析 mdia box 并检查是否为视频轨道
|
|
477
490
|
*/
|
|
478
|
-
|
|
491
|
+
parseMdiaAndCheckVideo(data, mdiaOffset, mdiaSize) {
|
|
479
492
|
let offset = mdiaOffset + 8;
|
|
480
493
|
const endOffset = mdiaOffset + mdiaSize;
|
|
494
|
+
let isVideo = false;
|
|
481
495
|
while (offset < endOffset - 8) {
|
|
482
496
|
const boxSize = readUint32$1(data, offset);
|
|
483
497
|
const boxType = readFourCC(data, offset + 4);
|
|
484
498
|
if (boxSize < 8) break;
|
|
485
499
|
if (boxType === "mdhd") {
|
|
486
500
|
this.parseMdhd(data, offset + 8);
|
|
487
|
-
} else if (boxType === "
|
|
501
|
+
} else if (boxType === "hdlr") {
|
|
502
|
+
const handlerType = readFourCC(data, offset + 8 + 8);
|
|
503
|
+
isVideo = handlerType === "vide";
|
|
504
|
+
} else if (boxType === "minf" && isVideo) {
|
|
488
505
|
this.parseMinf(data, offset, boxSize);
|
|
489
506
|
}
|
|
490
507
|
offset += boxSize;
|
|
491
508
|
}
|
|
509
|
+
return isVideo;
|
|
492
510
|
}
|
|
493
511
|
/**
|
|
494
512
|
* 解析 mdhd box 获取 timescale
|
|
@@ -741,11 +759,16 @@ class fMP4Demuxer {
|
|
|
741
759
|
}
|
|
742
760
|
/**
|
|
743
761
|
* 从 moof + mdat 提取视频样本
|
|
762
|
+
* 只提取视频轨道(trackId 匹配)的数据
|
|
744
763
|
*/
|
|
745
764
|
extractSamples(moof, mdatData, mdatOffset) {
|
|
746
765
|
const samples = [];
|
|
747
766
|
for (const traf of moof.trafs) {
|
|
748
767
|
if (!traf.tfhd || !traf.tfdt) continue;
|
|
768
|
+
if (traf.tfhd.trackId !== this.trackId) {
|
|
769
|
+
console.log(`[fMP4Demuxer] Skipping track ${traf.tfhd.trackId} (expected video track ${this.trackId})`);
|
|
770
|
+
continue;
|
|
771
|
+
}
|
|
749
772
|
let baseDts = traf.tfdt.baseMediaDecodeTime;
|
|
750
773
|
for (const trun of traf.truns) {
|
|
751
774
|
let dataOffset = 0;
|
|
@@ -1759,33 +1782,46 @@ class HLSPlayer extends BasePlayer {
|
|
|
1759
1782
|
* 解析 fMP4 数据
|
|
1760
1783
|
*/
|
|
1761
1784
|
parseFMP4Data(data) {
|
|
1762
|
-
let
|
|
1763
|
-
let mdatOffset = -1;
|
|
1764
|
-
let mdatSize = 0;
|
|
1785
|
+
let totalSampleCount = 0;
|
|
1765
1786
|
let offset = 0;
|
|
1766
1787
|
while (offset < data.length - 8) {
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1788
|
+
let moofOffset = -1;
|
|
1789
|
+
let mdatOffset = -1;
|
|
1790
|
+
let mdatSize = 0;
|
|
1791
|
+
while (offset < data.length - 8) {
|
|
1792
|
+
const boxSize = this.readBoxSize(data, offset);
|
|
1793
|
+
const boxType = this.readBoxType(data, offset + 4);
|
|
1794
|
+
if (boxSize < 8) break;
|
|
1795
|
+
if (boxType === "moof") {
|
|
1796
|
+
moofOffset = offset;
|
|
1797
|
+
offset += boxSize;
|
|
1798
|
+
break;
|
|
1799
|
+
}
|
|
1800
|
+
offset += boxSize;
|
|
1801
|
+
}
|
|
1802
|
+
if (moofOffset < 0) break;
|
|
1803
|
+
while (offset < data.length - 8) {
|
|
1804
|
+
const boxSize = this.readBoxSize(data, offset);
|
|
1805
|
+
const boxType = this.readBoxType(data, offset + 4);
|
|
1806
|
+
if (boxSize < 8) break;
|
|
1807
|
+
if (boxType === "mdat") {
|
|
1808
|
+
mdatOffset = offset;
|
|
1809
|
+
mdatSize = boxSize;
|
|
1810
|
+
offset += boxSize;
|
|
1811
|
+
break;
|
|
1812
|
+
}
|
|
1813
|
+
offset += boxSize;
|
|
1775
1814
|
}
|
|
1776
|
-
|
|
1777
|
-
}
|
|
1778
|
-
let sampleCount = 0;
|
|
1779
|
-
if (moofOffset >= 0 && mdatOffset >= 0) {
|
|
1815
|
+
if (mdatOffset < 0) break;
|
|
1780
1816
|
const moof = this.fmp4Demuxer.parseMoof(data, moofOffset);
|
|
1781
1817
|
const mdatData = data.slice(mdatOffset + 8, mdatOffset + mdatSize);
|
|
1782
1818
|
const samples = this.fmp4Demuxer.extractSamples(moof, mdatData, mdatOffset);
|
|
1783
1819
|
for (const sample of samples) {
|
|
1784
1820
|
this._sampleQueue.push({ sample });
|
|
1785
1821
|
}
|
|
1786
|
-
|
|
1822
|
+
totalSampleCount += samples.length;
|
|
1787
1823
|
}
|
|
1788
|
-
return
|
|
1824
|
+
return totalSampleCount;
|
|
1789
1825
|
}
|
|
1790
1826
|
/**
|
|
1791
1827
|
* 解析 TS 数据
|