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,418 @@
1
+ export class Mp4Parser {
2
+ getFormat() {
3
+ return 'mp4';
4
+ }
5
+ canParse(buffer) {
6
+ if (buffer.length < 12)
7
+ return false;
8
+ const boxType = buffer.toString('ascii', 4, 8);
9
+ if (boxType !== 'ftyp')
10
+ return false;
11
+ const brand = buffer.toString('ascii', 8, 12);
12
+ const videoBrands = ['isom', 'mp41', 'mp42', 'M4V ', 'M4A ', 'avc1', 'iso2', 'iso5', 'iso6'];
13
+ return videoBrands.includes(brand) || boxType === 'ftyp';
14
+ }
15
+ analyze(buffer, opts = {}) {
16
+ const size = opts.fileSize ?? buffer.length;
17
+ const warnings = [];
18
+ const format = this.detectFormat(buffer);
19
+ const moovBox = this.findTopLevelBox(buffer, 'moov');
20
+ if (!moovBox) {
21
+ return {
22
+ format,
23
+ size,
24
+ duration: 0,
25
+ audioDataSize: 0,
26
+ frames: [],
27
+ warnings: ['Could not find moov box']
28
+ };
29
+ }
30
+ const initSegment = { offset: moovBox.offset, length: moovBox.size };
31
+ const moovData = buffer.subarray(moovBox.dataOffset, moovBox.offset + moovBox.size);
32
+ const mvhd = this.findBox(moovData, 'mvhd');
33
+ let movieTimescale = 1000;
34
+ let movieDuration = 0;
35
+ if (mvhd) {
36
+ const d = moovData;
37
+ const o = mvhd.dataOffset;
38
+ const version = d[o];
39
+ if (version === 1) {
40
+ movieTimescale = d.readUInt32BE(o + 16);
41
+ movieDuration = Number(d.readBigUInt64BE(o + 20));
42
+ }
43
+ else {
44
+ movieTimescale = d.readUInt32BE(o + 8);
45
+ movieDuration = d.readUInt32BE(o + 12);
46
+ }
47
+ }
48
+ const totalDurationSeconds = movieTimescale > 0 ? movieDuration / movieTimescale : 0;
49
+ const tracks = this.parseTracks(moovData, warnings);
50
+ const videoTrack = tracks.find(t => t.isVideo) ?? tracks[0];
51
+ if (!videoTrack) {
52
+ return {
53
+ format,
54
+ size,
55
+ duration: totalDurationSeconds,
56
+ audioDataSize: 0,
57
+ frames: [],
58
+ initSegment,
59
+ warnings: ['No tracks found']
60
+ };
61
+ }
62
+ const frames = this.buildFrameTable(videoTrack, warnings);
63
+ const audioDataSize = frames.reduce((acc, f) => acc + f.length, 0);
64
+ const averageBitrate = totalDurationSeconds > 0
65
+ ? (audioDataSize * 8) / totalDurationSeconds / 1000
66
+ : undefined;
67
+ const result = {
68
+ format,
69
+ size,
70
+ duration: totalDurationSeconds,
71
+ audioDataSize,
72
+ frames,
73
+ initSegment,
74
+ };
75
+ if (videoTrack.isVideo) {
76
+ result.width = videoTrack.width;
77
+ result.height = videoTrack.height;
78
+ if (videoTrack.frameRate > 0) {
79
+ result.frameRate = videoTrack.frameRate;
80
+ }
81
+ }
82
+ if (averageBitrate !== undefined) {
83
+ result.averageBitrate = averageBitrate;
84
+ }
85
+ result.metadata = { container: format === 'mov' ? 'mov' : 'mp4' };
86
+ if (warnings.length > 0) {
87
+ result.warnings = warnings;
88
+ }
89
+ return result;
90
+ }
91
+ detectFormat(buffer) {
92
+ if (buffer.length < 12)
93
+ return 'mp4';
94
+ const brand = buffer.toString('ascii', 8, 12);
95
+ if (brand === 'qt ')
96
+ return 'mov';
97
+ if (brand.startsWith('M4V'))
98
+ return 'm4v';
99
+ return 'mp4';
100
+ }
101
+ findTopLevelBox(buffer, type) {
102
+ let offset = 0;
103
+ while (offset + 8 <= buffer.length) {
104
+ let size = buffer.readUInt32BE(offset);
105
+ const boxType = buffer.toString('ascii', offset + 4, offset + 8);
106
+ let dataOffset = offset + 8;
107
+ if (size === 1) {
108
+ if (offset + 16 > buffer.length)
109
+ break;
110
+ size = Number(buffer.readBigUInt64BE(offset + 8));
111
+ dataOffset = offset + 16;
112
+ }
113
+ else if (size === 0) {
114
+ size = buffer.length - offset;
115
+ }
116
+ if (size < 8)
117
+ break;
118
+ if (boxType === type) {
119
+ return { offset, size, type: boxType, dataOffset };
120
+ }
121
+ offset += size;
122
+ }
123
+ return null;
124
+ }
125
+ findBox(data, type) {
126
+ let offset = 0;
127
+ while (offset + 8 <= data.length) {
128
+ let size = data.readUInt32BE(offset);
129
+ const boxType = data.toString('ascii', offset + 4, offset + 8);
130
+ let dataOffset = offset + 8;
131
+ if (size === 1) {
132
+ if (offset + 16 > data.length)
133
+ break;
134
+ size = Number(data.readBigUInt64BE(offset + 8));
135
+ dataOffset = offset + 16;
136
+ }
137
+ else if (size === 0) {
138
+ size = data.length - offset;
139
+ }
140
+ if (size < 8)
141
+ break;
142
+ if (boxType === type) {
143
+ return { offset, size, type: boxType, dataOffset };
144
+ }
145
+ offset += size;
146
+ }
147
+ return null;
148
+ }
149
+ findAllBoxes(data, type) {
150
+ const results = [];
151
+ let offset = 0;
152
+ while (offset + 8 <= data.length) {
153
+ let size = data.readUInt32BE(offset);
154
+ const boxType = data.toString('ascii', offset + 4, offset + 8);
155
+ let dataOffset = offset + 8;
156
+ if (size === 1) {
157
+ if (offset + 16 > data.length)
158
+ break;
159
+ size = Number(data.readBigUInt64BE(offset + 8));
160
+ dataOffset = offset + 16;
161
+ }
162
+ else if (size === 0) {
163
+ size = data.length - offset;
164
+ }
165
+ if (size < 8)
166
+ break;
167
+ if (boxType === type) {
168
+ results.push({ offset, size, type: boxType, dataOffset });
169
+ }
170
+ offset += size;
171
+ }
172
+ return results;
173
+ }
174
+ parseTracks(moovData, warnings) {
175
+ const trakBoxes = this.findAllBoxes(moovData, 'trak');
176
+ const tracks = [];
177
+ for (const trak of trakBoxes) {
178
+ const trakData = moovData.subarray(trak.dataOffset, trak.offset + trak.size);
179
+ const track = this.parseTrack(trakData, warnings);
180
+ if (track)
181
+ tracks.push(track);
182
+ }
183
+ return tracks;
184
+ }
185
+ parseTrack(trakData, warnings) {
186
+ const tkhd = this.findBox(trakData, 'tkhd');
187
+ let width = 0;
188
+ let height = 0;
189
+ if (tkhd) {
190
+ const o = tkhd.dataOffset;
191
+ const version = trakData[o];
192
+ const tkhdSize = tkhd.size;
193
+ if (version === 1 && tkhdSize >= 96) {
194
+ width = trakData.readUInt32BE(o + 76) >> 16;
195
+ height = trakData.readUInt32BE(o + 80) >> 16;
196
+ }
197
+ else if (tkhdSize >= 84) {
198
+ width = trakData.readUInt32BE(o + 52) >> 16;
199
+ height = trakData.readUInt32BE(o + 56) >> 16;
200
+ }
201
+ }
202
+ const mdia = this.findBox(trakData, 'mdia');
203
+ if (!mdia)
204
+ return null;
205
+ const mdiaData = trakData.subarray(mdia.dataOffset, mdia.offset + mdia.size);
206
+ const mdhd = this.findBox(mdiaData, 'mdhd');
207
+ let timescale = 1000;
208
+ let trackDuration = 0;
209
+ if (mdhd) {
210
+ const o = mdhd.dataOffset;
211
+ const version = mdiaData[o];
212
+ if (version === 1) {
213
+ timescale = mdiaData.readUInt32BE(o + 16);
214
+ trackDuration = Number(mdiaData.readBigUInt64BE(o + 20));
215
+ }
216
+ else {
217
+ timescale = mdiaData.readUInt32BE(o + 8);
218
+ trackDuration = mdiaData.readUInt32BE(o + 12);
219
+ }
220
+ }
221
+ const hdlr = this.findBox(mdiaData, 'hdlr');
222
+ let isVideo = false;
223
+ if (hdlr) {
224
+ const handlerType = mdiaData.toString('ascii', hdlr.dataOffset + 4, hdlr.dataOffset + 8);
225
+ isVideo = handlerType === 'vide';
226
+ }
227
+ const minf = this.findBox(mdiaData, 'minf');
228
+ if (!minf)
229
+ return null;
230
+ const minfData = mdiaData.subarray(minf.dataOffset, minf.offset + minf.size);
231
+ const stbl = this.findBox(minfData, 'stbl');
232
+ if (!stbl)
233
+ return null;
234
+ const stblData = minfData.subarray(stbl.dataOffset, stbl.offset + stbl.size);
235
+ const sttsEntries = this.parseStts(stblData);
236
+ const { defaultSize, sampleCount, sizes } = this.parseStsz(stblData);
237
+ const chunkOffsets = this.parseStco(stblData);
238
+ const keyframeSet = this.parseStss(stblData);
239
+ const stscEntries = this.parseStsc(stblData);
240
+ let frameRate = 0;
241
+ if (sttsEntries.length > 0 && timescale > 0) {
242
+ const firstEntry = sttsEntries[0];
243
+ if (firstEntry.delta > 0) {
244
+ frameRate = timescale / firstEntry.delta;
245
+ }
246
+ }
247
+ return {
248
+ timescale,
249
+ duration: trackDuration,
250
+ width,
251
+ height,
252
+ isVideo,
253
+ sttsEntries,
254
+ stszSizes: sizes,
255
+ stszDefaultSize: defaultSize,
256
+ stszSampleCount: sampleCount,
257
+ stcoOffsets: chunkOffsets,
258
+ stssKeyframes: keyframeSet,
259
+ stscEntries,
260
+ frameRate,
261
+ };
262
+ }
263
+ parseStts(stblData) {
264
+ const stts = this.findBox(stblData, 'stts');
265
+ if (!stts)
266
+ return [];
267
+ const o = stts.dataOffset;
268
+ const entryCount = stblData.readUInt32BE(o + 4);
269
+ const entries = [];
270
+ for (let i = 0; i < entryCount; i++) {
271
+ const base = o + 8 + i * 8;
272
+ if (base + 8 > stblData.length)
273
+ break;
274
+ entries.push({
275
+ count: stblData.readUInt32BE(base),
276
+ delta: stblData.readUInt32BE(base + 4),
277
+ });
278
+ }
279
+ return entries;
280
+ }
281
+ parseStsz(stblData) {
282
+ const stsz = this.findBox(stblData, 'stsz');
283
+ if (!stsz)
284
+ return { defaultSize: 0, sampleCount: 0, sizes: [] };
285
+ const o = stsz.dataOffset;
286
+ const defaultSize = stblData.readUInt32BE(o + 4);
287
+ const sampleCount = stblData.readUInt32BE(o + 8);
288
+ const sizes = [];
289
+ if (defaultSize === 0) {
290
+ for (let i = 0; i < sampleCount; i++) {
291
+ const base = o + 12 + i * 4;
292
+ if (base + 4 > stblData.length)
293
+ break;
294
+ sizes.push(stblData.readUInt32BE(base));
295
+ }
296
+ }
297
+ return { defaultSize, sampleCount, sizes };
298
+ }
299
+ parseStco(stblData) {
300
+ const co64 = this.findBox(stblData, 'co64');
301
+ if (co64) {
302
+ const o = co64.dataOffset;
303
+ const entryCount = stblData.readUInt32BE(o + 4);
304
+ const offsets = [];
305
+ for (let i = 0; i < entryCount; i++) {
306
+ const base = o + 8 + i * 8;
307
+ if (base + 8 > stblData.length)
308
+ break;
309
+ offsets.push(Number(stblData.readBigUInt64BE(base)));
310
+ }
311
+ return offsets;
312
+ }
313
+ const stco = this.findBox(stblData, 'stco');
314
+ if (!stco)
315
+ return [];
316
+ const o = stco.dataOffset;
317
+ const entryCount = stblData.readUInt32BE(o + 4);
318
+ const offsets = [];
319
+ for (let i = 0; i < entryCount; i++) {
320
+ const base = o + 8 + i * 4;
321
+ if (base + 4 > stblData.length)
322
+ break;
323
+ offsets.push(stblData.readUInt32BE(base));
324
+ }
325
+ return offsets;
326
+ }
327
+ parseStss(stblData) {
328
+ const stss = this.findBox(stblData, 'stss');
329
+ const keyframes = new Set();
330
+ if (!stss)
331
+ return keyframes;
332
+ const o = stss.dataOffset;
333
+ const entryCount = stblData.readUInt32BE(o + 4);
334
+ for (let i = 0; i < entryCount; i++) {
335
+ const base = o + 8 + i * 4;
336
+ if (base + 4 > stblData.length)
337
+ break;
338
+ keyframes.add(stblData.readUInt32BE(base));
339
+ }
340
+ return keyframes;
341
+ }
342
+ parseStsc(stblData) {
343
+ const stsc = this.findBox(stblData, 'stsc');
344
+ if (!stsc)
345
+ return [];
346
+ const o = stsc.dataOffset;
347
+ const entryCount = stblData.readUInt32BE(o + 4);
348
+ const entries = [];
349
+ for (let i = 0; i < entryCount; i++) {
350
+ const base = o + 8 + i * 12;
351
+ if (base + 12 > stblData.length)
352
+ break;
353
+ entries.push({
354
+ firstChunk: stblData.readUInt32BE(base),
355
+ samplesPerChunk: stblData.readUInt32BE(base + 4),
356
+ descIndex: stblData.readUInt32BE(base + 8),
357
+ });
358
+ }
359
+ return entries;
360
+ }
361
+ buildFrameTable(track, warnings) {
362
+ const frames = [];
363
+ const { sttsEntries, stszSizes, stszDefaultSize, stszSampleCount, stcoOffsets, stscEntries, stssKeyframes, timescale } = track;
364
+ if (stcoOffsets.length === 0 || stszSampleCount === 0) {
365
+ warnings.push('Missing chunk offset or sample size table');
366
+ return frames;
367
+ }
368
+ const sampleDurations = [];
369
+ for (const entry of sttsEntries) {
370
+ for (let i = 0; i < entry.count; i++) {
371
+ sampleDurations.push(entry.delta);
372
+ }
373
+ }
374
+ const getSampleSize = (i) => {
375
+ if (stszDefaultSize > 0)
376
+ return stszDefaultSize;
377
+ return stszSizes[i] ?? 0;
378
+ };
379
+ const getSamplesPerChunk = (chunkIndex1based) => {
380
+ let result = 1;
381
+ for (const entry of stscEntries) {
382
+ if (chunkIndex1based >= entry.firstChunk) {
383
+ result = entry.samplesPerChunk;
384
+ }
385
+ else {
386
+ break;
387
+ }
388
+ }
389
+ return result;
390
+ };
391
+ let sampleIndex = 0;
392
+ for (let chunkIdx = 0; chunkIdx < stcoOffsets.length && sampleIndex < stszSampleCount; chunkIdx++) {
393
+ const chunkOffset = stcoOffsets[chunkIdx];
394
+ const samplesInChunk = getSamplesPerChunk(chunkIdx + 1);
395
+ let offsetInChunk = 0;
396
+ for (let s = 0; s < samplesInChunk && sampleIndex < stszSampleCount; s++) {
397
+ const sampleSize = getSampleSize(sampleIndex);
398
+ const sampleDelta = sampleDurations[sampleIndex] ?? (sampleDurations[sampleDurations.length - 1] ?? 1);
399
+ const duration = timescale > 0 ? sampleDelta / timescale : 0;
400
+ const sampleNumber1based = sampleIndex + 1;
401
+ frames.push({
402
+ index: sampleIndex,
403
+ offset: chunkOffset + offsetInChunk,
404
+ length: sampleSize,
405
+ duration,
406
+ samples: sampleDelta,
407
+ sampleRate: timescale,
408
+ bitrate: duration > 0 ? Math.round((sampleSize * 8) / duration / 1000) : 0,
409
+ keyFrame: stssKeyframes.size === 0 ? true : stssKeyframes.has(sampleNumber1based),
410
+ });
411
+ offsetInChunk += sampleSize;
412
+ sampleIndex++;
413
+ }
414
+ }
415
+ return frames;
416
+ }
417
+ }
418
+ //# 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"}
@@ -3,11 +3,13 @@ import { AacParser } from './AacParser';
3
3
  import { OggParser } from './OggParser';
4
4
  import { FlacParser } from './FlacParser';
5
5
  import { WavParser } from './WavParser';
6
+ import { Mp4Parser } from './Mp4Parser';
6
7
  import { FormatDetector } from '../Libs/FormatDetector';
7
8
  export class ParserFactory {
8
9
  static getParser(format) {
9
10
  const searchFormat = format === 'm4a' ? 'aac' : format;
10
- return this.parsers.find(parser => parser.getFormat() === searchFormat) || null;
11
+ const resolvedFormat = (searchFormat === 'mov' || searchFormat === 'm4v') ? 'mp4' : searchFormat;
12
+ return this.parsers.find(parser => parser.getFormat() === resolvedFormat) || null;
11
13
  }
12
14
  static detectParser(buffer) {
13
15
  for (const parser of this.parsers) {
@@ -22,7 +24,7 @@ export class ParserFactory {
22
24
  return format ? this.getParser(format) : null;
23
25
  }
24
26
  static getSupportedFormats() {
25
- return ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav'];
27
+ return ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav', 'mp4', 'mov', 'm4v'];
26
28
  }
27
29
  static isFormatSupported(format) {
28
30
  return this.getSupportedFormats().includes(format);
@@ -37,7 +39,8 @@ Object.defineProperty(ParserFactory, "parsers", {
37
39
  new AacParser(),
38
40
  new OggParser(),
39
41
  new FlacParser(),
40
- new WavParser()
42
+ new WavParser(),
43
+ new Mp4Parser(),
41
44
  ]
42
45
  });
43
46
  //# sourceMappingURL=ParserFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParserFactory.js","sourceRoot":"","sources":["../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,OAAO,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,cAAc,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;;AA1Dc;;;;WAA0B;QACvC,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,EAAE;QACf,IAAI,UAAU,EAAE;QAChB,IAAI,SAAS,EAAE;KAChB;GAAC"}
1
+ {"version":3,"file":"ParserFactory.js","sourceRoot":"","sources":["../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,OAAO,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,cAAc,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;;AA7Dc;;;;WAA0B;QACvC,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,EAAE;QACf,IAAI,UAAU,EAAE;QAChB,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,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
@@ -1,18 +1,19 @@
1
- import { AudioFormat } from '../Parsers/IAudioParser';
1
+ import { MediaFormat } from '../Parsers/IMediaParser';
2
2
  export interface HlsStreamerOptions {
3
3
  filePath: string;
4
4
  segmentSizeKB?: number;
5
5
  fileName?: string;
6
6
  baseUrl?: string;
7
7
  enableFastStart?: boolean;
8
- format?: AudioFormat;
8
+ format?: MediaFormat;
9
9
  }
10
10
  export interface SegmentInfo {
11
11
  start: number;
12
12
  end: number;
13
13
  duration: number;
14
14
  }
15
- export type { AudioFormat, AudioFrameInfo, AudioFileInfo } from '../Parsers/IAudioParser';
15
+ export type { MediaFormat, MediaFrameInfo, MediaFileInfo, IMediaParser } from '../Parsers/IMediaParser';
16
+ export type { AudioFormat, AudioFrameInfo, AudioFileInfo, IAudioParser } from '../Parsers/IMediaParser';
16
17
  export interface Mp3FrameInfo {
17
18
  index: number;
18
19
  offset: number;
@@ -1 +1 @@
1
- {"version":3,"file":"HlsStreamer.d.ts","sourceRoot":"","sources":["../../../src/Interfaces/HlsStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAKD,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM1F,MAAM,WAAW,YAAY;IAI3B,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,EAAE,MAAM,CAAC;IAEhB,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAMD,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,EAAE,MAAM,CAAC;IAEtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB"}
1
+ {"version":3,"file":"HlsStreamer.d.ts","sourceRoot":"","sources":["../../../src/Interfaces/HlsStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAKD,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGxG,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKxG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAKD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB"}
@@ -1,5 +1,5 @@
1
- import { Mp3FileInfo, AudioFileInfo } from '../Interfaces/HlsStreamer';
2
- import { AudioFormat } from '../Parsers/IAudioParser';
1
+ import { Mp3FileInfo, MediaFileInfo } from '../Interfaces/HlsStreamer';
2
+ import { MediaFormat } from '../Parsers/IMediaParser';
3
3
  export declare class FileLib {
4
4
  private static readonly BITRATE_INDEX;
5
5
  private static readonly SAMPLE_RATE_INDEX;
@@ -9,12 +9,18 @@ export declare class FileLib {
9
9
  fileSize?: number;
10
10
  }): Mp3FileInfo;
11
11
  static analyzeMP3File(filePath: string): Promise<Mp3FileInfo>;
12
- static analyzeAudioFile(filePath: string, format?: AudioFormat): Promise<AudioFileInfo>;
12
+ static analyzeMediaFile(filePath: string, format?: MediaFormat): Promise<MediaFileInfo>;
13
+ static analyzeAudioFile(filePath: string, format?: MediaFormat): Promise<MediaFileInfo>;
14
+ static analyzeMediaBuffer(buffer: Buffer, opts?: {
15
+ fileSize?: number;
16
+ filePath?: string;
17
+ format?: MediaFormat;
18
+ }): MediaFileInfo;
13
19
  static analyzeAudioBuffer(buffer: Buffer, opts?: {
14
20
  fileSize?: number;
15
21
  filePath?: string;
16
- format?: AudioFormat;
17
- }): AudioFileInfo;
22
+ format?: MediaFormat;
23
+ }): MediaFileInfo;
18
24
  private static calculateFrameLength;
19
25
  private static getId3Offsets;
20
26
  private static syncSafeInteger;
@@ -1 +1 @@
1
- {"version":3,"file":"FileLib.d.ts","sourceRoot":"","sources":["../../../src/Libs/FileLib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqBtD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAgBnC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAIvC;IAKF,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;WAWpC,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,WAAW;WA8HzE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;WAetD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAwB7F,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACxE,aAAa;IA6BhB,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC,OAAO,CAAC,MAAM,CAAC,aAAa;IA8B5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqC/B,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAWlC"}
1
+ {"version":3,"file":"FileLib.d.ts","sourceRoot":"","sources":["../../../src/Libs/FileLib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqBtD,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAgBnC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAIvC;IAKF,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;WAWpC,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,WAAW;WA8HzE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;WAetD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;WAmBhF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAU7F,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACxE,aAAa;IA8BhB,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACxE,aAAa;IAIhB,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC,OAAO,CAAC,MAAM,CAAC,aAAa;IA8B5B,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqC/B,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAWlC"}
@@ -122,7 +122,7 @@ class FileLib {
122
122
  ]);
123
123
  return this.analyzeMP3Buffer(buffer, { fileSize: stat.size });
124
124
  }
125
- static async analyzeAudioFile(filePath, format) {
125
+ static async analyzeMediaFile(filePath, format) {
126
126
  const [buffer, stat] = await Promise.all([
127
127
  node_fs_1.default.promises.readFile(filePath),
128
128
  node_fs_1.default.promises.stat(filePath)
@@ -134,9 +134,12 @@ class FileLib {
134
134
  if (format !== undefined) {
135
135
  opts.format = format;
136
136
  }
137
- return this.analyzeAudioBuffer(buffer, opts);
137
+ return this.analyzeMediaBuffer(buffer, opts);
138
138
  }
139
- static analyzeAudioBuffer(buffer, opts = {}) {
139
+ static async analyzeAudioFile(filePath, format) {
140
+ return this.analyzeMediaFile(filePath, format);
141
+ }
142
+ static analyzeMediaBuffer(buffer, opts = {}) {
140
143
  let parser;
141
144
  if (opts.format) {
142
145
  parser = ParserFactory_1.ParserFactory.getParser(opts.format);
@@ -156,6 +159,9 @@ class FileLib {
156
159
  const analyzeOpts = opts.fileSize !== undefined ? { fileSize: opts.fileSize } : {};
157
160
  return parser.analyze(buffer, analyzeOpts);
158
161
  }
162
+ static analyzeAudioBuffer(buffer, opts = {}) {
163
+ return this.analyzeMediaBuffer(buffer, opts);
164
+ }
159
165
  static calculateFrameLength(frame) {
160
166
  if (frame.layer === 1) {
161
167
  return Math.floor(((12 * frame.bitrate * 1000) / frame.sampleRate + frame.padding) * 4);