hls-streamer 3.1.0 → 4.0.2

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.
Files changed (76) hide show
  1. package/README.md +145 -106
  2. package/dist/Interfaces/HlsStreamer.d.ts +4 -3
  3. package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
  4. package/dist/Libs/FileLib.d.ts +11 -5
  5. package/dist/Libs/FileLib.d.ts.map +1 -1
  6. package/dist/Libs/FileLib.js +9 -3
  7. package/dist/Libs/FileLib.js.map +1 -1
  8. package/dist/Libs/FormatDetector.d.ts +3 -3
  9. package/dist/Libs/FormatDetector.d.ts.map +1 -1
  10. package/dist/Libs/FormatDetector.js +19 -2
  11. package/dist/Libs/FormatDetector.js.map +1 -1
  12. package/dist/Parsers/AacParser.d.ts +4 -4
  13. package/dist/Parsers/AacParser.d.ts.map +1 -1
  14. package/dist/Parsers/AacParser.js +5 -1
  15. package/dist/Parsers/AacParser.js.map +1 -1
  16. package/dist/Parsers/FlacParser.d.ts +4 -4
  17. package/dist/Parsers/IAudioParser.d.ts +1 -30
  18. package/dist/Parsers/IAudioParser.d.ts.map +1 -1
  19. package/dist/Parsers/IMediaParser.d.ts +43 -0
  20. package/dist/Parsers/IMediaParser.d.ts.map +1 -0
  21. package/dist/Parsers/IMediaParser.js +2 -0
  22. package/dist/Parsers/IMediaParser.js.map +1 -0
  23. package/dist/Parsers/Mp3Parser.d.ts +4 -4
  24. package/dist/Parsers/Mp4Parser.d.ts +21 -0
  25. package/dist/Parsers/Mp4Parser.d.ts.map +1 -0
  26. package/dist/Parsers/Mp4Parser.js +418 -0
  27. package/dist/Parsers/Mp4Parser.js.map +1 -0
  28. package/dist/Parsers/OggParser.d.ts +4 -4
  29. package/dist/Parsers/ParserFactory.d.ts +5 -5
  30. package/dist/Parsers/ParserFactory.d.ts.map +1 -1
  31. package/dist/Parsers/ParserFactory.js +6 -3
  32. package/dist/Parsers/ParserFactory.js.map +1 -1
  33. package/dist/Parsers/WavParser.d.ts +4 -4
  34. package/dist/cjs/Interfaces/HlsStreamer.d.ts +4 -3
  35. package/dist/cjs/Interfaces/HlsStreamer.d.ts.map +1 -1
  36. package/dist/cjs/Libs/FileLib.d.ts +11 -5
  37. package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
  38. package/dist/cjs/Libs/FileLib.js +9 -3
  39. package/dist/cjs/Libs/FileLib.js.map +1 -1
  40. package/dist/cjs/Libs/FormatDetector.d.ts +3 -3
  41. package/dist/cjs/Libs/FormatDetector.d.ts.map +1 -1
  42. package/dist/cjs/Libs/FormatDetector.js +19 -2
  43. package/dist/cjs/Libs/FormatDetector.js.map +1 -1
  44. package/dist/cjs/Parsers/AacParser.d.ts +4 -4
  45. package/dist/cjs/Parsers/AacParser.d.ts.map +1 -1
  46. package/dist/cjs/Parsers/AacParser.js +5 -1
  47. package/dist/cjs/Parsers/AacParser.js.map +1 -1
  48. package/dist/cjs/Parsers/FlacParser.d.ts +4 -4
  49. package/dist/cjs/Parsers/IAudioParser.d.ts +1 -30
  50. package/dist/cjs/Parsers/IAudioParser.d.ts.map +1 -1
  51. package/dist/cjs/Parsers/IMediaParser.d.ts +43 -0
  52. package/dist/cjs/Parsers/IMediaParser.d.ts.map +1 -0
  53. package/dist/cjs/Parsers/IMediaParser.js +3 -0
  54. package/dist/cjs/Parsers/IMediaParser.js.map +1 -0
  55. package/dist/cjs/Parsers/Mp3Parser.d.ts +4 -4
  56. package/dist/cjs/Parsers/Mp4Parser.d.ts +21 -0
  57. package/dist/cjs/Parsers/Mp4Parser.d.ts.map +1 -0
  58. package/dist/cjs/Parsers/Mp4Parser.js +422 -0
  59. package/dist/cjs/Parsers/Mp4Parser.js.map +1 -0
  60. package/dist/cjs/Parsers/OggParser.d.ts +4 -4
  61. package/dist/cjs/Parsers/ParserFactory.d.ts +5 -5
  62. package/dist/cjs/Parsers/ParserFactory.d.ts.map +1 -1
  63. package/dist/cjs/Parsers/ParserFactory.js +6 -3
  64. package/dist/cjs/Parsers/ParserFactory.js.map +1 -1
  65. package/dist/cjs/Parsers/WavParser.d.ts +4 -4
  66. package/dist/cjs/errors/HlsStreamerErrors.js +1 -1
  67. package/dist/cjs/index.d.ts +1 -0
  68. package/dist/cjs/index.d.ts.map +1 -1
  69. package/dist/cjs/index.js +21 -6
  70. package/dist/cjs/index.js.map +1 -1
  71. package/dist/errors/HlsStreamerErrors.js +1 -1
  72. package/dist/index.d.ts +1 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +21 -6
  75. package/dist/index.js.map +1 -1
  76. package/package.json +8 -3
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mp4Parser = void 0;
4
+ class Mp4Parser {
5
+ getFormat() {
6
+ return 'mp4';
7
+ }
8
+ canParse(buffer) {
9
+ if (buffer.length < 12)
10
+ return false;
11
+ const boxType = buffer.toString('ascii', 4, 8);
12
+ if (boxType !== 'ftyp')
13
+ return false;
14
+ const brand = buffer.toString('ascii', 8, 12);
15
+ const videoBrands = ['isom', 'mp41', 'mp42', 'M4V ', 'M4A ', 'avc1', 'iso2', 'iso5', 'iso6'];
16
+ return videoBrands.includes(brand) || boxType === 'ftyp';
17
+ }
18
+ analyze(buffer, opts = {}) {
19
+ const size = opts.fileSize ?? buffer.length;
20
+ const warnings = [];
21
+ const format = this.detectFormat(buffer);
22
+ const moovBox = this.findTopLevelBox(buffer, 'moov');
23
+ if (!moovBox) {
24
+ return {
25
+ format,
26
+ size,
27
+ duration: 0,
28
+ audioDataSize: 0,
29
+ frames: [],
30
+ warnings: ['Could not find moov box']
31
+ };
32
+ }
33
+ const initSegment = { offset: moovBox.offset, length: moovBox.size };
34
+ const moovData = buffer.subarray(moovBox.dataOffset, moovBox.offset + moovBox.size);
35
+ const mvhd = this.findBox(moovData, 'mvhd');
36
+ let movieTimescale = 1000;
37
+ let movieDuration = 0;
38
+ if (mvhd) {
39
+ const d = moovData;
40
+ const o = mvhd.dataOffset;
41
+ const version = d[o];
42
+ if (version === 1) {
43
+ movieTimescale = d.readUInt32BE(o + 16);
44
+ movieDuration = Number(d.readBigUInt64BE(o + 20));
45
+ }
46
+ else {
47
+ movieTimescale = d.readUInt32BE(o + 8);
48
+ movieDuration = d.readUInt32BE(o + 12);
49
+ }
50
+ }
51
+ const totalDurationSeconds = movieTimescale > 0 ? movieDuration / movieTimescale : 0;
52
+ const tracks = this.parseTracks(moovData, warnings);
53
+ const videoTrack = tracks.find(t => t.isVideo) ?? tracks[0];
54
+ if (!videoTrack) {
55
+ return {
56
+ format,
57
+ size,
58
+ duration: totalDurationSeconds,
59
+ audioDataSize: 0,
60
+ frames: [],
61
+ initSegment,
62
+ warnings: ['No tracks found']
63
+ };
64
+ }
65
+ const frames = this.buildFrameTable(videoTrack, warnings);
66
+ const audioDataSize = frames.reduce((acc, f) => acc + f.length, 0);
67
+ const averageBitrate = totalDurationSeconds > 0
68
+ ? (audioDataSize * 8) / totalDurationSeconds / 1000
69
+ : undefined;
70
+ const result = {
71
+ format,
72
+ size,
73
+ duration: totalDurationSeconds,
74
+ audioDataSize,
75
+ frames,
76
+ initSegment,
77
+ };
78
+ if (videoTrack.isVideo) {
79
+ result.width = videoTrack.width;
80
+ result.height = videoTrack.height;
81
+ if (videoTrack.frameRate > 0) {
82
+ result.frameRate = videoTrack.frameRate;
83
+ }
84
+ }
85
+ if (averageBitrate !== undefined) {
86
+ result.averageBitrate = averageBitrate;
87
+ }
88
+ result.metadata = { container: format === 'mov' ? 'mov' : 'mp4' };
89
+ if (warnings.length > 0) {
90
+ result.warnings = warnings;
91
+ }
92
+ return result;
93
+ }
94
+ detectFormat(buffer) {
95
+ if (buffer.length < 12)
96
+ return 'mp4';
97
+ const brand = buffer.toString('ascii', 8, 12);
98
+ if (brand === 'qt ')
99
+ return 'mov';
100
+ if (brand.startsWith('M4V'))
101
+ return 'm4v';
102
+ return 'mp4';
103
+ }
104
+ findTopLevelBox(buffer, type) {
105
+ let offset = 0;
106
+ while (offset + 8 <= buffer.length) {
107
+ let size = buffer.readUInt32BE(offset);
108
+ const boxType = buffer.toString('ascii', offset + 4, offset + 8);
109
+ let dataOffset = offset + 8;
110
+ if (size === 1) {
111
+ if (offset + 16 > buffer.length)
112
+ break;
113
+ size = Number(buffer.readBigUInt64BE(offset + 8));
114
+ dataOffset = offset + 16;
115
+ }
116
+ else if (size === 0) {
117
+ size = buffer.length - offset;
118
+ }
119
+ if (size < 8)
120
+ break;
121
+ if (boxType === type) {
122
+ return { offset, size, type: boxType, dataOffset };
123
+ }
124
+ offset += size;
125
+ }
126
+ return null;
127
+ }
128
+ findBox(data, type) {
129
+ let offset = 0;
130
+ while (offset + 8 <= data.length) {
131
+ let size = data.readUInt32BE(offset);
132
+ const boxType = data.toString('ascii', offset + 4, offset + 8);
133
+ let dataOffset = offset + 8;
134
+ if (size === 1) {
135
+ if (offset + 16 > data.length)
136
+ break;
137
+ size = Number(data.readBigUInt64BE(offset + 8));
138
+ dataOffset = offset + 16;
139
+ }
140
+ else if (size === 0) {
141
+ size = data.length - offset;
142
+ }
143
+ if (size < 8)
144
+ break;
145
+ if (boxType === type) {
146
+ return { offset, size, type: boxType, dataOffset };
147
+ }
148
+ offset += size;
149
+ }
150
+ return null;
151
+ }
152
+ findAllBoxes(data, type) {
153
+ const results = [];
154
+ let offset = 0;
155
+ while (offset + 8 <= data.length) {
156
+ let size = data.readUInt32BE(offset);
157
+ const boxType = data.toString('ascii', offset + 4, offset + 8);
158
+ let dataOffset = offset + 8;
159
+ if (size === 1) {
160
+ if (offset + 16 > data.length)
161
+ break;
162
+ size = Number(data.readBigUInt64BE(offset + 8));
163
+ dataOffset = offset + 16;
164
+ }
165
+ else if (size === 0) {
166
+ size = data.length - offset;
167
+ }
168
+ if (size < 8)
169
+ break;
170
+ if (boxType === type) {
171
+ results.push({ offset, size, type: boxType, dataOffset });
172
+ }
173
+ offset += size;
174
+ }
175
+ return results;
176
+ }
177
+ parseTracks(moovData, warnings) {
178
+ const trakBoxes = this.findAllBoxes(moovData, 'trak');
179
+ const tracks = [];
180
+ for (const trak of trakBoxes) {
181
+ const trakData = moovData.subarray(trak.dataOffset, trak.offset + trak.size);
182
+ const track = this.parseTrack(trakData, warnings);
183
+ if (track)
184
+ tracks.push(track);
185
+ }
186
+ return tracks;
187
+ }
188
+ parseTrack(trakData, warnings) {
189
+ const tkhd = this.findBox(trakData, 'tkhd');
190
+ let width = 0;
191
+ let height = 0;
192
+ if (tkhd) {
193
+ const o = tkhd.dataOffset;
194
+ const version = trakData[o];
195
+ const tkhdSize = tkhd.size;
196
+ if (version === 1 && tkhdSize >= 96) {
197
+ width = trakData.readUInt32BE(o + 76) >> 16;
198
+ height = trakData.readUInt32BE(o + 80) >> 16;
199
+ }
200
+ else if (tkhdSize >= 84) {
201
+ width = trakData.readUInt32BE(o + 52) >> 16;
202
+ height = trakData.readUInt32BE(o + 56) >> 16;
203
+ }
204
+ }
205
+ const mdia = this.findBox(trakData, 'mdia');
206
+ if (!mdia)
207
+ return null;
208
+ const mdiaData = trakData.subarray(mdia.dataOffset, mdia.offset + mdia.size);
209
+ const mdhd = this.findBox(mdiaData, 'mdhd');
210
+ let timescale = 1000;
211
+ let trackDuration = 0;
212
+ if (mdhd) {
213
+ const o = mdhd.dataOffset;
214
+ const version = mdiaData[o];
215
+ if (version === 1) {
216
+ timescale = mdiaData.readUInt32BE(o + 16);
217
+ trackDuration = Number(mdiaData.readBigUInt64BE(o + 20));
218
+ }
219
+ else {
220
+ timescale = mdiaData.readUInt32BE(o + 8);
221
+ trackDuration = mdiaData.readUInt32BE(o + 12);
222
+ }
223
+ }
224
+ const hdlr = this.findBox(mdiaData, 'hdlr');
225
+ let isVideo = false;
226
+ if (hdlr) {
227
+ const handlerType = mdiaData.toString('ascii', hdlr.dataOffset + 4, hdlr.dataOffset + 8);
228
+ isVideo = handlerType === 'vide';
229
+ }
230
+ const minf = this.findBox(mdiaData, 'minf');
231
+ if (!minf)
232
+ return null;
233
+ const minfData = mdiaData.subarray(minf.dataOffset, minf.offset + minf.size);
234
+ const stbl = this.findBox(minfData, 'stbl');
235
+ if (!stbl)
236
+ return null;
237
+ const stblData = minfData.subarray(stbl.dataOffset, stbl.offset + stbl.size);
238
+ const sttsEntries = this.parseStts(stblData);
239
+ const { defaultSize, sampleCount, sizes } = this.parseStsz(stblData);
240
+ const chunkOffsets = this.parseStco(stblData);
241
+ const keyframeSet = this.parseStss(stblData);
242
+ const stscEntries = this.parseStsc(stblData);
243
+ let frameRate = 0;
244
+ if (sttsEntries.length > 0 && timescale > 0) {
245
+ const firstEntry = sttsEntries[0];
246
+ if (firstEntry.delta > 0) {
247
+ frameRate = timescale / firstEntry.delta;
248
+ }
249
+ }
250
+ return {
251
+ timescale,
252
+ duration: trackDuration,
253
+ width,
254
+ height,
255
+ isVideo,
256
+ sttsEntries,
257
+ stszSizes: sizes,
258
+ stszDefaultSize: defaultSize,
259
+ stszSampleCount: sampleCount,
260
+ stcoOffsets: chunkOffsets,
261
+ stssKeyframes: keyframeSet,
262
+ stscEntries,
263
+ frameRate,
264
+ };
265
+ }
266
+ parseStts(stblData) {
267
+ const stts = this.findBox(stblData, 'stts');
268
+ if (!stts)
269
+ return [];
270
+ const o = stts.dataOffset;
271
+ const entryCount = stblData.readUInt32BE(o + 4);
272
+ const entries = [];
273
+ for (let i = 0; i < entryCount; i++) {
274
+ const base = o + 8 + i * 8;
275
+ if (base + 8 > stblData.length)
276
+ break;
277
+ entries.push({
278
+ count: stblData.readUInt32BE(base),
279
+ delta: stblData.readUInt32BE(base + 4),
280
+ });
281
+ }
282
+ return entries;
283
+ }
284
+ parseStsz(stblData) {
285
+ const stsz = this.findBox(stblData, 'stsz');
286
+ if (!stsz)
287
+ return { defaultSize: 0, sampleCount: 0, sizes: [] };
288
+ const o = stsz.dataOffset;
289
+ const defaultSize = stblData.readUInt32BE(o + 4);
290
+ const sampleCount = stblData.readUInt32BE(o + 8);
291
+ const sizes = [];
292
+ if (defaultSize === 0) {
293
+ for (let i = 0; i < sampleCount; i++) {
294
+ const base = o + 12 + i * 4;
295
+ if (base + 4 > stblData.length)
296
+ break;
297
+ sizes.push(stblData.readUInt32BE(base));
298
+ }
299
+ }
300
+ return { defaultSize, sampleCount, sizes };
301
+ }
302
+ parseStco(stblData) {
303
+ const co64 = this.findBox(stblData, 'co64');
304
+ if (co64) {
305
+ const o = co64.dataOffset;
306
+ const entryCount = stblData.readUInt32BE(o + 4);
307
+ const offsets = [];
308
+ for (let i = 0; i < entryCount; i++) {
309
+ const base = o + 8 + i * 8;
310
+ if (base + 8 > stblData.length)
311
+ break;
312
+ offsets.push(Number(stblData.readBigUInt64BE(base)));
313
+ }
314
+ return offsets;
315
+ }
316
+ const stco = this.findBox(stblData, 'stco');
317
+ if (!stco)
318
+ return [];
319
+ const o = stco.dataOffset;
320
+ const entryCount = stblData.readUInt32BE(o + 4);
321
+ const offsets = [];
322
+ for (let i = 0; i < entryCount; i++) {
323
+ const base = o + 8 + i * 4;
324
+ if (base + 4 > stblData.length)
325
+ break;
326
+ offsets.push(stblData.readUInt32BE(base));
327
+ }
328
+ return offsets;
329
+ }
330
+ parseStss(stblData) {
331
+ const stss = this.findBox(stblData, 'stss');
332
+ const keyframes = new Set();
333
+ if (!stss)
334
+ return keyframes;
335
+ const o = stss.dataOffset;
336
+ const entryCount = stblData.readUInt32BE(o + 4);
337
+ for (let i = 0; i < entryCount; i++) {
338
+ const base = o + 8 + i * 4;
339
+ if (base + 4 > stblData.length)
340
+ break;
341
+ keyframes.add(stblData.readUInt32BE(base));
342
+ }
343
+ return keyframes;
344
+ }
345
+ parseStsc(stblData) {
346
+ const stsc = this.findBox(stblData, 'stsc');
347
+ if (!stsc)
348
+ return [];
349
+ const o = stsc.dataOffset;
350
+ const entryCount = stblData.readUInt32BE(o + 4);
351
+ const entries = [];
352
+ for (let i = 0; i < entryCount; i++) {
353
+ const base = o + 8 + i * 12;
354
+ if (base + 12 > stblData.length)
355
+ break;
356
+ entries.push({
357
+ firstChunk: stblData.readUInt32BE(base),
358
+ samplesPerChunk: stblData.readUInt32BE(base + 4),
359
+ descIndex: stblData.readUInt32BE(base + 8),
360
+ });
361
+ }
362
+ return entries;
363
+ }
364
+ buildFrameTable(track, warnings) {
365
+ const frames = [];
366
+ const { sttsEntries, stszSizes, stszDefaultSize, stszSampleCount, stcoOffsets, stscEntries, stssKeyframes, timescale } = track;
367
+ if (stcoOffsets.length === 0 || stszSampleCount === 0) {
368
+ warnings.push('Missing chunk offset or sample size table');
369
+ return frames;
370
+ }
371
+ const sampleDurations = [];
372
+ for (const entry of sttsEntries) {
373
+ for (let i = 0; i < entry.count; i++) {
374
+ sampleDurations.push(entry.delta);
375
+ }
376
+ }
377
+ const getSampleSize = (i) => {
378
+ if (stszDefaultSize > 0)
379
+ return stszDefaultSize;
380
+ return stszSizes[i] ?? 0;
381
+ };
382
+ const getSamplesPerChunk = (chunkIndex1based) => {
383
+ let result = 1;
384
+ for (const entry of stscEntries) {
385
+ if (chunkIndex1based >= entry.firstChunk) {
386
+ result = entry.samplesPerChunk;
387
+ }
388
+ else {
389
+ break;
390
+ }
391
+ }
392
+ return result;
393
+ };
394
+ let sampleIndex = 0;
395
+ for (let chunkIdx = 0; chunkIdx < stcoOffsets.length && sampleIndex < stszSampleCount; chunkIdx++) {
396
+ const chunkOffset = stcoOffsets[chunkIdx];
397
+ const samplesInChunk = getSamplesPerChunk(chunkIdx + 1);
398
+ let offsetInChunk = 0;
399
+ for (let s = 0; s < samplesInChunk && sampleIndex < stszSampleCount; s++) {
400
+ const sampleSize = getSampleSize(sampleIndex);
401
+ const sampleDelta = sampleDurations[sampleIndex] ?? (sampleDurations[sampleDurations.length - 1] ?? 1);
402
+ const duration = timescale > 0 ? sampleDelta / timescale : 0;
403
+ const sampleNumber1based = sampleIndex + 1;
404
+ frames.push({
405
+ index: sampleIndex,
406
+ offset: chunkOffset + offsetInChunk,
407
+ length: sampleSize,
408
+ duration,
409
+ samples: sampleDelta,
410
+ sampleRate: timescale,
411
+ bitrate: duration > 0 ? Math.round((sampleSize * 8) / duration / 1000) : 0,
412
+ keyFrame: stssKeyframes.size === 0 ? true : stssKeyframes.has(sampleNumber1based),
413
+ });
414
+ offsetInChunk += sampleSize;
415
+ sampleIndex++;
416
+ }
417
+ }
418
+ return frames;
419
+ }
420
+ }
421
+ exports.Mp4Parser = Mp4Parser;
422
+ //# sourceMappingURL=Mp4Parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mp4Parser.js","sourceRoot":"","sources":["../../../src/Parsers/Mp4Parser.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { IAudioParser, AudioFileInfo, AudioFormat } from './IAudioParser';
2
- export declare class OggParser implements IAudioParser {
1
+ import { IMediaParser, MediaFileInfo, MediaFormat } from './IMediaParser';
2
+ export declare class OggParser implements IMediaParser {
3
3
  private static readonly OGG_SIGNATURE;
4
- getFormat(): AudioFormat;
4
+ getFormat(): MediaFormat;
5
5
  canParse(buffer: Buffer): boolean;
6
6
  analyze(buffer: Buffer, opts?: {
7
7
  fileSize?: number;
8
- }): AudioFileInfo;
8
+ }): MediaFileInfo;
9
9
  private parseVorbisIdHeader;
10
10
  }
11
11
  //# sourceMappingURL=OggParser.d.ts.map
@@ -1,10 +1,10 @@
1
- import { IAudioParser, AudioFormat } from './IAudioParser';
1
+ import { IMediaParser, MediaFormat } from './IMediaParser';
2
2
  export declare class ParserFactory {
3
3
  private static parsers;
4
- static getParser(format: AudioFormat): IAudioParser | null;
5
- static detectParser(buffer: Buffer): IAudioParser | null;
6
- static getParserByExtension(filePath: string): IAudioParser | null;
7
- static getSupportedFormats(): AudioFormat[];
4
+ static getParser(format: MediaFormat): IMediaParser | null;
5
+ static detectParser(buffer: Buffer): IMediaParser | null;
6
+ static getParserByExtension(filePath: string): IMediaParser | null;
7
+ static getSupportedFormats(): MediaFormat[];
8
8
  static isFormatSupported(format: string): boolean;
9
9
  }
10
10
  //# sourceMappingURL=ParserFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParserFactory.d.ts","sourceRoot":"","sources":["../../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAW3D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,OAAO,CAMpB;IAOF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,IAAI;IAY1D,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAgBxD,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQlE,MAAM,CAAC,mBAAmB,IAAI,WAAW,EAAE;IAO3C,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGlD"}
1
+ {"version":3,"file":"ParserFactory.d.ts","sourceRoot":"","sources":["../../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAY3D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,OAAO,CAOpB;IAOF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,IAAI;IAc1D,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAgBxD,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQlE,MAAM,CAAC,mBAAmB,IAAI,WAAW,EAAE;IAO3C,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGlD"}
@@ -6,11 +6,13 @@ const AacParser_1 = require("./AacParser");
6
6
  const OggParser_1 = require("./OggParser");
7
7
  const FlacParser_1 = require("./FlacParser");
8
8
  const WavParser_1 = require("./WavParser");
9
+ const Mp4Parser_1 = require("./Mp4Parser");
9
10
  const FormatDetector_1 = require("../Libs/FormatDetector");
10
11
  class ParserFactory {
11
12
  static getParser(format) {
12
13
  const searchFormat = format === 'm4a' ? 'aac' : format;
13
- return this.parsers.find(parser => parser.getFormat() === searchFormat) || null;
14
+ const resolvedFormat = (searchFormat === 'mov' || searchFormat === 'm4v') ? 'mp4' : searchFormat;
15
+ return this.parsers.find(parser => parser.getFormat() === resolvedFormat) || null;
14
16
  }
15
17
  static detectParser(buffer) {
16
18
  for (const parser of this.parsers) {
@@ -25,7 +27,7 @@ class ParserFactory {
25
27
  return format ? this.getParser(format) : null;
26
28
  }
27
29
  static getSupportedFormats() {
28
- return ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav'];
30
+ return ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav', 'mp4', 'mov', 'm4v'];
29
31
  }
30
32
  static isFormatSupported(format) {
31
33
  return this.getSupportedFormats().includes(format);
@@ -41,7 +43,8 @@ Object.defineProperty(ParserFactory, "parsers", {
41
43
  new AacParser_1.AacParser(),
42
44
  new OggParser_1.OggParser(),
43
45
  new FlacParser_1.FlacParser(),
44
- new WavParser_1.WavParser()
46
+ new WavParser_1.WavParser(),
47
+ new Mp4Parser_1.Mp4Parser(),
45
48
  ]
46
49
  });
47
50
  //# sourceMappingURL=ParserFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParserFactory.js","sourceRoot":"","sources":["../../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,2CAAwC;AACxC,2CAAwC;AACxC,6CAA0C;AAC1C,2CAAwC;AACxC,2DAAwD;AAKxD,MAAa,aAAa;IAcxB,MAAM,CAAC,SAAS,CAAC,MAAmB;QAElC,MAAM,YAAY,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC;IAClF,CAAC;IAOD,MAAM,CAAC,YAAY,CAAC,MAAc;QAEhC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,MAAM,CAAC,oBAAoB,CAAC,QAAgB;QAC1C,MAAM,MAAM,GAAG,+BAAc,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAKD,MAAM,CAAC,mBAAmB;QACxB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAKD,MAAM,CAAC,iBAAiB,CAAC,MAAc;QACrC,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,MAAqB,CAAC,CAAC;IACpE,CAAC;;AA3DH,sCA4DC;AA3DgB;;;;WAA0B;QACvC,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;QACf,IAAI,uBAAU,EAAE;QAChB,IAAI,qBAAS,EAAE;KAChB;GAAC"}
1
+ {"version":3,"file":"ParserFactory.js","sourceRoot":"","sources":["../../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,2CAAwC;AACxC,2CAAwC;AACxC,6CAA0C;AAC1C,2CAAwC;AACxC,2CAAwC;AACxC,2DAAwD;AAKxD,MAAa,aAAa;IAexB,MAAM,CAAC,SAAS,CAAC,MAAmB;QAElC,MAAM,YAAY,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvD,MAAM,cAAc,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;QAEjG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,cAAc,CAAC,IAAI,IAAI,CAAC;IACpF,CAAC;IAOD,MAAM,CAAC,YAAY,CAAC,MAAc;QAEhC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,MAAM,CAAC,oBAAoB,CAAC,QAAgB;QAC1C,MAAM,MAAM,GAAG,+BAAc,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAKD,MAAM,CAAC,mBAAmB;QACxB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IAKD,MAAM,CAAC,iBAAiB,CAAC,MAAc;QACrC,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,MAAqB,CAAC,CAAC;IACpE,CAAC;;AA9DH,sCA+DC;AA9DgB;;;;WAA0B;QACvC,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;QACf,IAAI,uBAAU,EAAE;QAChB,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;KAChB;GAAC"}
@@ -1,9 +1,9 @@
1
- import { IAudioParser, AudioFileInfo, AudioFormat } from './IAudioParser';
2
- export declare class WavParser implements IAudioParser {
3
- getFormat(): AudioFormat;
1
+ import { IMediaParser, MediaFileInfo, MediaFormat } from './IMediaParser';
2
+ export declare class WavParser implements IMediaParser {
3
+ getFormat(): MediaFormat;
4
4
  canParse(buffer: Buffer): boolean;
5
5
  analyze(buffer: Buffer, opts?: {
6
6
  fileSize?: number;
7
- }): AudioFileInfo;
7
+ }): MediaFileInfo;
8
8
  }
9
9
  //# sourceMappingURL=WavParser.d.ts.map
@@ -38,7 +38,7 @@ class InvalidParameterError extends HlsStreamerError {
38
38
  exports.InvalidParameterError = InvalidParameterError;
39
39
  class UnsupportedFormatError extends HlsStreamerError {
40
40
  constructor(format) {
41
- super(`Unsupported audio format: ${format}`);
41
+ super(`Unsupported media format: ${format}`);
42
42
  this.name = 'UnsupportedFormatError';
43
43
  }
44
44
  }
@@ -22,6 +22,7 @@ export declare class HlsStreamer {
22
22
  private buildSegmentUrl;
23
23
  private calculateSegmentSize;
24
24
  private padNumber;
25
+ getMediaType(): Promise<'audio' | 'video'>;
25
26
  getSegmentDuration(segmentIndex: number): Promise<number>;
26
27
  }
27
28
  export * from './Interfaces/HlsStreamer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAA8B,MAAM,0BAA0B,CAAC;AAe1F,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAA4B;gBAKhC,OAAO,EAAE,kBAAkB;IAYvC,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;YAoCN,WAAW;IAkBnB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BlE,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;YA+BrB,WAAW;IAiFzB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,2BAA2B;IAmBnC,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,SAAS;IAOX,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAchE;AAGD,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAA8B,MAAM,0BAA0B,CAAC;AAe1F,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,QAAQ,CAA4B;gBAKhC,OAAO,EAAE,kBAAkB;IAYvC,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;YAoCN,WAAW;IAkBnB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BlE,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;YAsCrB,WAAW;IAsFzB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,2BAA2B;IAmBnC,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,SAAS;IAQX,YAAY,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAS1C,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAchE;AAGD,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -103,7 +103,7 @@ class HlsStreamer {
103
103
  throw new HlsStreamerErrors_1.InvalidFileError('Path is not a file');
104
104
  }
105
105
  if (format) {
106
- const supportedFormats = ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav'];
106
+ const supportedFormats = ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav', 'mp4', 'mov', 'm4v'];
107
107
  if (!supportedFormats.includes(format.toLowerCase())) {
108
108
  throw new HlsStreamerErrors_1.UnsupportedFormatError(format);
109
109
  }
@@ -128,7 +128,7 @@ class HlsStreamer {
128
128
  }
129
129
  async getFileInfo() {
130
130
  if (!this.fileInfo) {
131
- const analysis = await FileLib_1.FileLib.analyzeAudioFile(this.filePath, this.formatOverride);
131
+ const analysis = await FileLib_1.FileLib.analyzeMediaFile(this.filePath, this.formatOverride);
132
132
  if (analysis.size <= 0) {
133
133
  throw new HlsStreamerErrors_1.InvalidFileError('File is empty');
134
134
  }
@@ -169,13 +169,19 @@ class HlsStreamer {
169
169
  }
170
170
  const maxSegmentDuration = segments.reduce((max, segment) => Math.max(max, segment.duration), 0);
171
171
  const targetDurationSeconds = Math.max(1, Math.ceil(maxSegmentDuration || fileInfo.duration || 1));
172
+ const isVideo = !!fileInfo.initSegment;
172
173
  const m3u8 = [
173
174
  '#EXTM3U',
174
- '#EXT-X-VERSION:6',
175
+ `#EXT-X-VERSION:${isVideo ? 7 : 6}`,
175
176
  '#EXT-X-PLAYLIST-TYPE:VOD',
176
177
  `#EXT-X-TARGETDURATION:${targetDurationSeconds}`,
177
178
  '#EXT-X-MEDIA-SEQUENCE:0',
178
179
  ];
180
+ if (isVideo && fileInfo.initSegment) {
181
+ const { offset, length } = fileInfo.initSegment;
182
+ const initUrl = this.buildSegmentUrl(offset, offset + length, -1, 'init');
183
+ m3u8.push(`#EXT-X-MAP:URI="${initUrl}"`);
184
+ }
179
185
  segments.forEach((segment, index) => {
180
186
  const segmentUrl = this.buildSegmentUrl(segment.start, segment.end, index);
181
187
  m3u8.push(`#EXTINF:${segment.duration.toFixed(3)},`);
@@ -207,7 +213,10 @@ class HlsStreamer {
207
213
  while (frameCursor < frames.length) {
208
214
  const frame = frames[frameCursor];
209
215
  const nextBytes = consumedBytes + frame.length;
210
- if (consumedBytes > 0 && nextBytes > targetBytes) {
216
+ if (consumedBytes > 0 && frame.keyFrame === true && consumedBytes >= targetBytes * 0.5) {
217
+ break;
218
+ }
219
+ if (consumedBytes > 0 && nextBytes > targetBytes && frame.keyFrame !== true) {
211
220
  break;
212
221
  }
213
222
  consumedBytes = nextBytes;
@@ -296,10 +305,11 @@ class HlsStreamer {
296
305
  : 16000;
297
306
  return segmentSize / estimatedBytesPerSecond;
298
307
  }
299
- buildSegmentUrl(start, end, index) {
308
+ buildSegmentUrl(start, end, index, nameSuffix) {
300
309
  const baseUrlPrefix = this.baseUrl ? `/${this.baseUrl}` : '';
301
310
  const ext = this.fileInfo?.format || node_path_1.default.extname(this.filePath).toLowerCase().slice(1) || 'mp3';
302
- return `${baseUrlPrefix}/${start}/${end}/${this.fileName}${this.padNumber(index, 3)}.${ext}`;
311
+ const name = nameSuffix !== undefined ? `${this.fileName}${nameSuffix}` : `${this.fileName}${this.padNumber(index, 3)}`;
312
+ return `${baseUrlPrefix}/${start}/${end}/${name}.${ext}`;
303
313
  }
304
314
  calculateSegmentSize(segmentIndex) {
305
315
  if (!this.enableFastStart) {
@@ -317,6 +327,11 @@ class HlsStreamer {
317
327
  padNumber(value, padding) {
318
328
  return value.toString().padStart(padding, '0');
319
329
  }
330
+ async getMediaType() {
331
+ const fileInfo = await this.getFileInfo();
332
+ const videoFormats = ['mp4', 'mov', 'm4v'];
333
+ return videoFormats.includes(fileInfo.format) ? 'video' : 'audio';
334
+ }
320
335
  async getSegmentDuration(segmentIndex) {
321
336
  if (!Number.isInteger(segmentIndex) || segmentIndex < 0) {
322
337
  throw new HlsStreamerErrors_1.InvalidParameterError('segmentIndex', segmentIndex);