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/index.js
CHANGED
|
@@ -60,17 +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:
|
|
68
|
-
});
|
|
69
|
-
Object.defineProperty(this, "frameAlignedSegments", {
|
|
70
|
-
enumerable: true,
|
|
71
|
-
configurable: true,
|
|
72
|
-
writable: true,
|
|
73
|
-
value: new Map()
|
|
67
|
+
value: void 0
|
|
74
68
|
});
|
|
75
69
|
this.validateOptions(options);
|
|
76
70
|
this.validateFile(options.filePath);
|
|
@@ -107,18 +101,12 @@ class HlsStreamer {
|
|
|
107
101
|
}
|
|
108
102
|
async getFileInfo() {
|
|
109
103
|
if (!this.fileInfo) {
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
if (size <= 0) {
|
|
104
|
+
const analysis = await FileLib_1.FileLib.analyzeMP3File(this.filePath);
|
|
105
|
+
if (analysis.size <= 0) {
|
|
113
106
|
throw new HlsStreamerErrors_1.InvalidFileError('File is empty');
|
|
114
107
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
this.fileInfo = {
|
|
119
|
-
size,
|
|
120
|
-
duration: 0
|
|
121
|
-
};
|
|
108
|
+
this.fileInfo = analysis;
|
|
109
|
+
this.segments = undefined;
|
|
122
110
|
}
|
|
123
111
|
return this.fileInfo;
|
|
124
112
|
}
|
|
@@ -130,26 +118,14 @@ class HlsStreamer {
|
|
|
130
118
|
if (endByte > fileInfo.size) {
|
|
131
119
|
throw new HlsStreamerErrors_1.InvalidRangeError(startByte, endByte);
|
|
132
120
|
}
|
|
133
|
-
const
|
|
134
|
-
const searchStartByte = Math.max(0, startByte - 1024);
|
|
135
|
-
const searchEndByte = Math.min(fileInfo.size, startByte + searchBufferSize);
|
|
121
|
+
const length = endByte - startByte;
|
|
136
122
|
const fd = node_fs_1.default.openSync(this.filePath, "r");
|
|
137
123
|
try {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const targetOffsetInSearch = startByte - searchStartByte;
|
|
141
|
-
const frameAlignedOffsetInSearch = this.findNextMp3Frame(searchBuffer, Math.max(0, targetOffsetInSearch));
|
|
142
|
-
const actualStartByte = searchStartByte + frameAlignedOffsetInSearch;
|
|
143
|
-
const actualEndByte = Math.min(endByte, fileInfo.size);
|
|
144
|
-
const bufferLength = actualEndByte - actualStartByte;
|
|
145
|
-
if (bufferLength <= 0) {
|
|
146
|
-
const fallbackLength = endByte - startByte;
|
|
147
|
-
const fallbackBuffer = Buffer.alloc(fallbackLength);
|
|
148
|
-
const bytesRead = node_fs_1.default.readSync(fd, fallbackBuffer, 0, fallbackLength, startByte);
|
|
149
|
-
return fallbackBuffer.subarray(0, bytesRead);
|
|
124
|
+
if (length === 0) {
|
|
125
|
+
return Buffer.alloc(0);
|
|
150
126
|
}
|
|
151
|
-
const buffer = Buffer.alloc(
|
|
152
|
-
const bytesRead = node_fs_1.default.readSync(fd, buffer, 0,
|
|
127
|
+
const buffer = Buffer.alloc(length);
|
|
128
|
+
const bytesRead = node_fs_1.default.readSync(fd, buffer, 0, length, startByte);
|
|
153
129
|
return buffer.subarray(0, bytesRead);
|
|
154
130
|
}
|
|
155
131
|
finally {
|
|
@@ -157,32 +133,131 @@ class HlsStreamer {
|
|
|
157
133
|
}
|
|
158
134
|
}
|
|
159
135
|
async createM3U8() {
|
|
160
|
-
const fileInfo = await
|
|
161
|
-
|
|
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));
|
|
162
145
|
const m3u8 = [
|
|
163
146
|
'#EXTM3U',
|
|
164
147
|
'#EXT-X-VERSION:6',
|
|
165
148
|
'#EXT-X-PLAYLIST-TYPE:VOD',
|
|
166
|
-
|
|
149
|
+
`#EXT-X-TARGETDURATION:${targetDurationSeconds}`,
|
|
167
150
|
'#EXT-X-MEDIA-SEQUENCE:0',
|
|
168
151
|
];
|
|
169
|
-
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
const segmentUrl = this.buildSegmentUrl(start, end, i);
|
|
173
|
-
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)}`);
|
|
174
155
|
m3u8.push(segmentUrl);
|
|
175
|
-
}
|
|
156
|
+
});
|
|
176
157
|
m3u8.push('#EXT-X-ENDLIST');
|
|
177
158
|
return m3u8.join('\n');
|
|
178
159
|
}
|
|
179
|
-
|
|
180
|
-
if (
|
|
181
|
-
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;
|
|
168
|
+
}
|
|
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 [];
|
|
182
230
|
}
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
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;
|
|
186
261
|
}
|
|
187
262
|
estimateSegmentDuration(segmentSize) {
|
|
188
263
|
const estimatedBytesPerSecond = 16000;
|
|
@@ -205,94 +280,19 @@ class HlsStreamer {
|
|
|
205
280
|
return this.segmentSize;
|
|
206
281
|
}
|
|
207
282
|
}
|
|
208
|
-
calculateSegment(segmentIndex, fileSize) {
|
|
209
|
-
let start = 0;
|
|
210
|
-
if (this.enableFastStart && segmentIndex < 2) {
|
|
211
|
-
start = segmentIndex * (this.segmentSize / 4);
|
|
212
|
-
}
|
|
213
|
-
else if (this.enableFastStart) {
|
|
214
|
-
start = (3 * this.segmentSize) / 4 + (segmentIndex - 2) * this.segmentSize;
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
start = segmentIndex * this.segmentSize;
|
|
218
|
-
}
|
|
219
|
-
const segmentSize = this.calculateSegmentSize(segmentIndex);
|
|
220
|
-
const end = Math.min(start + segmentSize, fileSize);
|
|
221
|
-
return { start: Math.floor(start), end: Math.floor(end) };
|
|
222
|
-
}
|
|
223
|
-
async getFrameAlignedSegment(segmentIndex, fileSize) {
|
|
224
|
-
if (this.frameAlignedSegments.has(segmentIndex)) {
|
|
225
|
-
return this.frameAlignedSegments.get(segmentIndex);
|
|
226
|
-
}
|
|
227
|
-
const rawSegment = this.calculateSegment(segmentIndex, fileSize);
|
|
228
|
-
if (segmentIndex === 0) {
|
|
229
|
-
const fd = node_fs_1.default.openSync(this.filePath, "r");
|
|
230
|
-
try {
|
|
231
|
-
const headerBuffer = Buffer.alloc(Math.min(8192, fileSize));
|
|
232
|
-
node_fs_1.default.readSync(fd, headerBuffer, 0, headerBuffer.length, 0);
|
|
233
|
-
const frameStart = this.findNextMp3Frame(headerBuffer, 0);
|
|
234
|
-
const alignedSegment = { start: frameStart, end: rawSegment.end };
|
|
235
|
-
this.frameAlignedSegments.set(segmentIndex, alignedSegment);
|
|
236
|
-
return alignedSegment;
|
|
237
|
-
}
|
|
238
|
-
finally {
|
|
239
|
-
node_fs_1.default.closeSync(fd);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
this.frameAlignedSegments.set(segmentIndex, rawSegment);
|
|
243
|
-
return rawSegment;
|
|
244
|
-
}
|
|
245
|
-
findNextMp3Frame(buffer, startPos) {
|
|
246
|
-
let pos = startPos;
|
|
247
|
-
if (pos === 0 && buffer.length > 10 && buffer.toString('ascii', 0, 3) === 'ID3') {
|
|
248
|
-
const tagSize = ((buffer[6] & 0x7f) << 21) |
|
|
249
|
-
((buffer[7] & 0x7f) << 14) |
|
|
250
|
-
((buffer[8] & 0x7f) << 7) |
|
|
251
|
-
(buffer[9] & 0x7f);
|
|
252
|
-
pos = 10 + tagSize;
|
|
253
|
-
}
|
|
254
|
-
while (pos < buffer.length - 1) {
|
|
255
|
-
if (buffer[pos] === 0xFF && (buffer[pos + 1] & 0xE0) === 0xE0) {
|
|
256
|
-
if (pos + 3 < buffer.length) {
|
|
257
|
-
const header = (buffer[pos] << 24) |
|
|
258
|
-
(buffer[pos + 1] << 16) |
|
|
259
|
-
(buffer[pos + 2] << 8) |
|
|
260
|
-
buffer[pos + 3];
|
|
261
|
-
const version = (header >> 19) & 0x3;
|
|
262
|
-
const layer = (header >> 17) & 0x3;
|
|
263
|
-
const bitrateIndex = (header >> 12) & 0xF;
|
|
264
|
-
const sampleRateIndex = (header >> 10) & 0x3;
|
|
265
|
-
if (version !== 1 && layer !== 0 && bitrateIndex !== 0 &&
|
|
266
|
-
bitrateIndex !== 15 && sampleRateIndex !== 3) {
|
|
267
|
-
return pos;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
pos++;
|
|
272
|
-
}
|
|
273
|
-
return startPos;
|
|
274
|
-
}
|
|
275
|
-
calculatefirst2SegmentSize() {
|
|
276
|
-
return (this.segmentSize / 4) * 3;
|
|
277
|
-
}
|
|
278
283
|
padNumber(value, padding) {
|
|
279
284
|
return value.toString().padStart(padding, '0');
|
|
280
285
|
}
|
|
281
286
|
async getSegmentDuration(segmentIndex) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
return cachedSegment.duration;
|
|
287
|
+
if (!Number.isInteger(segmentIndex) || segmentIndex < 0) {
|
|
288
|
+
throw new HlsStreamerErrors_1.InvalidParameterError('segmentIndex', segmentIndex);
|
|
285
289
|
}
|
|
286
|
-
const
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
end,
|
|
293
|
-
duration
|
|
294
|
-
});
|
|
295
|
-
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;
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/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/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"}
|