hls-streamer 2.0.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 -178
- package/dist/Interfaces/HlsStreamer.d.ts +17 -0
- package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
- package/dist/Libs/FileLib.d.ts +15 -0
- package/dist/Libs/FileLib.d.ts.map +1 -1
- package/dist/Libs/FileLib.js +245 -11
- 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 -0
- package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
- package/dist/cjs/Libs/FileLib.js +245 -11
- package/dist/cjs/Libs/FileLib.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +134 -61
- package/dist/cjs/index.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +134 -61
- package/dist/index.js.map +1 -1
- package/package.json +2 -4
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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -60,11 +60,11 @@ class HlsStreamer {
|
|
|
60
60
|
writable: true,
|
|
61
61
|
value: void 0
|
|
62
62
|
});
|
|
63
|
-
Object.defineProperty(this, "
|
|
63
|
+
Object.defineProperty(this, "segments", {
|
|
64
64
|
enumerable: true,
|
|
65
65
|
configurable: true,
|
|
66
66
|
writable: true,
|
|
67
|
-
value:
|
|
67
|
+
value: void 0
|
|
68
68
|
});
|
|
69
69
|
this.validateOptions(options);
|
|
70
70
|
this.validateFile(options.filePath);
|
|
@@ -101,18 +101,12 @@ class HlsStreamer {
|
|
|
101
101
|
}
|
|
102
102
|
async getFileInfo() {
|
|
103
103
|
if (!this.fileInfo) {
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
if (size <= 0) {
|
|
104
|
+
const analysis = await FileLib_1.FileLib.analyzeMP3File(this.filePath);
|
|
105
|
+
if (analysis.size <= 0) {
|
|
107
106
|
throw new HlsStreamerErrors_1.InvalidFileError('File is empty');
|
|
108
107
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
this.fileInfo = {
|
|
113
|
-
size,
|
|
114
|
-
duration: 0
|
|
115
|
-
};
|
|
108
|
+
this.fileInfo = analysis;
|
|
109
|
+
this.segments = undefined;
|
|
116
110
|
}
|
|
117
111
|
return this.fileInfo;
|
|
118
112
|
}
|
|
@@ -124,11 +118,14 @@ class HlsStreamer {
|
|
|
124
118
|
if (endByte > fileInfo.size) {
|
|
125
119
|
throw new HlsStreamerErrors_1.InvalidRangeError(startByte, endByte);
|
|
126
120
|
}
|
|
127
|
-
const
|
|
121
|
+
const length = endByte - startByte;
|
|
128
122
|
const fd = node_fs_1.default.openSync(this.filePath, "r");
|
|
129
123
|
try {
|
|
130
|
-
|
|
131
|
-
|
|
124
|
+
if (length === 0) {
|
|
125
|
+
return Buffer.alloc(0);
|
|
126
|
+
}
|
|
127
|
+
const buffer = Buffer.alloc(length);
|
|
128
|
+
const bytesRead = node_fs_1.default.readSync(fd, buffer, 0, length, startByte);
|
|
132
129
|
return buffer.subarray(0, bytesRead);
|
|
133
130
|
}
|
|
134
131
|
finally {
|
|
@@ -136,32 +133,131 @@ class HlsStreamer {
|
|
|
136
133
|
}
|
|
137
134
|
}
|
|
138
135
|
async createM3U8() {
|
|
139
|
-
const fileInfo = await
|
|
140
|
-
|
|
136
|
+
const [fileInfo, segments] = await Promise.all([
|
|
137
|
+
this.getFileInfo(),
|
|
138
|
+
this.getSegments()
|
|
139
|
+
]);
|
|
140
|
+
if (!segments.length) {
|
|
141
|
+
throw new HlsStreamerErrors_1.InvalidFileError('Unable to generate segments for MP3 file');
|
|
142
|
+
}
|
|
143
|
+
const maxSegmentDuration = segments.reduce((max, segment) => Math.max(max, segment.duration), 0);
|
|
144
|
+
const targetDurationSeconds = Math.max(1, Math.ceil(maxSegmentDuration || fileInfo.duration || 1));
|
|
141
145
|
const m3u8 = [
|
|
142
146
|
'#EXTM3U',
|
|
143
147
|
'#EXT-X-VERSION:6',
|
|
144
148
|
'#EXT-X-PLAYLIST-TYPE:VOD',
|
|
145
|
-
|
|
149
|
+
`#EXT-X-TARGETDURATION:${targetDurationSeconds}`,
|
|
146
150
|
'#EXT-X-MEDIA-SEQUENCE:0',
|
|
147
151
|
];
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
const segmentUrl = this.buildSegmentUrl(start, end, i);
|
|
152
|
-
m3u8.push(`#EXTINF:${estimatedDuration.toFixed(3)}`);
|
|
152
|
+
segments.forEach((segment, index) => {
|
|
153
|
+
const segmentUrl = this.buildSegmentUrl(segment.start, segment.end, index);
|
|
154
|
+
m3u8.push(`#EXTINF:${segment.duration.toFixed(3)}`);
|
|
153
155
|
m3u8.push(segmentUrl);
|
|
154
|
-
}
|
|
156
|
+
});
|
|
155
157
|
m3u8.push('#EXT-X-ENDLIST');
|
|
156
158
|
return m3u8.join('\n');
|
|
157
159
|
}
|
|
158
|
-
|
|
159
|
-
if (
|
|
160
|
-
return
|
|
160
|
+
async getSegments() {
|
|
161
|
+
if (this.segments) {
|
|
162
|
+
return this.segments;
|
|
163
|
+
}
|
|
164
|
+
const fileInfo = await this.getFileInfo();
|
|
165
|
+
if (!fileInfo.frames.length) {
|
|
166
|
+
this.segments = this.buildSegmentsWithoutFrameTable(fileInfo);
|
|
167
|
+
return this.segments;
|
|
161
168
|
}
|
|
162
|
-
const
|
|
163
|
-
const
|
|
164
|
-
|
|
169
|
+
const targetSizes = this.computeTargetSizes(fileInfo);
|
|
170
|
+
const segments = [];
|
|
171
|
+
const frames = fileInfo.frames;
|
|
172
|
+
let frameCursor = 0;
|
|
173
|
+
const consumeFrames = (targetBytes) => {
|
|
174
|
+
if (frameCursor >= frames.length) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const startFrameIndex = frameCursor;
|
|
178
|
+
let consumedBytes = 0;
|
|
179
|
+
let duration = 0;
|
|
180
|
+
while (frameCursor < frames.length) {
|
|
181
|
+
const frame = frames[frameCursor];
|
|
182
|
+
const nextBytes = consumedBytes + frame.length;
|
|
183
|
+
if (consumedBytes > 0 && nextBytes > targetBytes) {
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
consumedBytes = nextBytes;
|
|
187
|
+
duration += frame.duration;
|
|
188
|
+
frameCursor++;
|
|
189
|
+
if (consumedBytes >= targetBytes) {
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (frameCursor === startFrameIndex && frameCursor < frames.length) {
|
|
194
|
+
const frame = frames[frameCursor];
|
|
195
|
+
consumedBytes += frame.length;
|
|
196
|
+
duration += frame.duration;
|
|
197
|
+
frameCursor++;
|
|
198
|
+
}
|
|
199
|
+
if (frameCursor === startFrameIndex) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const start = frames[startFrameIndex].offset;
|
|
203
|
+
const lastFrame = frames[frameCursor - 1];
|
|
204
|
+
const end = lastFrame.offset + lastFrame.length;
|
|
205
|
+
segments.push({
|
|
206
|
+
start,
|
|
207
|
+
end,
|
|
208
|
+
duration
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
targetSizes.forEach(consumeFrames);
|
|
212
|
+
while (frameCursor < frames.length) {
|
|
213
|
+
consumeFrames(this.segmentSize);
|
|
214
|
+
}
|
|
215
|
+
if (!segments.length) {
|
|
216
|
+
this.segments = this.buildSegmentsWithoutFrameTable(fileInfo);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.segments = segments;
|
|
220
|
+
}
|
|
221
|
+
return this.segments;
|
|
222
|
+
}
|
|
223
|
+
computeTargetSizes(fileInfo) {
|
|
224
|
+
const totalBytes = fileInfo.audioDataSize || fileInfo.size;
|
|
225
|
+
return this.computeTargetSizesFromBytes(totalBytes);
|
|
226
|
+
}
|
|
227
|
+
computeTargetSizesFromBytes(totalBytes) {
|
|
228
|
+
if (totalBytes <= 0) {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
const targets = [];
|
|
232
|
+
let remaining = totalBytes;
|
|
233
|
+
let index = 0;
|
|
234
|
+
while (remaining > 0) {
|
|
235
|
+
const targetSize = Math.min(this.calculateSegmentSize(index), remaining);
|
|
236
|
+
targets.push(targetSize);
|
|
237
|
+
remaining -= targetSize;
|
|
238
|
+
index++;
|
|
239
|
+
}
|
|
240
|
+
return targets.length ? targets : [totalBytes];
|
|
241
|
+
}
|
|
242
|
+
buildSegmentsWithoutFrameTable(fileInfo) {
|
|
243
|
+
const segments = [];
|
|
244
|
+
const totalBytes = Math.max(fileInfo.size, fileInfo.audioDataSize);
|
|
245
|
+
if (totalBytes <= 0) {
|
|
246
|
+
return segments;
|
|
247
|
+
}
|
|
248
|
+
const targets = this.computeTargetSizesFromBytes(totalBytes);
|
|
249
|
+
let start = 0;
|
|
250
|
+
targets.forEach((targetSize) => {
|
|
251
|
+
const end = Math.min(totalBytes, start + targetSize);
|
|
252
|
+
const duration = this.estimateSegmentDuration(end - start);
|
|
253
|
+
segments.push({ start, end, duration });
|
|
254
|
+
start = end;
|
|
255
|
+
});
|
|
256
|
+
if (start < totalBytes) {
|
|
257
|
+
const duration = this.estimateSegmentDuration(totalBytes - start);
|
|
258
|
+
segments.push({ start, end: totalBytes, duration });
|
|
259
|
+
}
|
|
260
|
+
return segments;
|
|
165
261
|
}
|
|
166
262
|
estimateSegmentDuration(segmentSize) {
|
|
167
263
|
const estimatedBytesPerSecond = 16000;
|
|
@@ -184,42 +280,19 @@ class HlsStreamer {
|
|
|
184
280
|
return this.segmentSize;
|
|
185
281
|
}
|
|
186
282
|
}
|
|
187
|
-
calculateSegment(segmentIndex, fileSize) {
|
|
188
|
-
let start = 0;
|
|
189
|
-
if (this.enableFastStart && segmentIndex < 2) {
|
|
190
|
-
start = segmentIndex * (this.segmentSize / 4);
|
|
191
|
-
}
|
|
192
|
-
else if (this.enableFastStart) {
|
|
193
|
-
start = (3 * this.segmentSize) / 4 + (segmentIndex - 2) * this.segmentSize;
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
start = segmentIndex * this.segmentSize;
|
|
197
|
-
}
|
|
198
|
-
const segmentSize = this.calculateSegmentSize(segmentIndex);
|
|
199
|
-
const end = Math.min(start + segmentSize, fileSize);
|
|
200
|
-
return { start: Math.floor(start), end: Math.floor(end) };
|
|
201
|
-
}
|
|
202
|
-
calculatefirst2SegmentSize() {
|
|
203
|
-
return (this.segmentSize / 4) * 3;
|
|
204
|
-
}
|
|
205
283
|
padNumber(value, padding) {
|
|
206
284
|
return value.toString().padStart(padding, '0');
|
|
207
285
|
}
|
|
208
286
|
async getSegmentDuration(segmentIndex) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return cachedSegment.duration;
|
|
287
|
+
if (!Number.isInteger(segmentIndex) || segmentIndex < 0) {
|
|
288
|
+
throw new HlsStreamerErrors_1.InvalidParameterError('segmentIndex', segmentIndex);
|
|
212
289
|
}
|
|
213
|
-
const
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
end,
|
|
220
|
-
duration
|
|
221
|
-
});
|
|
222
|
-
return duration;
|
|
290
|
+
const segments = await this.getSegments();
|
|
291
|
+
const segment = segments[segmentIndex];
|
|
292
|
+
if (!segment) {
|
|
293
|
+
throw new HlsStreamerErrors_1.InvalidParameterError('segmentIndex', segmentIndex);
|
|
294
|
+
}
|
|
295
|
+
return segment.duration;
|
|
223
296
|
}
|
|
224
297
|
}
|
|
225
298
|
exports.HlsStreamer = HlsStreamer;
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAE7B,4CAAyC;AACzC,kEAKoC;AAKpC,MAAa,WAAW;IAYtB,YAAY,OAA2B;QAXtB;;;;;WAAiB;QACjB;;;;;WAAoB;QACpB;;;;;WAAiB;QACjB;;;;;WAAgB;QAChB;;;;;WAAyB;QAClC;;;;;WAAuB;QACvB
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAE7B,4CAAyC;AACzC,kEAKoC;AAKpC,MAAa,WAAW;IAYtB,YAAY,OAA2B;QAXtB;;;;;WAAiB;QACjB;;;;;WAAoB;QACpB;;;;;WAAiB;QACjB;;;;;WAAgB;QAChB;;;;;WAAyB;QAClC;;;;;WAAuB;QACvB;;;;;WAAoC;QAM1C,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;IAC1D,CAAC;IAEO,eAAe,CAAC,OAA2B;QACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,yCAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;YACnC,CAAC,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,yCAAqB,CAAC,eAAe,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC3E,MAAM,IAAI,yCAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,qCAAiB,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,IAAI,GAAG,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,oCAAgB,CAAC,oBAAoB,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,GAAG,GAAG,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,oCAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,MAAM,iBAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7D,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,oCAAgB,CAAC,eAAe,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAKD,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAe;QACpD,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;YAC/E,MAAM,IAAI,qCAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,qCAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;QACnC,MAAM,EAAE,GAAG,iBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,iBAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAa,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,iBAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,UAAU;QACd,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,WAAW,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,oCAAgB,CAAC,0CAA0C,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnG,MAAM,IAAI,GAAG;YACX,SAAS;YACT,kBAAkB;YAClB,0BAA0B;YAC1B,yBAAyB,qBAAqB,EAAE;YAChD,yBAAyB;SAC1B,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3E,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAE1C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAE/B,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,MAAM,aAAa,GAAG,CAAC,WAAmB,EAAE,EAAE;YAC5C,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,MAAM,eAAe,GAAG,WAAW,CAAC;YACpC,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;YAEjB,OAAO,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;gBAE/C,IAAI,aAAa,GAAG,CAAC,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;oBACjD,MAAM;gBACR,CAAC;gBAED,aAAa,GAAG,SAAS,CAAC;gBAC1B,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;gBAC3B,WAAW,EAAE,CAAC;gBAEd,IAAI,aAAa,IAAI,WAAW,EAAE,CAAC;oBACjC,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,WAAW,KAAK,eAAe,IAAI,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAE,CAAC;gBACnC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC9B,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;gBAC3B,WAAW,EAAE,CAAC;YAChB,CAAC;YAED,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAE,CAAC,MAAM,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAEhD,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK;gBACL,GAAG;gBACH,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEnC,OAAO,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEO,kBAAkB,CAAC,QAAqB;QAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC;QAC3D,OAAO,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAEO,2BAA2B,CAAC,UAAkB;QACpD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,SAAS,IAAI,UAAU,CAAC;YACxB,KAAK,EAAE,CAAC;QACV,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAEO,8BAA8B,CAAC,QAAqB;QAC1D,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEnE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxC,KAAK,GAAG,GAAG,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,uBAAuB,CAAC,WAAmB;QAGjD,MAAM,uBAAuB,GAAG,KAAK,CAAC;QACtC,OAAO,WAAW,GAAG,uBAAuB,CAAC;IAC/C,CAAC;IAEO,eAAe,CAAC,KAAa,EAAE,GAAW,EAAE,KAAa;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,GAAG,aAAa,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;IAC5F,CAAC;IAEO,oBAAoB,CAAC,YAAoB;QAC/C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YAC9B,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YAC9B;gBACE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;IACH,CAAC;IAGO,SAAS,CAAC,KAAa,EAAE,OAAe;QAC9C,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAKD,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,yCAAqB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,yCAAqB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;CACF;AAvTD,kCAuTC;AAGD,2DAAyC;AACzC,6DAA2C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,19 +6,20 @@ export declare class HlsStreamer {
|
|
|
6
6
|
private readonly baseUrl;
|
|
7
7
|
private readonly enableFastStart;
|
|
8
8
|
private fileInfo?;
|
|
9
|
-
private
|
|
9
|
+
private segments;
|
|
10
10
|
constructor(options: HlsStreamerOptions);
|
|
11
11
|
private validateOptions;
|
|
12
12
|
private validateFile;
|
|
13
13
|
private getFileInfo;
|
|
14
14
|
getFileBuffer(startByte: number, endByte: number): Promise<Buffer>;
|
|
15
15
|
createM3U8(): Promise<string>;
|
|
16
|
-
private
|
|
16
|
+
private getSegments;
|
|
17
|
+
private computeTargetSizes;
|
|
18
|
+
private computeTargetSizesFromBytes;
|
|
19
|
+
private buildSegmentsWithoutFrameTable;
|
|
17
20
|
private estimateSegmentDuration;
|
|
18
21
|
private buildSegmentUrl;
|
|
19
22
|
private calculateSegmentSize;
|
|
20
|
-
private calculateSegment;
|
|
21
|
-
private calculatefirst2SegmentSize;
|
|
22
23
|
private padNumber;
|
|
23
24
|
getSegmentDuration(segmentIndex: number): Promise<number>;
|
|
24
25
|
}
|
package/dist/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"}
|
package/dist/index.js
CHANGED
|
@@ -40,11 +40,11 @@ export class HlsStreamer {
|
|
|
40
40
|
writable: true,
|
|
41
41
|
value: void 0
|
|
42
42
|
});
|
|
43
|
-
Object.defineProperty(this, "
|
|
43
|
+
Object.defineProperty(this, "segments", {
|
|
44
44
|
enumerable: true,
|
|
45
45
|
configurable: true,
|
|
46
46
|
writable: true,
|
|
47
|
-
value:
|
|
47
|
+
value: void 0
|
|
48
48
|
});
|
|
49
49
|
this.validateOptions(options);
|
|
50
50
|
this.validateFile(options.filePath);
|
|
@@ -81,18 +81,12 @@ export class HlsStreamer {
|
|
|
81
81
|
}
|
|
82
82
|
async getFileInfo() {
|
|
83
83
|
if (!this.fileInfo) {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
if (size <= 0) {
|
|
84
|
+
const analysis = await FileLib.analyzeMP3File(this.filePath);
|
|
85
|
+
if (analysis.size <= 0) {
|
|
87
86
|
throw new InvalidFileError('File is empty');
|
|
88
87
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
this.fileInfo = {
|
|
93
|
-
size,
|
|
94
|
-
duration: 0
|
|
95
|
-
};
|
|
88
|
+
this.fileInfo = analysis;
|
|
89
|
+
this.segments = undefined;
|
|
96
90
|
}
|
|
97
91
|
return this.fileInfo;
|
|
98
92
|
}
|
|
@@ -104,11 +98,14 @@ export class HlsStreamer {
|
|
|
104
98
|
if (endByte > fileInfo.size) {
|
|
105
99
|
throw new InvalidRangeError(startByte, endByte);
|
|
106
100
|
}
|
|
107
|
-
const
|
|
101
|
+
const length = endByte - startByte;
|
|
108
102
|
const fd = fs.openSync(this.filePath, "r");
|
|
109
103
|
try {
|
|
110
|
-
|
|
111
|
-
|
|
104
|
+
if (length === 0) {
|
|
105
|
+
return Buffer.alloc(0);
|
|
106
|
+
}
|
|
107
|
+
const buffer = Buffer.alloc(length);
|
|
108
|
+
const bytesRead = fs.readSync(fd, buffer, 0, length, startByte);
|
|
112
109
|
return buffer.subarray(0, bytesRead);
|
|
113
110
|
}
|
|
114
111
|
finally {
|
|
@@ -116,32 +113,131 @@ export class HlsStreamer {
|
|
|
116
113
|
}
|
|
117
114
|
}
|
|
118
115
|
async createM3U8() {
|
|
119
|
-
const fileInfo = await
|
|
120
|
-
|
|
116
|
+
const [fileInfo, segments] = await Promise.all([
|
|
117
|
+
this.getFileInfo(),
|
|
118
|
+
this.getSegments()
|
|
119
|
+
]);
|
|
120
|
+
if (!segments.length) {
|
|
121
|
+
throw new InvalidFileError('Unable to generate segments for MP3 file');
|
|
122
|
+
}
|
|
123
|
+
const maxSegmentDuration = segments.reduce((max, segment) => Math.max(max, segment.duration), 0);
|
|
124
|
+
const targetDurationSeconds = Math.max(1, Math.ceil(maxSegmentDuration || fileInfo.duration || 1));
|
|
121
125
|
const m3u8 = [
|
|
122
126
|
'#EXTM3U',
|
|
123
127
|
'#EXT-X-VERSION:6',
|
|
124
128
|
'#EXT-X-PLAYLIST-TYPE:VOD',
|
|
125
|
-
|
|
129
|
+
`#EXT-X-TARGETDURATION:${targetDurationSeconds}`,
|
|
126
130
|
'#EXT-X-MEDIA-SEQUENCE:0',
|
|
127
131
|
];
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
const segmentUrl = this.buildSegmentUrl(start, end, i);
|
|
132
|
-
m3u8.push(`#EXTINF:${estimatedDuration.toFixed(3)}`);
|
|
132
|
+
segments.forEach((segment, index) => {
|
|
133
|
+
const segmentUrl = this.buildSegmentUrl(segment.start, segment.end, index);
|
|
134
|
+
m3u8.push(`#EXTINF:${segment.duration.toFixed(3)}`);
|
|
133
135
|
m3u8.push(segmentUrl);
|
|
134
|
-
}
|
|
136
|
+
});
|
|
135
137
|
m3u8.push('#EXT-X-ENDLIST');
|
|
136
138
|
return m3u8.join('\n');
|
|
137
139
|
}
|
|
138
|
-
|
|
139
|
-
if (
|
|
140
|
-
return
|
|
140
|
+
async getSegments() {
|
|
141
|
+
if (this.segments) {
|
|
142
|
+
return this.segments;
|
|
143
|
+
}
|
|
144
|
+
const fileInfo = await this.getFileInfo();
|
|
145
|
+
if (!fileInfo.frames.length) {
|
|
146
|
+
this.segments = this.buildSegmentsWithoutFrameTable(fileInfo);
|
|
147
|
+
return this.segments;
|
|
141
148
|
}
|
|
142
|
-
const
|
|
143
|
-
const
|
|
144
|
-
|
|
149
|
+
const targetSizes = this.computeTargetSizes(fileInfo);
|
|
150
|
+
const segments = [];
|
|
151
|
+
const frames = fileInfo.frames;
|
|
152
|
+
let frameCursor = 0;
|
|
153
|
+
const consumeFrames = (targetBytes) => {
|
|
154
|
+
if (frameCursor >= frames.length) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const startFrameIndex = frameCursor;
|
|
158
|
+
let consumedBytes = 0;
|
|
159
|
+
let duration = 0;
|
|
160
|
+
while (frameCursor < frames.length) {
|
|
161
|
+
const frame = frames[frameCursor];
|
|
162
|
+
const nextBytes = consumedBytes + frame.length;
|
|
163
|
+
if (consumedBytes > 0 && nextBytes > targetBytes) {
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
consumedBytes = nextBytes;
|
|
167
|
+
duration += frame.duration;
|
|
168
|
+
frameCursor++;
|
|
169
|
+
if (consumedBytes >= targetBytes) {
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (frameCursor === startFrameIndex && frameCursor < frames.length) {
|
|
174
|
+
const frame = frames[frameCursor];
|
|
175
|
+
consumedBytes += frame.length;
|
|
176
|
+
duration += frame.duration;
|
|
177
|
+
frameCursor++;
|
|
178
|
+
}
|
|
179
|
+
if (frameCursor === startFrameIndex) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const start = frames[startFrameIndex].offset;
|
|
183
|
+
const lastFrame = frames[frameCursor - 1];
|
|
184
|
+
const end = lastFrame.offset + lastFrame.length;
|
|
185
|
+
segments.push({
|
|
186
|
+
start,
|
|
187
|
+
end,
|
|
188
|
+
duration
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
targetSizes.forEach(consumeFrames);
|
|
192
|
+
while (frameCursor < frames.length) {
|
|
193
|
+
consumeFrames(this.segmentSize);
|
|
194
|
+
}
|
|
195
|
+
if (!segments.length) {
|
|
196
|
+
this.segments = this.buildSegmentsWithoutFrameTable(fileInfo);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
this.segments = segments;
|
|
200
|
+
}
|
|
201
|
+
return this.segments;
|
|
202
|
+
}
|
|
203
|
+
computeTargetSizes(fileInfo) {
|
|
204
|
+
const totalBytes = fileInfo.audioDataSize || fileInfo.size;
|
|
205
|
+
return this.computeTargetSizesFromBytes(totalBytes);
|
|
206
|
+
}
|
|
207
|
+
computeTargetSizesFromBytes(totalBytes) {
|
|
208
|
+
if (totalBytes <= 0) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const targets = [];
|
|
212
|
+
let remaining = totalBytes;
|
|
213
|
+
let index = 0;
|
|
214
|
+
while (remaining > 0) {
|
|
215
|
+
const targetSize = Math.min(this.calculateSegmentSize(index), remaining);
|
|
216
|
+
targets.push(targetSize);
|
|
217
|
+
remaining -= targetSize;
|
|
218
|
+
index++;
|
|
219
|
+
}
|
|
220
|
+
return targets.length ? targets : [totalBytes];
|
|
221
|
+
}
|
|
222
|
+
buildSegmentsWithoutFrameTable(fileInfo) {
|
|
223
|
+
const segments = [];
|
|
224
|
+
const totalBytes = Math.max(fileInfo.size, fileInfo.audioDataSize);
|
|
225
|
+
if (totalBytes <= 0) {
|
|
226
|
+
return segments;
|
|
227
|
+
}
|
|
228
|
+
const targets = this.computeTargetSizesFromBytes(totalBytes);
|
|
229
|
+
let start = 0;
|
|
230
|
+
targets.forEach((targetSize) => {
|
|
231
|
+
const end = Math.min(totalBytes, start + targetSize);
|
|
232
|
+
const duration = this.estimateSegmentDuration(end - start);
|
|
233
|
+
segments.push({ start, end, duration });
|
|
234
|
+
start = end;
|
|
235
|
+
});
|
|
236
|
+
if (start < totalBytes) {
|
|
237
|
+
const duration = this.estimateSegmentDuration(totalBytes - start);
|
|
238
|
+
segments.push({ start, end: totalBytes, duration });
|
|
239
|
+
}
|
|
240
|
+
return segments;
|
|
145
241
|
}
|
|
146
242
|
estimateSegmentDuration(segmentSize) {
|
|
147
243
|
const estimatedBytesPerSecond = 16000;
|
|
@@ -164,42 +260,19 @@ export class HlsStreamer {
|
|
|
164
260
|
return this.segmentSize;
|
|
165
261
|
}
|
|
166
262
|
}
|
|
167
|
-
calculateSegment(segmentIndex, fileSize) {
|
|
168
|
-
let start = 0;
|
|
169
|
-
if (this.enableFastStart && segmentIndex < 2) {
|
|
170
|
-
start = segmentIndex * (this.segmentSize / 4);
|
|
171
|
-
}
|
|
172
|
-
else if (this.enableFastStart) {
|
|
173
|
-
start = (3 * this.segmentSize) / 4 + (segmentIndex - 2) * this.segmentSize;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
start = segmentIndex * this.segmentSize;
|
|
177
|
-
}
|
|
178
|
-
const segmentSize = this.calculateSegmentSize(segmentIndex);
|
|
179
|
-
const end = Math.min(start + segmentSize, fileSize);
|
|
180
|
-
return { start: Math.floor(start), end: Math.floor(end) };
|
|
181
|
-
}
|
|
182
|
-
calculatefirst2SegmentSize() {
|
|
183
|
-
return (this.segmentSize / 4) * 3;
|
|
184
|
-
}
|
|
185
263
|
padNumber(value, padding) {
|
|
186
264
|
return value.toString().padStart(padding, '0');
|
|
187
265
|
}
|
|
188
266
|
async getSegmentDuration(segmentIndex) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
return cachedSegment.duration;
|
|
267
|
+
if (!Number.isInteger(segmentIndex) || segmentIndex < 0) {
|
|
268
|
+
throw new InvalidParameterError('segmentIndex', segmentIndex);
|
|
192
269
|
}
|
|
193
|
-
const
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
end,
|
|
200
|
-
duration
|
|
201
|
-
});
|
|
202
|
-
return duration;
|
|
270
|
+
const segments = await this.getSegments();
|
|
271
|
+
const segment = segments[segmentIndex];
|
|
272
|
+
if (!segment) {
|
|
273
|
+
throw new InvalidParameterError('segmentIndex', segmentIndex);
|
|
274
|
+
}
|
|
275
|
+
return segment.duration;
|
|
203
276
|
}
|
|
204
277
|
}
|
|
205
278
|
export * from './Interfaces/HlsStreamer';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAKpC,MAAM,OAAO,WAAW;IAYtB,YAAY,OAA2B;QAXtB;;;;;WAAiB;QACjB;;;;;WAAoB;QACpB;;;;;WAAiB;QACjB;;;;;WAAgB;QAChB;;;;;WAAyB;QAClC;;;;;WAAuB;QACvB
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|