hls-streamer 2.1.0 → 2.2.0
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.
- package/README.md +136 -197
- package/dist/Interfaces/HlsStreamer.d.ts +17 -0
- package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
- package/dist/Libs/FileLib.d.ts +15 -1
- package/dist/Libs/FileLib.d.ts.map +1 -1
- package/dist/Libs/FileLib.js +238 -108
- package/dist/Libs/FileLib.js.map +1 -1
- package/dist/cjs/Interfaces/HlsStreamer.d.ts +17 -0
- package/dist/cjs/Interfaces/HlsStreamer.d.ts.map +1 -1
- package/dist/cjs/Libs/FileLib.d.ts +15 -1
- package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
- package/dist/cjs/Libs/FileLib.js +241 -108
- package/dist/cjs/Libs/FileLib.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -7
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +133 -133
- package/dist/cjs/index.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +133 -133
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/Libs/FileLib.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.FileLib = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
4
8
|
class FileLib {
|
|
5
9
|
static getFileSizeInBytes(buffer) {
|
|
6
10
|
if (Buffer.isBuffer(buffer)) {
|
|
@@ -10,123 +14,252 @@ class FileLib {
|
|
|
10
14
|
throw new Error("Input is not a buffer");
|
|
11
15
|
}
|
|
12
16
|
}
|
|
13
|
-
static getMP3DurationFromBuffer(mp3Buffer) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const duration = this.parseMP3Duration(mp3Buffer);
|
|
17
|
-
resolve(duration);
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
reject(error);
|
|
21
|
-
}
|
|
22
|
-
});
|
|
17
|
+
static async getMP3DurationFromBuffer(mp3Buffer) {
|
|
18
|
+
const { duration } = this.analyzeMP3Buffer(mp3Buffer);
|
|
19
|
+
return duration;
|
|
23
20
|
}
|
|
24
|
-
static
|
|
21
|
+
static analyzeMP3Buffer(buffer, opts = {}) {
|
|
22
|
+
const warnings = [];
|
|
23
|
+
const size = opts.fileSize ?? buffer.length;
|
|
25
24
|
if (buffer.length === 0) {
|
|
26
|
-
return
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
let totalFrames = 0;
|
|
52
|
-
let sampleRate = 0;
|
|
53
|
-
let samplesPerFrame = 0;
|
|
54
|
-
if (buffer.length > 10 && buffer.toString('ascii', 0, 3) === 'ID3') {
|
|
55
|
-
const tagSize = ((buffer[6] & 0x7f) << 21) |
|
|
56
|
-
((buffer[7] & 0x7f) << 14) |
|
|
57
|
-
((buffer[8] & 0x7f) << 7) |
|
|
58
|
-
(buffer[9] & 0x7f);
|
|
59
|
-
offset = 10 + tagSize;
|
|
60
|
-
}
|
|
61
|
-
while (offset < buffer.length - 3) {
|
|
62
|
-
if ((buffer[offset] === 0xFF) && ((buffer[offset + 1] & 0xE0) === 0xE0)) {
|
|
63
|
-
if (offset + 3 >= buffer.length)
|
|
64
|
-
break;
|
|
65
|
-
const header = (buffer[offset] << 24) |
|
|
66
|
-
(buffer[offset + 1] << 16) |
|
|
67
|
-
(buffer[offset + 2] << 8) |
|
|
68
|
-
buffer[offset + 3];
|
|
69
|
-
const version = (header >> 19) & 0x3;
|
|
70
|
-
const layer = (header >> 17) & 0x3;
|
|
71
|
-
const bitrateIndex = (header >> 12) & 0xF;
|
|
72
|
-
const sampleRateIndex = (header >> 10) & 0x3;
|
|
73
|
-
const padding = (header >> 9) & 0x1;
|
|
74
|
-
if (version === 1 || layer === 0 || bitrateIndex === 0 || bitrateIndex === 15 || sampleRateIndex === 3) {
|
|
75
|
-
offset++;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
const versionIndex = version === 3 ? 0 : (version === 2 ? 1 : 2);
|
|
79
|
-
const layerIndex = layer === 3 ? 0 : (layer === 2 ? 1 : 2);
|
|
80
|
-
const bitrate = bitrates[bitrateIndex]?.[versionIndex === 0 ? layerIndex : (layerIndex === 0 ? 3 : 4)];
|
|
81
|
-
const foundSampleRate = sampleRates[sampleRateIndex]?.[versionIndex];
|
|
82
|
-
if (!bitrate || !foundSampleRate) {
|
|
83
|
-
offset++;
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
if (totalFrames === 0) {
|
|
87
|
-
sampleRate = foundSampleRate;
|
|
88
|
-
if (layer === 3) {
|
|
89
|
-
samplesPerFrame = 384;
|
|
90
|
-
}
|
|
91
|
-
else if (layer === 2) {
|
|
92
|
-
samplesPerFrame = 1152;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
samplesPerFrame = version === 3 ? 1152 : 576;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
let frameLength;
|
|
99
|
-
if (layer === 3) {
|
|
100
|
-
frameLength = Math.floor((12 * bitrate * 1000 / foundSampleRate + padding) * 4);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
frameLength = Math.floor(144 * bitrate * 1000 / foundSampleRate + padding);
|
|
104
|
-
}
|
|
105
|
-
if (frameLength <= 0) {
|
|
106
|
-
offset++;
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
totalFrames++;
|
|
110
|
-
if (offset + frameLength > buffer.length) {
|
|
111
|
-
const remainingBytes = buffer.length - offset;
|
|
112
|
-
const avgFrameLength = offset > 0 ? offset / totalFrames : frameLength;
|
|
113
|
-
const estimatedRemainingFrames = Math.floor(remainingBytes / avgFrameLength);
|
|
114
|
-
totalFrames += estimatedRemainingFrames;
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
offset += frameLength;
|
|
25
|
+
return {
|
|
26
|
+
size,
|
|
27
|
+
duration: 0,
|
|
28
|
+
audioDataSize: 0,
|
|
29
|
+
frames: []
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const offsets = this.getId3Offsets(buffer);
|
|
33
|
+
const frames = [];
|
|
34
|
+
const payloadSize = Math.max(0, offsets.audioEnd - offsets.startOffset);
|
|
35
|
+
let offset = offsets.startOffset;
|
|
36
|
+
let frameIndex = 0;
|
|
37
|
+
let sampleRate;
|
|
38
|
+
let totalDuration = 0;
|
|
39
|
+
let totalAudioBytes = 0;
|
|
40
|
+
while (offset + 4 <= offsets.audioEnd) {
|
|
41
|
+
if (!this.isFrameSync(buffer, offset)) {
|
|
42
|
+
offset++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const header = buffer.readUInt32BE(offset);
|
|
46
|
+
const parsed = this.parseFrameHeader(header);
|
|
47
|
+
if (!parsed) {
|
|
48
|
+
offset++;
|
|
49
|
+
continue;
|
|
118
50
|
}
|
|
119
|
-
|
|
51
|
+
const frameLength = this.calculateFrameLength(parsed);
|
|
52
|
+
if (frameLength <= 0) {
|
|
53
|
+
warnings.push(`Encountered zero-length frame at offset ${offset}`);
|
|
120
54
|
offset++;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (offset + frameLength > buffer.length) {
|
|
58
|
+
warnings.push(`Truncated frame at offset ${offset}`);
|
|
59
|
+
break;
|
|
121
60
|
}
|
|
61
|
+
sampleRate = sampleRate ?? parsed.sampleRate;
|
|
62
|
+
const frameDuration = parsed.samplesPerFrame / parsed.sampleRate;
|
|
63
|
+
frames.push({
|
|
64
|
+
index: frameIndex,
|
|
65
|
+
offset,
|
|
66
|
+
length: frameLength,
|
|
67
|
+
duration: frameDuration,
|
|
68
|
+
samples: parsed.samplesPerFrame,
|
|
69
|
+
sampleRate: parsed.sampleRate,
|
|
70
|
+
bitrate: parsed.bitrate,
|
|
71
|
+
padding: parsed.padding
|
|
72
|
+
});
|
|
73
|
+
frameIndex++;
|
|
74
|
+
totalDuration += frameDuration;
|
|
75
|
+
totalAudioBytes += frameLength;
|
|
76
|
+
offset += frameLength;
|
|
122
77
|
}
|
|
123
|
-
if (
|
|
78
|
+
if (frames.length === 0) {
|
|
124
79
|
const estimatedDuration = buffer.length / 16000;
|
|
125
|
-
|
|
80
|
+
warnings.push('Falling back to heuristic duration due to missing MP3 frames');
|
|
81
|
+
const metadata = {
|
|
82
|
+
size,
|
|
83
|
+
duration: Math.max(0.001, estimatedDuration),
|
|
84
|
+
audioDataSize: payloadSize,
|
|
85
|
+
frames: []
|
|
86
|
+
};
|
|
87
|
+
if (warnings.length) {
|
|
88
|
+
metadata.warnings = warnings;
|
|
89
|
+
}
|
|
90
|
+
return metadata;
|
|
91
|
+
}
|
|
92
|
+
const duration = totalDuration;
|
|
93
|
+
const averageBitrate = duration > 0 ? (totalAudioBytes * 8) / duration / 1000 : undefined;
|
|
94
|
+
const metadata = {
|
|
95
|
+
size,
|
|
96
|
+
duration,
|
|
97
|
+
audioDataSize: totalAudioBytes || payloadSize,
|
|
98
|
+
frames
|
|
99
|
+
};
|
|
100
|
+
if (sampleRate !== undefined) {
|
|
101
|
+
metadata.sampleRate = sampleRate;
|
|
102
|
+
}
|
|
103
|
+
if (averageBitrate !== undefined) {
|
|
104
|
+
metadata.averageBitrate = averageBitrate;
|
|
126
105
|
}
|
|
127
|
-
|
|
128
|
-
|
|
106
|
+
if (offsets.id3v2Size > 0) {
|
|
107
|
+
metadata.id3v2Size = offsets.id3v2Size;
|
|
108
|
+
}
|
|
109
|
+
if (offsets.id3v1Size > 0) {
|
|
110
|
+
metadata.id3v1Size = offsets.id3v1Size;
|
|
111
|
+
}
|
|
112
|
+
if (warnings.length) {
|
|
113
|
+
metadata.warnings = warnings;
|
|
114
|
+
}
|
|
115
|
+
return metadata;
|
|
116
|
+
}
|
|
117
|
+
static async analyzeMP3File(filePath) {
|
|
118
|
+
const [buffer, stat] = await Promise.all([
|
|
119
|
+
node_fs_1.default.promises.readFile(filePath),
|
|
120
|
+
node_fs_1.default.promises.stat(filePath)
|
|
121
|
+
]);
|
|
122
|
+
return this.analyzeMP3Buffer(buffer, { fileSize: stat.size });
|
|
123
|
+
}
|
|
124
|
+
static calculateFrameLength(frame) {
|
|
125
|
+
if (frame.layer === 1) {
|
|
126
|
+
return Math.floor(((12 * frame.bitrate * 1000) / frame.sampleRate + frame.padding) * 4);
|
|
127
|
+
}
|
|
128
|
+
const multiplier = frame.layer === 3 && frame.version !== 1 ? 72 : 144;
|
|
129
|
+
return Math.floor((multiplier * frame.bitrate * 1000) / frame.sampleRate + frame.padding);
|
|
130
|
+
}
|
|
131
|
+
static getId3Offsets(buffer) {
|
|
132
|
+
let startOffset = 0;
|
|
133
|
+
let id3v2Size = 0;
|
|
134
|
+
if (buffer.length >= 10 && buffer.toString('ascii', 0, 3) === 'ID3') {
|
|
135
|
+
const sizeBytes = buffer.subarray(6, 10);
|
|
136
|
+
id3v2Size = this.syncSafeInteger(sizeBytes);
|
|
137
|
+
startOffset = Math.min(buffer.length, 10 + id3v2Size);
|
|
138
|
+
}
|
|
139
|
+
let id3v1Size = 0;
|
|
140
|
+
let audioEnd = buffer.length;
|
|
141
|
+
if (buffer.length >= 128) {
|
|
142
|
+
const tagOffset = buffer.length - 128;
|
|
143
|
+
if (buffer.toString('ascii', tagOffset, tagOffset + 3) === 'TAG') {
|
|
144
|
+
id3v1Size = 128;
|
|
145
|
+
audioEnd = tagOffset;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
startOffset,
|
|
150
|
+
id3v2Size,
|
|
151
|
+
audioEnd,
|
|
152
|
+
id3v1Size
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
static syncSafeInteger(bytes) {
|
|
156
|
+
return ((bytes[0] & 0x7f) << 21) |
|
|
157
|
+
((bytes[1] & 0x7f) << 14) |
|
|
158
|
+
((bytes[2] & 0x7f) << 7) |
|
|
159
|
+
(bytes[3] & 0x7f);
|
|
160
|
+
}
|
|
161
|
+
static isFrameSync(buffer, offset) {
|
|
162
|
+
const byte1 = buffer[offset];
|
|
163
|
+
const byte2 = buffer[offset + 1];
|
|
164
|
+
if (byte1 === undefined || byte2 === undefined) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
return byte1 === 0xff && (byte2 & 0xe0) === 0xe0;
|
|
168
|
+
}
|
|
169
|
+
static parseFrameHeader(header) {
|
|
170
|
+
const versionBits = (header >> 19) & 0x3;
|
|
171
|
+
const layerBits = (header >> 17) & 0x3;
|
|
172
|
+
const bitrateIndex = (header >> 12) & 0xf;
|
|
173
|
+
const sampleRateIndex = (header >> 10) & 0x3;
|
|
174
|
+
const padding = ((header >> 9) & 0x1);
|
|
175
|
+
const version = this.decodeVersion(versionBits);
|
|
176
|
+
const layer = this.decodeLayer(layerBits);
|
|
177
|
+
if (!version || !layer) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
if (bitrateIndex === 0 || bitrateIndex === 15 || sampleRateIndex === 3) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
const bitrate = this.BITRATE_INDEX[version][layer][bitrateIndex];
|
|
184
|
+
const sampleRate = this.SAMPLE_RATE_INDEX[version][sampleRateIndex];
|
|
185
|
+
if (!bitrate || !sampleRate) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
const samplesPerFrame = this.getSamplesPerFrame(version, layer);
|
|
189
|
+
return {
|
|
190
|
+
version,
|
|
191
|
+
layer,
|
|
192
|
+
bitrate,
|
|
193
|
+
sampleRate,
|
|
194
|
+
padding,
|
|
195
|
+
samplesPerFrame
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
static decodeVersion(bits) {
|
|
199
|
+
switch (bits) {
|
|
200
|
+
case 0b11:
|
|
201
|
+
return 1;
|
|
202
|
+
case 0b10:
|
|
203
|
+
return 2;
|
|
204
|
+
case 0b00:
|
|
205
|
+
return 25;
|
|
206
|
+
default:
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
static decodeLayer(bits) {
|
|
211
|
+
switch (bits) {
|
|
212
|
+
case 0b11:
|
|
213
|
+
return 1;
|
|
214
|
+
case 0b10:
|
|
215
|
+
return 2;
|
|
216
|
+
case 0b01:
|
|
217
|
+
return 3;
|
|
218
|
+
default:
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
static getSamplesPerFrame(version, layer) {
|
|
223
|
+
if (layer === 1) {
|
|
224
|
+
return 384;
|
|
225
|
+
}
|
|
226
|
+
if (layer === 2) {
|
|
227
|
+
return 1152;
|
|
228
|
+
}
|
|
229
|
+
return version === 1 ? 1152 : 576;
|
|
129
230
|
}
|
|
130
231
|
}
|
|
131
232
|
exports.FileLib = FileLib;
|
|
233
|
+
Object.defineProperty(FileLib, "BITRATE_INDEX", {
|
|
234
|
+
enumerable: true,
|
|
235
|
+
configurable: true,
|
|
236
|
+
writable: true,
|
|
237
|
+
value: {
|
|
238
|
+
1: {
|
|
239
|
+
1: [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],
|
|
240
|
+
2: [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384],
|
|
241
|
+
3: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
|
|
242
|
+
},
|
|
243
|
+
2: {
|
|
244
|
+
1: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
|
|
245
|
+
2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
|
|
246
|
+
3: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
|
|
247
|
+
},
|
|
248
|
+
25: {
|
|
249
|
+
1: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
|
|
250
|
+
2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
|
|
251
|
+
3: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
Object.defineProperty(FileLib, "SAMPLE_RATE_INDEX", {
|
|
256
|
+
enumerable: true,
|
|
257
|
+
configurable: true,
|
|
258
|
+
writable: true,
|
|
259
|
+
value: {
|
|
260
|
+
1: [44100, 48000, 32000],
|
|
261
|
+
2: [22050, 24000, 16000],
|
|
262
|
+
25: [11025, 12000, 8000]
|
|
263
|
+
}
|
|
264
|
+
});
|
|
132
265
|
//# sourceMappingURL=FileLib.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLib.js","sourceRoot":"","sources":["../../../src/Libs/FileLib.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileLib.js","sourceRoot":"","sources":["../../../src/Libs/FileLib.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyB;AAsBzB,MAAa,OAAO;IA4BlB,MAAM,CAAC,kBAAkB,CAAC,MAAc;QACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAKD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,SAAiB;QACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKD,MAAM,CAAC,gBAAgB,CAAC,MAAc,EAAE,OAA8B,EAAE;QACtE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC;QAE5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,CAAC;gBACX,aAAa,EAAE,CAAC;gBAChB,MAAM,EAAE,EAAE;aACX,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAExE,IAAI,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QACjC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAA8B,CAAC;QACnC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,OAAO,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAEtD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;gBACnE,MAAM,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YAGD,IAAI,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;gBACrD,MAAM;YACR,CAAC;YAED,UAAU,GAAG,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;YAE7C,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;YAEjE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,UAAU;gBACjB,MAAM;gBACN,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,MAAM,CAAC,eAAe;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YAEH,UAAU,EAAE,CAAC;YACb,aAAa,IAAI,aAAa,CAAC;YAC/B,eAAe,IAAI,WAAW,CAAC;YAC/B,MAAM,IAAI,WAAW,CAAC;QACxB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC9E,MAAM,QAAQ,GAAgB;gBAC5B,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC;gBAC5C,aAAa,EAAE,WAAW;gBAC1B,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/B,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC/B,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1F,MAAM,QAAQ,GAAgB;YAC5B,IAAI;YACJ,QAAQ;YACR,aAAa,EAAE,eAAe,IAAI,WAAW;YAC7C,MAAM;SACP,CAAC;QAEF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACnC,CAAC;QAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACzC,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACzC,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC1C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvC,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC9B,iBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,KAAwB;QAC1D,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5F,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,MAAc;QACzC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACpE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC5C,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC;QACxD,CAAC;QAGD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7B,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;YACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACjE,SAAS,GAAG,GAAG,CAAC;gBAChB,QAAQ,GAAG,SAAS,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO;YACL,WAAW;YACX,SAAS;YACT,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,KAAa;QAC1C,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,MAAc,EAAE,MAAc;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACnD,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,MAAc;QAC5C,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QACzC,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QACvC,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAC1C,MAAM,eAAe,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAU,CAAC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,KAAK,EAAE,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC;QAEpE,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEhE,OAAO;YACL,OAAO;YACP,KAAK;YACL,OAAO;YACP,UAAU;YACV,OAAO;YACP,eAAe;SAChB,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,IAAY;QACvC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,IAAY;QACrC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,OAAmB,EAAE,KAAgB;QACrE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,CAAC;;AAvTH,0BAwTC;AAvTyB;;;;WAAiE;QACvF,CAAC,EAAE;YACD,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACzE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACtE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACtE;QACD,CAAC,EAAE;YACD,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACtE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACjE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAClE;QACD,EAAE,EAAE;YACF,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACtE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACjE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAClE;KACF;GAAC;AAEsB;;;;WAAkD;QACxE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACxB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACxB,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;KACzB;GAAC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -6,22 +6,20 @@ export declare class HlsStreamer {
|
|
|
6
6
|
private readonly baseUrl;
|
|
7
7
|
private readonly enableFastStart;
|
|
8
8
|
private fileInfo?;
|
|
9
|
-
private
|
|
10
|
-
private frameAlignedSegments;
|
|
9
|
+
private segments;
|
|
11
10
|
constructor(options: HlsStreamerOptions);
|
|
12
11
|
private validateOptions;
|
|
13
12
|
private validateFile;
|
|
14
13
|
private getFileInfo;
|
|
15
14
|
getFileBuffer(startByte: number, endByte: number): Promise<Buffer>;
|
|
16
15
|
createM3U8(): Promise<string>;
|
|
17
|
-
private
|
|
16
|
+
private getSegments;
|
|
17
|
+
private computeTargetSizes;
|
|
18
|
+
private computeTargetSizesFromBytes;
|
|
19
|
+
private buildSegmentsWithoutFrameTable;
|
|
18
20
|
private estimateSegmentDuration;
|
|
19
21
|
private buildSegmentUrl;
|
|
20
22
|
private calculateSegmentSize;
|
|
21
|
-
private calculateSegment;
|
|
22
|
-
private getFrameAlignedSegment;
|
|
23
|
-
private findNextMp3Frame;
|
|
24
|
-
private calculatefirst2SegmentSize;
|
|
25
23
|
private padNumber;
|
|
26
24
|
getSegmentDuration(segmentIndex: number): Promise<number>;
|
|
27
25
|
}
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,0BAA0B,CAAC;AAYxF,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;IAC/B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,0BAA0B,CAAC;AAYxF,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;IAC/B,OAAO,CAAC,QAAQ,CAA4B;gBAKhC,OAAO,EAAE,kBAAkB;IAWvC,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;YAgBN,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;IAO/B,OAAO,CAAC,eAAe;IAKvB,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"}
|