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.
- package/README.md +145 -106
- package/dist/Interfaces/HlsStreamer.d.ts +4 -3
- package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
- package/dist/Libs/FileLib.d.ts +11 -5
- package/dist/Libs/FileLib.d.ts.map +1 -1
- package/dist/Libs/FileLib.js +9 -3
- package/dist/Libs/FileLib.js.map +1 -1
- package/dist/Libs/FormatDetector.d.ts +3 -3
- package/dist/Libs/FormatDetector.d.ts.map +1 -1
- package/dist/Libs/FormatDetector.js +19 -2
- package/dist/Libs/FormatDetector.js.map +1 -1
- package/dist/Parsers/AacParser.d.ts +4 -4
- package/dist/Parsers/AacParser.d.ts.map +1 -1
- package/dist/Parsers/AacParser.js +5 -1
- package/dist/Parsers/AacParser.js.map +1 -1
- package/dist/Parsers/FlacParser.d.ts +4 -4
- package/dist/Parsers/IAudioParser.d.ts +1 -30
- package/dist/Parsers/IAudioParser.d.ts.map +1 -1
- package/dist/Parsers/IMediaParser.d.ts +43 -0
- package/dist/Parsers/IMediaParser.d.ts.map +1 -0
- package/dist/Parsers/IMediaParser.js +2 -0
- package/dist/Parsers/IMediaParser.js.map +1 -0
- package/dist/Parsers/Mp3Parser.d.ts +4 -4
- package/dist/Parsers/Mp4Parser.d.ts +21 -0
- package/dist/Parsers/Mp4Parser.d.ts.map +1 -0
- package/dist/Parsers/Mp4Parser.js +418 -0
- package/dist/Parsers/Mp4Parser.js.map +1 -0
- package/dist/Parsers/OggParser.d.ts +4 -4
- package/dist/Parsers/ParserFactory.d.ts +5 -5
- package/dist/Parsers/ParserFactory.d.ts.map +1 -1
- package/dist/Parsers/ParserFactory.js +6 -3
- package/dist/Parsers/ParserFactory.js.map +1 -1
- package/dist/Parsers/WavParser.d.ts +4 -4
- package/dist/cjs/Interfaces/HlsStreamer.d.ts +4 -3
- package/dist/cjs/Interfaces/HlsStreamer.d.ts.map +1 -1
- package/dist/cjs/Libs/FileLib.d.ts +11 -5
- package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
- package/dist/cjs/Libs/FileLib.js +9 -3
- package/dist/cjs/Libs/FileLib.js.map +1 -1
- package/dist/cjs/Libs/FormatDetector.d.ts +3 -3
- package/dist/cjs/Libs/FormatDetector.d.ts.map +1 -1
- package/dist/cjs/Libs/FormatDetector.js +19 -2
- package/dist/cjs/Libs/FormatDetector.js.map +1 -1
- package/dist/cjs/Parsers/AacParser.d.ts +4 -4
- package/dist/cjs/Parsers/AacParser.d.ts.map +1 -1
- package/dist/cjs/Parsers/AacParser.js +5 -1
- package/dist/cjs/Parsers/AacParser.js.map +1 -1
- package/dist/cjs/Parsers/FlacParser.d.ts +4 -4
- package/dist/cjs/Parsers/IAudioParser.d.ts +1 -30
- package/dist/cjs/Parsers/IAudioParser.d.ts.map +1 -1
- package/dist/cjs/Parsers/IMediaParser.d.ts +43 -0
- package/dist/cjs/Parsers/IMediaParser.d.ts.map +1 -0
- package/dist/cjs/Parsers/IMediaParser.js +3 -0
- package/dist/cjs/Parsers/IMediaParser.js.map +1 -0
- package/dist/cjs/Parsers/Mp3Parser.d.ts +4 -4
- package/dist/cjs/Parsers/Mp4Parser.d.ts +21 -0
- package/dist/cjs/Parsers/Mp4Parser.d.ts.map +1 -0
- package/dist/cjs/Parsers/Mp4Parser.js +422 -0
- package/dist/cjs/Parsers/Mp4Parser.js.map +1 -0
- package/dist/cjs/Parsers/OggParser.d.ts +4 -4
- package/dist/cjs/Parsers/ParserFactory.d.ts +5 -5
- package/dist/cjs/Parsers/ParserFactory.d.ts.map +1 -1
- package/dist/cjs/Parsers/ParserFactory.js +6 -3
- package/dist/cjs/Parsers/ParserFactory.js.map +1 -1
- package/dist/cjs/Parsers/WavParser.d.ts +4 -4
- package/dist/cjs/errors/HlsStreamerErrors.js +1 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +21 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/errors/HlsStreamerErrors.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -6
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="assets/header.png" alt="HLS Streamer" width="100%">
|
|
3
|
+
</div>
|
|
4
|
+
|
|
1
5
|
# HLS Streamer
|
|
2
6
|
|
|
3
7
|
[](https://badge.fury.io/js/hls-streamer)
|
|
4
8
|
[](https://opensource.org/licenses/MIT)
|
|
5
9
|
[](https://www.typescriptlang.org/)
|
|
6
10
|
|
|
7
|
-
HLS Streamer
|
|
11
|
+
HLS Streamer converts audio and video files (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV, MP4, MOV, M4V) into HTTP Live Streaming (HLS) playlists on the fly. It analyses the source file in-memory, builds frame-aligned byte ranges, and streams them without temporary files, native bindings, or external binaries like ffmpeg.
|
|
8
12
|
|
|
9
13
|
---
|
|
10
14
|
|
|
@@ -21,26 +25,27 @@ HLS Streamer turns any audio file (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV) into an
|
|
|
21
25
|
|
|
22
26
|
## Why HLS Streamer?
|
|
23
27
|
|
|
24
|
-
- **Multi-format support** – handles MP3, AAC, M4A, OGG Vorbis, FLAC, and
|
|
28
|
+
- **Multi-format support** – handles MP3, AAC, M4A, OGG Vorbis, FLAC, WAV, MP4, MOV, and M4V with automatic format detection.
|
|
29
|
+
- **Audio + Video** – audio files produce standard HLS v6 playlists; video files produce HLS v7 fMP4 playlists with an `EXT-X-MAP` init segment and keyframe-aligned boundaries.
|
|
25
30
|
- **Zero dependencies** – no shared libraries, no ffmpeg, no native compilation. Pure TypeScript parsers for all formats. Drop it into Docker, serverless, or edge runtimes.
|
|
26
|
-
- **Accurate segments** – real
|
|
27
|
-
- **Frame-aligned byte ranges** – every segment begins and ends on verified frame
|
|
28
|
-
- **No temp files** – streams straight from the source
|
|
31
|
+
- **Accurate segments** – real frame/packet parsing provides true durations, `#EXTINF` metadata, and target durations that match playback.
|
|
32
|
+
- **Frame-aligned byte ranges** – every segment begins and ends on verified frame boundaries; video segments snap to keyframes to prevent decoding artifacts.
|
|
33
|
+
- **No temp files** – streams straight from the source file using byte-range reads.
|
|
29
34
|
- **Fast-start aware** – optional smaller first segments improve startup latency for constrained networks.
|
|
30
35
|
- **TypeScript first** – authored in TypeScript with full type definitions for your tooling and IDEs.
|
|
31
36
|
|
|
32
37
|
## How It Works
|
|
33
38
|
|
|
34
|
-
1. **Format detection** – automatically detects
|
|
35
|
-
2. **Metadata analysis** – format-specific parsers extract
|
|
36
|
-
3. **Segment planning** –
|
|
37
|
-
4. **Playlist generation** – `createM3U8()` emits an `#EXTM3U` playlist
|
|
38
|
-
5. **On-demand byte ranges** – `getFileBuffer(start, end)`
|
|
39
|
+
1. **Format detection** – automatically detects format from file content (magic bytes / `ftyp` brand) or extension, with optional manual override.
|
|
40
|
+
2. **Metadata analysis** – format-specific parsers extract frame/packet tables with offsets, durations, and (for video) keyframe markers.
|
|
41
|
+
3. **Segment planning** – boundaries are calculated from the frame table so each segment contains whole frames while respecting your target size. Video segments snap to I-frame boundaries.
|
|
42
|
+
4. **Playlist generation** – `createM3U8()` emits an `#EXTM3U` playlist. Audio files use HLS v6; video files use HLS v7 with `EXT-X-MAP` pointing to the `moov` init segment.
|
|
43
|
+
5. **On-demand byte ranges** – `getFileBuffer(start, end)` reads only the bytes needed for a given segment or init segment.
|
|
39
44
|
|
|
40
45
|
```
|
|
41
46
|
┌──────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────────────┐
|
|
42
|
-
│
|
|
43
|
-
│ (any format) │ │ (magic bytes) │ │ (MP3/
|
|
47
|
+
│ Media Source │ ──▶ │ Format Detector │ ──▶ │ Format Parser │ ──▶ │ Segment Planner │
|
|
48
|
+
│ (any format) │ │ (magic bytes) │ │ (MP3/MP4/etc.) │ │ (frame/keyframe) │
|
|
44
49
|
└──────────────┘ └─────────────────┘ └─────────────────┘ └──────────┬───────────┘
|
|
45
50
|
│
|
|
46
51
|
▼
|
|
@@ -54,25 +59,34 @@ HLS Streamer turns any audio file (MP3, AAC, M4A, OGG Vorbis, FLAC, WAV) into an
|
|
|
54
59
|
```ts
|
|
55
60
|
import { HlsStreamer } from 'hls-streamer';
|
|
56
61
|
|
|
57
|
-
//
|
|
58
|
-
const
|
|
62
|
+
// Audio file — auto-detected
|
|
63
|
+
const audioStreamer = new HlsStreamer({
|
|
59
64
|
filePath: '/media/library/song.mp3', // or .aac, .m4a, .ogg, .flac, .wav
|
|
60
65
|
segmentSizeKB: 512,
|
|
61
66
|
fileName: 'track',
|
|
62
67
|
baseUrl: 'audio/stream/session-42',
|
|
63
68
|
enableFastStart: true,
|
|
64
|
-
// format: 'mp3' // optional: override auto-detection
|
|
65
69
|
});
|
|
66
70
|
|
|
67
|
-
const
|
|
68
|
-
|
|
71
|
+
const audioPlaylist = await audioStreamer.createM3U8();
|
|
72
|
+
|
|
73
|
+
// Video file — same API
|
|
74
|
+
const videoStreamer = new HlsStreamer({
|
|
75
|
+
filePath: '/media/library/movie.mp4', // or .mov, .m4v
|
|
76
|
+
segmentSizeKB: 2048,
|
|
77
|
+
fileName: 'segment',
|
|
78
|
+
baseUrl: 'video/stream/session-42',
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const videoPlaylist = await videoStreamer.createM3U8();
|
|
69
82
|
|
|
70
|
-
|
|
83
|
+
// Detect media type at runtime
|
|
84
|
+
const type = await videoStreamer.getMediaType(); // 'video' | 'audio'
|
|
71
85
|
```
|
|
72
86
|
|
|
73
87
|
## Serving Over HTTP
|
|
74
88
|
|
|
75
|
-
|
|
89
|
+
The example below shows an Express setup that handles both audio and video:
|
|
76
90
|
|
|
77
91
|
```ts
|
|
78
92
|
import express from 'express';
|
|
@@ -83,7 +97,7 @@ const app = express();
|
|
|
83
97
|
app.get('/streams/:id/playlist.m3u8', async (req, res, next) => {
|
|
84
98
|
try {
|
|
85
99
|
const streamer = new HlsStreamer({
|
|
86
|
-
filePath:
|
|
100
|
+
filePath: resolveMediaPath(req.params.id),
|
|
87
101
|
baseUrl: `streams/${req.params.id}`,
|
|
88
102
|
enableFastStart: true,
|
|
89
103
|
});
|
|
@@ -98,14 +112,15 @@ app.get('/streams/:id/playlist.m3u8', async (req, res, next) => {
|
|
|
98
112
|
app.get('/streams/:id/:start/:end/:filename', async (req, res, next) => {
|
|
99
113
|
try {
|
|
100
114
|
const streamer = new HlsStreamer({
|
|
101
|
-
filePath:
|
|
115
|
+
filePath: resolveMediaPath(req.params.id),
|
|
102
116
|
baseUrl: `streams/${req.params.id}`,
|
|
103
117
|
});
|
|
104
118
|
|
|
105
119
|
const start = Number(req.params.start);
|
|
106
120
|
const end = Number(req.params.end);
|
|
121
|
+
const mediaType = await streamer.getMediaType();
|
|
107
122
|
|
|
108
|
-
res.type('audio/mpeg');
|
|
123
|
+
res.type(mediaType === 'video' ? 'video/mp4' : 'audio/mpeg');
|
|
109
124
|
res.set('Accept-Ranges', 'bytes');
|
|
110
125
|
res.send(await streamer.getFileBuffer(start, end));
|
|
111
126
|
} catch (error) {
|
|
@@ -116,48 +131,60 @@ app.get('/streams/:id/:start/:end/:filename', async (req, res, next) => {
|
|
|
116
131
|
|
|
117
132
|
### Segment URL Contract
|
|
118
133
|
|
|
119
|
-
Generated playlists follow
|
|
134
|
+
Generated playlists follow this pattern:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
/{baseUrl}/{startByte}/{endByte}/{fileName}{index}.{ext}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
For video files, an additional init segment URL is emitted as `EXT-X-MAP`:
|
|
120
141
|
|
|
121
142
|
```
|
|
122
|
-
/{baseUrl}/{
|
|
143
|
+
/{baseUrl}/{moovOffset}/{moovEnd}/{fileName}init.mp4
|
|
123
144
|
```
|
|
124
145
|
|
|
125
146
|
- `startByte` is inclusive, `endByte` is exclusive.
|
|
126
147
|
- `index` is zero-padded to three digits (`000`, `001`, ...).
|
|
127
|
-
-
|
|
148
|
+
- Serve the exact byte range from the original file — no transcoding needed.
|
|
128
149
|
|
|
129
150
|
## Configuration Reference
|
|
130
151
|
|
|
131
|
-
| Option
|
|
132
|
-
|
|
|
133
|
-
| `filePath`
|
|
134
|
-
| `segmentSizeKB`
|
|
135
|
-
| `fileName`
|
|
136
|
-
| `baseUrl`
|
|
137
|
-
| `enableFastStart`
|
|
138
|
-
| `format`
|
|
152
|
+
| Option | Type | Default | Description |
|
|
153
|
+
| ----------------- | ------------- | ------------ | ----------- |
|
|
154
|
+
| `filePath` | `string` | — | Path to the media file. Supports: MP3, AAC, M4A, OGG, FLAC, WAV, MP4, MOV, M4V. |
|
|
155
|
+
| `segmentSizeKB` | `number` | `512` | Target segment size in kilobytes. |
|
|
156
|
+
| `fileName` | `string` | `"file"` | Base name for generated segment URLs. |
|
|
157
|
+
| `baseUrl` | `string` | `""` | URL prefix inserted before each segment path. |
|
|
158
|
+
| `enableFastStart` | `boolean` | `false` | Smaller first two segments for faster playback start. |
|
|
159
|
+
| `format` | `MediaFormat` | auto-detect | Optional override: `'mp3'`, `'aac'`, `'m4a'`, `'ogg'`, `'flac'`, `'wav'`, `'mp4'`, `'mov'`, `'m4v'`. |
|
|
139
160
|
|
|
140
161
|
### API Surface
|
|
141
162
|
|
|
142
|
-
- `createM3U8(): Promise<string>` –
|
|
143
|
-
- `getFileBuffer(start: number, end: number): Promise<Buffer>` –
|
|
144
|
-
- `getSegmentDuration(index: number): Promise<number>` –
|
|
163
|
+
- `createM3U8(): Promise<string>` – Full HLS playlist with frame-accurate durations. Audio → HLS v6; Video → HLS v7 + `EXT-X-MAP`.
|
|
164
|
+
- `getFileBuffer(start: number, end: number): Promise<Buffer>` – Byte-range read from the source file (used for both segments and the init segment).
|
|
165
|
+
- `getSegmentDuration(index: number): Promise<number>` – Duration in seconds for a specific segment.
|
|
166
|
+
- `getMediaType(): Promise<'audio' | 'video'>` – Returns `'video'` for MP4/MOV/M4V, `'audio'` for everything else.
|
|
145
167
|
|
|
146
|
-
Custom error classes
|
|
168
|
+
Custom error classes: `FileNotFoundError`, `InvalidFileError`, `InvalidRangeError`, `InvalidParameterError`, `UnsupportedFormatError`.
|
|
147
169
|
|
|
148
170
|
### Supported Formats
|
|
149
171
|
|
|
150
|
-
| Format
|
|
151
|
-
|
|
152
|
-
| **MP3** | `.mp3`
|
|
153
|
-
| **AAC** | `.aac`
|
|
154
|
-
| **M4A** | `.m4a`, `.m4b`
|
|
155
|
-
| **OGG** | `.ogg`, `.oga`
|
|
156
|
-
| **FLAC
|
|
157
|
-
| **WAV** | `.wav`
|
|
172
|
+
| Format | Extensions | Container | Codec | Frame Parsing |
|
|
173
|
+
| ------- | ------------------- | --------- | ------------ | ------------------------------- |
|
|
174
|
+
| **MP3** | `.mp3` | — | MPEG Layer 3 | ✅ Full frame table |
|
|
175
|
+
| **AAC** | `.aac` | ADTS | AAC | ✅ ADTS frames |
|
|
176
|
+
| **M4A** | `.m4a`, `.m4b` | MP4 | AAC | ✅ MP4 box structure |
|
|
177
|
+
| **OGG** | `.ogg`, `.oga` | OGG | Vorbis | ✅ OGG pages |
|
|
178
|
+
| **FLAC**| `.flac` | — | FLAC | ✅ FLAC frames |
|
|
179
|
+
| **WAV** | `.wav` | RIFF | PCM | ⚠️ Synthetic 1-second frames |
|
|
180
|
+
| **MP4** | `.mp4` | fMP4 | H.264/H.265 | ✅ ISOBMFF box parse + keyframes |
|
|
181
|
+
| **MOV** | `.mov` | QuickTime | H.264/H.265 | ✅ ISOBMFF box parse + keyframes |
|
|
182
|
+
| **M4V** | `.m4v` | MP4 | H.264/H.265 | ✅ ISOBMFF box parse + keyframes |
|
|
158
183
|
|
|
159
184
|
## Playlist Anatomy
|
|
160
185
|
|
|
186
|
+
### Audio (HLS v6)
|
|
187
|
+
|
|
161
188
|
```m3u8
|
|
162
189
|
#EXTM3U
|
|
163
190
|
#EXT-X-VERSION:6
|
|
@@ -172,36 +199,49 @@ Custom error classes are exported to help with error handling: `FileNotFoundErro
|
|
|
172
199
|
#EXT-X-ENDLIST
|
|
173
200
|
```
|
|
174
201
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
202
|
+
### Video (HLS v7 fMP4)
|
|
203
|
+
|
|
204
|
+
```m3u8
|
|
205
|
+
#EXTM3U
|
|
206
|
+
#EXT-X-VERSION:7
|
|
207
|
+
#EXT-X-PLAYLIST-TYPE:VOD
|
|
208
|
+
#EXT-X-TARGETDURATION:4
|
|
209
|
+
#EXT-X-MEDIA-SEQUENCE:0
|
|
210
|
+
#EXT-X-MAP:URI="/video/session/0/28672/fileinit.mp4"
|
|
211
|
+
#EXTINF:4.000,
|
|
212
|
+
/video/session/28672/2125824/file000.mp4
|
|
213
|
+
#EXTINF:3.967,
|
|
214
|
+
/video/session/2125824/4194304/file001.mp4
|
|
215
|
+
...
|
|
216
|
+
#EXT-X-ENDLIST
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- `EXT-X-MAP` points to the `moov` box (init segment) inside the original file — no remuxing.
|
|
220
|
+
- Video segment boundaries are snapped to keyframes for seamless decoding.
|
|
221
|
+
- `#EXTINF` retains millisecond precision for smooth playback.
|
|
178
222
|
|
|
179
223
|
## Operational Tips
|
|
180
224
|
|
|
181
|
-
- **Caching** – Construct the streamer once per unique
|
|
182
|
-
- **
|
|
183
|
-
- **
|
|
184
|
-
- **
|
|
185
|
-
- **
|
|
186
|
-
- **
|
|
187
|
-
- **MP3/AAC/M4A**: Best compatibility with HLS players
|
|
188
|
-
- **FLAC**: Lossless quality but larger segments
|
|
189
|
-
- **OGG**: Open-source, good compression
|
|
190
|
-
- **WAV**: Uncompressed, very large segments (consider smaller `segmentSizeKB`)
|
|
225
|
+
- **Caching** – Construct the streamer once per unique file and reuse it. Segment planning caches metadata after the first call.
|
|
226
|
+
- **Video segment size** – Use a larger `segmentSizeKB` (1024–4096) for video to avoid excessive HTTP requests. Audio works well at 512.
|
|
227
|
+
- **CDN friendliness** – Segment URLs are deterministic byte ranges, making them ideal for edge caching. Use `Cache-Control: public, max-age=86400`.
|
|
228
|
+
- **Serverless** – Zero-dependency design works in Lambda/Cloud Functions. `getFileBuffer` reads only the bytes needed, keeping memory usage low.
|
|
229
|
+
- **Content-Type** – Serve audio segments as `audio/mpeg` (or the appropriate codec MIME type) and video segments as `video/mp4`. Use `getMediaType()` to branch at runtime.
|
|
230
|
+
- **Troubleshooting** – Inspect `FileLib.analyzeMediaFile()` to review parsing warnings and format-specific metadata.
|
|
191
231
|
|
|
192
232
|
## Development
|
|
193
233
|
|
|
194
|
-
Clone the repo, install dependencies, and run the usual scripts:
|
|
195
|
-
|
|
196
234
|
```bash
|
|
197
235
|
npm install
|
|
198
|
-
npm test
|
|
236
|
+
npm test
|
|
199
237
|
npm run build
|
|
200
238
|
```
|
|
201
239
|
|
|
202
|
-
|
|
240
|
+
To run a single test file:
|
|
203
241
|
|
|
204
|
-
|
|
242
|
+
```bash
|
|
243
|
+
npx jest tests/Parsers/Mp4Parser.test.ts
|
|
244
|
+
```
|
|
205
245
|
|
|
206
246
|
## Support
|
|
207
247
|
|
|
@@ -211,65 +251,64 @@ To explore the example playlist generator, see `example/test-hls-generation.js`
|
|
|
211
251
|
|
|
212
252
|
## Contributing
|
|
213
253
|
|
|
214
|
-
Contributions are welcome! Please open an issue to discuss substantial changes before submitting a pull request. Make sure `npm test
|
|
254
|
+
Contributions are welcome! Please open an issue to discuss substantial changes before submitting a pull request. Make sure `npm test` and `npm run build` pass prior to filing the PR.
|
|
215
255
|
|
|
216
256
|
---
|
|
217
257
|
|
|
218
258
|
## Release Notes
|
|
219
259
|
|
|
220
|
-
### Version
|
|
260
|
+
### Version 4.0.0
|
|
221
261
|
|
|
222
|
-
|
|
262
|
+
Major release adding video support and completing the audio→media rename.
|
|
223
263
|
|
|
224
|
-
####
|
|
225
|
-
- **
|
|
226
|
-
- **
|
|
227
|
-
- **
|
|
228
|
-
-
|
|
264
|
+
#### New Features
|
|
265
|
+
- **Video support** – MP4, MOV, and M4V files are now fully supported via a pure-JS ISOBMFF (MP4 box) parser. No ffmpeg, no native bindings, no vendored libraries.
|
|
266
|
+
- **HLS v7 fMP4 playlists** – video files produce `EXT-X-MAP` init segments and keyframe-aligned byte-range segments, fully compatible with Safari, Chrome, and HLS.js.
|
|
267
|
+
- **Keyframe-aware segmentation** – video segment boundaries snap to I-frames, preventing decoding artifacts.
|
|
268
|
+
- **`getMediaType()`** – new method returning `'audio' | 'video'` to simplify route/MIME-type logic.
|
|
269
|
+
- **`MediaFormat` / `MediaFileInfo` / `MediaFrameInfo`** – public types renamed from `Audio*` to `Media*` to reflect the broader scope.
|
|
229
270
|
|
|
230
|
-
####
|
|
231
|
-
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
271
|
+
#### Breaking Changes (from v3)
|
|
272
|
+
- `AudioFormat`, `AudioFileInfo`, `AudioFrameInfo`, `IAudioParser` are now **deprecated** aliases — they still compile but will be removed in v5.
|
|
273
|
+
- `FileLib.analyzeAudioFile()` and `analyzeAudioBuffer()` are deprecated; use `analyzeMediaFile()` / `analyzeMediaBuffer()`.
|
|
274
|
+
- `UnsupportedFormatError` message changed from `"Unsupported audio format"` to `"Unsupported media format"`.
|
|
275
|
+
- `format` option type widened from `AudioFormat` to `MediaFormat` (superset — no change needed for existing callers).
|
|
235
276
|
|
|
236
|
-
|
|
277
|
+
#### Migration Guide
|
|
237
278
|
|
|
238
|
-
|
|
279
|
+
```typescript
|
|
280
|
+
// v3.x
|
|
281
|
+
import { AudioFormat, AudioFileInfo } from 'hls-streamer';
|
|
282
|
+
const type: AudioFormat = 'mp3';
|
|
239
283
|
|
|
240
|
-
|
|
284
|
+
// v4.x — preferred
|
|
285
|
+
import { MediaFormat, MediaFileInfo } from 'hls-streamer';
|
|
286
|
+
const type: MediaFormat = 'mp3'; // same values, broader type
|
|
241
287
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
- **Format detection**: Files are now validated against all supported formats, not just MP3
|
|
245
|
-
- **Error types**: `InvalidFileError` for non-MP3 files is now `UnsupportedFormatError` for unsupported formats
|
|
246
|
-
- **Internal architecture**: MP3 parsing refactored into modular `Parsers/` directory
|
|
288
|
+
// v3.x names still compile in v4 (deprecated, removed in v5)
|
|
289
|
+
import { AudioFormat } from 'hls-streamer'; // ⚠️ deprecated alias
|
|
247
290
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
// v3.x - All formats work the same way!
|
|
254
|
-
const streamer = new HlsStreamer({ filePath: 'song.mp3' }); // ✅ Still works
|
|
255
|
-
const streamer = new HlsStreamer({ filePath: 'song.ogg' }); // ✅ Now supported
|
|
256
|
-
const streamer = new HlsStreamer({ filePath: 'song.flac' }); // ✅ Now supported
|
|
257
|
-
|
|
258
|
-
// Error handling update
|
|
259
|
-
try {
|
|
260
|
-
new HlsStreamer({ filePath: 'document.pdf' });
|
|
261
|
-
} catch (err) {
|
|
262
|
-
// v2.x: InvalidFileError
|
|
263
|
-
// v3.x: UnsupportedFormatError
|
|
264
|
-
}
|
|
291
|
+
// Video — new in v4
|
|
292
|
+
const streamer = new HlsStreamer({ filePath: 'movie.mp4' });
|
|
293
|
+
const playlist = await streamer.createM3U8(); // HLS v7 + EXT-X-MAP
|
|
294
|
+
const type = await streamer.getMediaType(); // 'video'
|
|
265
295
|
```
|
|
266
296
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
### Version 3.1.0
|
|
300
|
+
|
|
301
|
+
- **HLS compliance**: `#EXTINF` lines now include the required trailing comma.
|
|
302
|
+
- **AAC ADTS detection**: ADTS buffers no longer misclassified as MP3.
|
|
303
|
+
- **Extensionless files**: constructor now accepts extensionless files when magic bytes identify a supported format.
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### Version 3.0.0
|
|
271
308
|
|
|
272
|
-
|
|
309
|
+
- Added AAC, M4A, OGG Vorbis, FLAC, and WAV support.
|
|
310
|
+
- Refactored MP3 parsing into a modular `Parsers/` directory.
|
|
311
|
+
- `InvalidFileError` for non-MP3 files replaced by `UnsupportedFormatError`.
|
|
273
312
|
|
|
274
313
|
---
|
|
275
314
|
|
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import {
|
|
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?:
|
|
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 {
|
|
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;
|
|
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"}
|
package/dist/Libs/FileLib.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Mp3FileInfo,
|
|
2
|
-
import {
|
|
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
|
|
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?:
|
|
17
|
-
}):
|
|
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;
|
|
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"}
|
package/dist/Libs/FileLib.js
CHANGED
|
@@ -116,7 +116,7 @@ export class FileLib {
|
|
|
116
116
|
]);
|
|
117
117
|
return this.analyzeMP3Buffer(buffer, { fileSize: stat.size });
|
|
118
118
|
}
|
|
119
|
-
static async
|
|
119
|
+
static async analyzeMediaFile(filePath, format) {
|
|
120
120
|
const [buffer, stat] = await Promise.all([
|
|
121
121
|
fs.promises.readFile(filePath),
|
|
122
122
|
fs.promises.stat(filePath)
|
|
@@ -128,9 +128,12 @@ export class FileLib {
|
|
|
128
128
|
if (format !== undefined) {
|
|
129
129
|
opts.format = format;
|
|
130
130
|
}
|
|
131
|
-
return this.
|
|
131
|
+
return this.analyzeMediaBuffer(buffer, opts);
|
|
132
132
|
}
|
|
133
|
-
static
|
|
133
|
+
static async analyzeAudioFile(filePath, format) {
|
|
134
|
+
return this.analyzeMediaFile(filePath, format);
|
|
135
|
+
}
|
|
136
|
+
static analyzeMediaBuffer(buffer, opts = {}) {
|
|
134
137
|
let parser;
|
|
135
138
|
if (opts.format) {
|
|
136
139
|
parser = ParserFactory.getParser(opts.format);
|
|
@@ -150,6 +153,9 @@ export class FileLib {
|
|
|
150
153
|
const analyzeOpts = opts.fileSize !== undefined ? { fileSize: opts.fileSize } : {};
|
|
151
154
|
return parser.analyze(buffer, analyzeOpts);
|
|
152
155
|
}
|
|
156
|
+
static analyzeAudioBuffer(buffer, opts = {}) {
|
|
157
|
+
return this.analyzeMediaBuffer(buffer, opts);
|
|
158
|
+
}
|
|
153
159
|
static calculateFrameLength(frame) {
|
|
154
160
|
if (frame.layer === 1) {
|
|
155
161
|
return Math.floor(((12 * frame.bitrate * 1000) / frame.sampleRate + frame.padding) * 4);
|
package/dist/Libs/FileLib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLib.js","sourceRoot":"","sources":["../../src/Libs/FileLib.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileLib.js","sourceRoot":"","sources":["../../src/Libs/FileLib.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MediaFormat } from '../Parsers/IMediaParser';
|
|
2
2
|
export declare class FormatDetector {
|
|
3
|
-
static detectFormat(buffer: Buffer):
|
|
4
|
-
static detectFormatFromExtension(filePath: string):
|
|
3
|
+
static detectFormat(buffer: Buffer): MediaFormat | null;
|
|
4
|
+
static detectFormatFromExtension(filePath: string): MediaFormat | null;
|
|
5
5
|
static getSupportedExtensions(): string[];
|
|
6
6
|
static isSupportedExtension(filePath: string): boolean;
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormatDetector.d.ts","sourceRoot":"","sources":["../../src/Libs/FormatDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,qBAAa,cAAc;IAMzB,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"FormatDetector.d.ts","sourceRoot":"","sources":["../../src/Libs/FormatDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,qBAAa,cAAc;IAMzB,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA8EvD,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAgCtE,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAOzC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAIvD"}
|
|
@@ -32,9 +32,20 @@ export class FormatDetector {
|
|
|
32
32
|
}
|
|
33
33
|
if (buffer.length >= 12 && buffer.toString('ascii', 4, 8) === 'ftyp') {
|
|
34
34
|
const brand = buffer.toString('ascii', 8, 12);
|
|
35
|
-
if (brand === 'M4A ' || brand === 'M4B '
|
|
35
|
+
if (brand === 'M4A ' || brand === 'M4B ') {
|
|
36
36
|
return 'm4a';
|
|
37
37
|
}
|
|
38
|
+
if (brand === 'qt ') {
|
|
39
|
+
return 'mov';
|
|
40
|
+
}
|
|
41
|
+
if (brand.startsWith('M4V')) {
|
|
42
|
+
return 'm4v';
|
|
43
|
+
}
|
|
44
|
+
if (brand === 'mp42' || brand === 'isom' || brand === 'mp41' ||
|
|
45
|
+
brand === 'avc1' || brand === 'iso2' || brand === 'iso5' || brand === 'iso6') {
|
|
46
|
+
return 'mp4';
|
|
47
|
+
}
|
|
48
|
+
return 'mp4';
|
|
38
49
|
}
|
|
39
50
|
return null;
|
|
40
51
|
}
|
|
@@ -55,12 +66,18 @@ export class FormatDetector {
|
|
|
55
66
|
return 'flac';
|
|
56
67
|
case 'wav':
|
|
57
68
|
return 'wav';
|
|
69
|
+
case 'mp4':
|
|
70
|
+
return 'mp4';
|
|
71
|
+
case 'mov':
|
|
72
|
+
return 'mov';
|
|
73
|
+
case 'm4v':
|
|
74
|
+
return 'm4v';
|
|
58
75
|
default:
|
|
59
76
|
return null;
|
|
60
77
|
}
|
|
61
78
|
}
|
|
62
79
|
static getSupportedExtensions() {
|
|
63
|
-
return ['.mp3', '.aac', '.m4a', '.m4b', '.ogg', '.oga', '.flac', '.wav'];
|
|
80
|
+
return ['.mp3', '.aac', '.m4a', '.m4b', '.ogg', '.oga', '.flac', '.wav', '.mp4', '.mov', '.m4v'];
|
|
64
81
|
}
|
|
65
82
|
static isSupportedExtension(filePath) {
|
|
66
83
|
const ext = '.' + filePath.toLowerCase().split('.').pop();
|