audio-snip 0.2.0 → 0.3.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/dist/cjs/core.js +78 -9
- package/dist/cjs/core.js.map +1 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/plugins/mp3.js +30 -43
- package/dist/cjs/plugins/mp3.js.map +1 -1
- package/dist/cjs/plugins/mp4.js +83 -46
- package/dist/cjs/plugins/mp4.js.map +1 -1
- package/dist/esm/core.js +76 -8
- package/dist/esm/core.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/plugins/mp3.js +31 -44
- package/dist/esm/plugins/mp3.js.map +1 -1
- package/dist/esm/plugins/mp4.js +84 -47
- package/dist/esm/plugins/mp4.js.map +1 -1
- package/dist/types/core.d.ts +21 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/plugins/mp4.d.ts +0 -1
- package/package.json +2 -2
package/dist/cjs/core.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.audioSnip = exports.BasePlugin = void 0;
|
|
4
|
+
exports.audioSnip = exports.RemoteFile = exports.BasePlugin = void 0;
|
|
5
5
|
exports.fetchRange = fetchRange;
|
|
6
6
|
exports.fetchContentLength = fetchContentLength;
|
|
7
7
|
exports.trimBySamples = trimBySamples;
|
|
@@ -16,32 +16,101 @@ async function fetchRange(url, start, end) {
|
|
|
16
16
|
if (!resp.ok && resp.status !== 206) {
|
|
17
17
|
throw new Error(`HTTP ${resp.status} fetching range ${start}-${end}`);
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
// If server ignored Range
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return full.slice(start, end + 1);
|
|
19
|
+
const data = new Uint8Array(await resp.arrayBuffer());
|
|
20
|
+
// If server ignored Range and returned full file, slice to requested range
|
|
21
|
+
if (resp.status === 200 && data.length > end - start + 1) {
|
|
22
|
+
return data.slice(start, end + 1);
|
|
24
23
|
}
|
|
25
|
-
return
|
|
24
|
+
return data;
|
|
26
25
|
}
|
|
27
26
|
async function fetchContentLength(url) {
|
|
28
|
-
// Try HEAD first
|
|
29
27
|
const headResp = await fetch(url, { method: 'HEAD' });
|
|
30
28
|
const cl = headResp.headers.get('content-length');
|
|
31
29
|
if (cl)
|
|
32
30
|
return parseInt(cl, 10);
|
|
33
|
-
// Fallback:
|
|
31
|
+
// Fallback: Range 0-0, parse Content-Range or Content-Length
|
|
34
32
|
const rangeResp = await fetch(url, {
|
|
35
33
|
headers: { Range: 'bytes=0-0' },
|
|
36
34
|
});
|
|
37
35
|
const cr = rangeResp.headers.get('content-range');
|
|
36
|
+
const cl2 = rangeResp.headers.get('content-length');
|
|
37
|
+
await rangeResp.arrayBuffer(); // consume body
|
|
38
38
|
if (cr) {
|
|
39
39
|
const match = cr.match(/\/(\d+)/);
|
|
40
40
|
if (match)
|
|
41
41
|
return parseInt(match[1], 10);
|
|
42
42
|
}
|
|
43
|
+
if (cl2)
|
|
44
|
+
return parseInt(cl2, 10);
|
|
43
45
|
return null;
|
|
44
46
|
}
|
|
47
|
+
// ─── RemoteFile — per-operation file handle ──────────────────────────────────
|
|
48
|
+
/**
|
|
49
|
+
* Wraps a URL for efficient byte access. On the first getRange() call it probes
|
|
50
|
+
* whether the server supports HTTP Range requests. If the server returns 200
|
|
51
|
+
* (full file), the data is kept in memory and all subsequent getRange() calls
|
|
52
|
+
* are served locally — the file is never re-downloaded.
|
|
53
|
+
*
|
|
54
|
+
* Create one RemoteFile per decode() call, let it go when done.
|
|
55
|
+
*/
|
|
56
|
+
class RemoteFile {
|
|
57
|
+
constructor(url) {
|
|
58
|
+
this.fullData = null;
|
|
59
|
+
this._size = null;
|
|
60
|
+
this._rangeSupported = null;
|
|
61
|
+
this.url = url;
|
|
62
|
+
}
|
|
63
|
+
get rangeSupported() {
|
|
64
|
+
return this._rangeSupported;
|
|
65
|
+
}
|
|
66
|
+
get size() {
|
|
67
|
+
return this._size;
|
|
68
|
+
}
|
|
69
|
+
/** Fetch content length via HEAD (does not download body). */
|
|
70
|
+
async fetchSize() {
|
|
71
|
+
if (this._size !== null)
|
|
72
|
+
return this._size;
|
|
73
|
+
if (this.fullData) {
|
|
74
|
+
this._size = this.fullData.length;
|
|
75
|
+
return this._size;
|
|
76
|
+
}
|
|
77
|
+
this._size = await fetchContentLength(this.url);
|
|
78
|
+
return this._size;
|
|
79
|
+
}
|
|
80
|
+
/** Read a byte range. Detects Range support on first call. */
|
|
81
|
+
async getRange(start, end) {
|
|
82
|
+
// Already have the whole file in memory — just slice
|
|
83
|
+
if (this.fullData) {
|
|
84
|
+
return this.fullData.slice(start, end + 1);
|
|
85
|
+
}
|
|
86
|
+
const resp = await fetch(this.url, {
|
|
87
|
+
headers: { Range: `bytes=${start}-${end}` },
|
|
88
|
+
});
|
|
89
|
+
if (!resp.ok && resp.status !== 206) {
|
|
90
|
+
throw new Error(`HTTP ${resp.status} fetching range ${start}-${end} from ${this.url}`);
|
|
91
|
+
}
|
|
92
|
+
const data = new Uint8Array(await resp.arrayBuffer());
|
|
93
|
+
if (resp.status === 206) {
|
|
94
|
+
this._rangeSupported = true;
|
|
95
|
+
// Pick up total size from Content-Range if we don't have it yet
|
|
96
|
+
if (this._size === null) {
|
|
97
|
+
const cr = resp.headers.get('content-range');
|
|
98
|
+
if (cr) {
|
|
99
|
+
const m = cr.match(/\/(\d+)/);
|
|
100
|
+
if (m)
|
|
101
|
+
this._size = parseInt(m[1], 10);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return data;
|
|
105
|
+
}
|
|
106
|
+
// Server returned 200 (full file) — keep it, never re-download
|
|
107
|
+
this._rangeSupported = false;
|
|
108
|
+
this.fullData = data;
|
|
109
|
+
this._size = data.length;
|
|
110
|
+
return data.slice(start, end + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.RemoteFile = RemoteFile;
|
|
45
114
|
function trimBySamples(ctx, buffer, startSample, endSample) {
|
|
46
115
|
const start = Math.max(0, Math.round(startSample));
|
|
47
116
|
const end = Math.min(buffer.length, Math.round(endSample));
|
package/dist/cjs/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":";AAAA,gFAAgF;;;AAyBhF,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.trimBySamples = exports.fetchContentLength = exports.fetchRange = exports.BasePlugin = exports.audioSnip = void 0;
|
|
3
|
+
exports.trimBySamples = exports.fetchContentLength = exports.fetchRange = exports.RemoteFile = exports.BasePlugin = exports.audioSnip = void 0;
|
|
4
4
|
var core_js_1 = require("./core.js");
|
|
5
5
|
Object.defineProperty(exports, "audioSnip", { enumerable: true, get: function () { return core_js_1.audioSnip; } });
|
|
6
6
|
Object.defineProperty(exports, "BasePlugin", { enumerable: true, get: function () { return core_js_1.BasePlugin; } });
|
|
7
|
+
Object.defineProperty(exports, "RemoteFile", { enumerable: true, get: function () { return core_js_1.RemoteFile; } });
|
|
7
8
|
Object.defineProperty(exports, "fetchRange", { enumerable: true, get: function () { return core_js_1.fetchRange; } });
|
|
8
9
|
Object.defineProperty(exports, "fetchContentLength", { enumerable: true, get: function () { return core_js_1.fetchContentLength; } });
|
|
9
10
|
Object.defineProperty(exports, "trimBySamples", { enumerable: true, get: function () { return core_js_1.trimBySamples; } });
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAOmB;AANjB,oGAAA,SAAS,OAAA;AACT,qGAAA,UAAU,OAAA;AACV,qGAAA,UAAU,OAAA;AACV,qGAAA,UAAU,OAAA;AACV,6GAAA,kBAAkB,OAAA;AAClB,wGAAA,aAAa,OAAA"}
|
package/dist/cjs/plugins/mp3.js
CHANGED
|
@@ -65,11 +65,7 @@ function parseFrameHeader(data, offset) {
|
|
|
65
65
|
frameSize = Math.floor((12 * bitrate * 1000) / sampleRate + (padding ? 1 : 0)) * 4;
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
68
|
-
|
|
69
|
-
const divisor = mpegVersion === 1 ? sampleRate : sampleRate * 2;
|
|
70
|
-
frameSize = Math.floor((samplesPerFrame * bitrate * 1000) / (8 * divisor)) * 8 / 8 + (padding ? slotSize : 0);
|
|
71
|
-
// Simplified: frameSize = floor(samplesPerFrame/8 * bitrate*1000 / sampleRate) + padding
|
|
72
|
-
frameSize = Math.floor((samplesPerFrame * (bitrate * 1000) / 8) / sampleRate) + (padding ? slotSize : 0);
|
|
68
|
+
frameSize = Math.floor((samplesPerFrame * (bitrate * 1000) / 8) / sampleRate) + (padding ? 1 : 0);
|
|
73
69
|
}
|
|
74
70
|
// Side information size for Layer 3
|
|
75
71
|
let sideInfoSize = 0;
|
|
@@ -104,7 +100,9 @@ function id3v2Size(data) {
|
|
|
104
100
|
((data[7] & 0x7F) << 14) |
|
|
105
101
|
((data[8] & 0x7F) << 7) |
|
|
106
102
|
(data[9] & 0x7F);
|
|
107
|
-
|
|
103
|
+
const flags = data[5];
|
|
104
|
+
const hasFooter = (flags & 0x10) !== 0;
|
|
105
|
+
return size + 10 + (hasFooter ? 10 : 0); // 10-byte header + optional 10-byte footer
|
|
108
106
|
}
|
|
109
107
|
// ─── Find first frame sync after given offset ───────────────────────────────
|
|
110
108
|
function findFrameSync(data, start) {
|
|
@@ -156,11 +154,10 @@ function parseXingVbri(data, frameOffset, header) {
|
|
|
156
154
|
if (flags & 8) {
|
|
157
155
|
pos += 4;
|
|
158
156
|
}
|
|
159
|
-
// LAME
|
|
160
|
-
// The LAME header starts 120 bytes after the Xing tag position
|
|
157
|
+
// LAME tag: encoder string at Xing+120, delay/padding at Xing+141
|
|
161
158
|
let encoderDelay = 0;
|
|
162
159
|
let encoderPadding = 0;
|
|
163
|
-
const lameOffset = xingOffset +
|
|
160
|
+
const lameOffset = xingOffset + 141;
|
|
164
161
|
if (lameOffset + 3 <= data.length) {
|
|
165
162
|
// Verify LAME tag exists (9 char encoder string at xingOffset+120)
|
|
166
163
|
const lameTag = String.fromCharCode(data[xingOffset + 120], data[xingOffset + 121], data[xingOffset + 122], data[xingOffset + 123]);
|
|
@@ -224,17 +221,13 @@ class Mp3Plugin extends core_js_1.BasePlugin {
|
|
|
224
221
|
this.paddingFrames = options.paddingFrames ?? 8;
|
|
225
222
|
}
|
|
226
223
|
canHandle(url) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
return path.endsWith('.mp3');
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
return url.toLowerCase().endsWith('.mp3');
|
|
233
|
-
}
|
|
224
|
+
const path = url.split('?')[0].split('#')[0].toLowerCase();
|
|
225
|
+
return path.endsWith('.mp3');
|
|
234
226
|
}
|
|
235
227
|
async getInfo(url) {
|
|
236
|
-
const
|
|
237
|
-
const
|
|
228
|
+
const file = new core_js_1.RemoteFile(url);
|
|
229
|
+
const { header, vbrInfo, fileSize, audioStart } = await this.fetchHeader(file);
|
|
230
|
+
const duration = this.computeDuration(header, vbrInfo, fileSize, audioStart, vbrInfo?.encoderDelay ?? 0, vbrInfo?.encoderPadding ?? 0);
|
|
238
231
|
return {
|
|
239
232
|
duration,
|
|
240
233
|
sampleRate: header.sampleRate,
|
|
@@ -246,12 +239,13 @@ class Mp3Plugin extends core_js_1.BasePlugin {
|
|
|
246
239
|
};
|
|
247
240
|
}
|
|
248
241
|
async decode(ctx, url, startTime, endTime) {
|
|
249
|
-
const
|
|
242
|
+
const file = new core_js_1.RemoteFile(url);
|
|
243
|
+
const { header, vbrInfo, audioStart, xingFrameStart, fileSize } = await this.fetchHeader(file);
|
|
250
244
|
const sampleRate = header.sampleRate;
|
|
251
245
|
const encoderDelay = vbrInfo?.encoderDelay ?? 0;
|
|
252
246
|
const encoderPadding = vbrInfo?.encoderPadding ?? 0;
|
|
253
247
|
const isVbr = vbrInfo?.isVbr ?? false;
|
|
254
|
-
const duration = this.computeDuration(header, vbrInfo, fileSize, audioStart);
|
|
248
|
+
const duration = this.computeDuration(header, vbrInfo, fileSize, audioStart, encoderDelay, encoderPadding);
|
|
255
249
|
// Compute byte range for the requested time segment
|
|
256
250
|
let startByte;
|
|
257
251
|
let endByte;
|
|
@@ -259,14 +253,11 @@ class Mp3Plugin extends core_js_1.BasePlugin {
|
|
|
259
253
|
if (isVbr && vbrInfo?.toc && vbrInfo.totalBytes && duration) {
|
|
260
254
|
const startFrac = Math.max(0, startTime / duration);
|
|
261
255
|
const endFrac = Math.min(1, endTime / duration);
|
|
262
|
-
startByte =
|
|
263
|
-
endByte =
|
|
256
|
+
startByte = xingFrameStart + tocInterpolate(vbrInfo.toc, startFrac, vbrInfo.totalBytes);
|
|
257
|
+
endByte = xingFrameStart + tocInterpolate(vbrInfo.toc, endFrac, vbrInfo.totalBytes);
|
|
264
258
|
}
|
|
265
259
|
else {
|
|
266
|
-
// CBR or VBR-without-TOC
|
|
267
|
-
if (isVbr && (!vbrInfo?.toc)) {
|
|
268
|
-
console.warn('audio-snip: VBR file without TOC, using CBR byte estimate for Range request');
|
|
269
|
-
}
|
|
260
|
+
// CBR or VBR-without-TOC: linear byte estimate
|
|
270
261
|
const bytesPerSecond = (header.bitrate * 1000) / 8;
|
|
271
262
|
startByte = audioStart + Math.floor(startTime * bytesPerSecond);
|
|
272
263
|
endByte = audioStart + Math.ceil(endTime * bytesPerSecond);
|
|
@@ -277,7 +268,7 @@ class Mp3Plugin extends core_js_1.BasePlugin {
|
|
|
277
268
|
// Add extra frames at end for safety
|
|
278
269
|
const fetchEnd = Math.min((fileSize ?? endByte + paddingBytes * 2) - 1, endByte + paddingBytes * 2);
|
|
279
270
|
// Fetch the segment
|
|
280
|
-
const chunk = await
|
|
271
|
+
const chunk = await file.getRange(fetchStart, fetchEnd);
|
|
281
272
|
// Find first valid frame in fetched chunk
|
|
282
273
|
const firstSync = findFrameSync(chunk, 0);
|
|
283
274
|
if (firstSync === -1) {
|
|
@@ -317,22 +308,19 @@ class Mp3Plugin extends core_js_1.BasePlugin {
|
|
|
317
308
|
return (0, core_js_1.trimBySamples)(ctx, decoded, startSample, endSample);
|
|
318
309
|
}
|
|
319
310
|
// ─── Internal helpers ────────────────────────────────────────────────────
|
|
320
|
-
async fetchHeader(
|
|
321
|
-
const fileSize = await
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
// Check for ID3v2 tag
|
|
311
|
+
async fetchHeader(file) {
|
|
312
|
+
const fileSize = await file.fetchSize();
|
|
313
|
+
let headData = await file.getRange(0, HEAD_SIZE - 1);
|
|
314
|
+
// Skip ID3v2 tag
|
|
325
315
|
let audioStart = 0;
|
|
326
316
|
const id3Size = id3v2Size(headData);
|
|
327
317
|
if (id3Size > 0) {
|
|
328
318
|
audioStart = id3Size;
|
|
329
|
-
// If ID3 tag is larger than our initial fetch, re-fetch from after it
|
|
330
319
|
if (id3Size >= HEAD_SIZE) {
|
|
331
|
-
headData = await
|
|
332
|
-
audioStart = id3Size;
|
|
320
|
+
headData = await file.getRange(id3Size, id3Size + HEAD_SIZE - 1);
|
|
333
321
|
}
|
|
334
322
|
}
|
|
335
|
-
// Find first frame sync
|
|
323
|
+
// Find first frame sync (search from 0 if we re-fetched past ID3, else from audioStart)
|
|
336
324
|
const searchStart = id3Size >= HEAD_SIZE ? 0 : audioStart;
|
|
337
325
|
const syncOffset = findFrameSync(headData, searchStart);
|
|
338
326
|
if (syncOffset === -1) {
|
|
@@ -340,23 +328,22 @@ class Mp3Plugin extends core_js_1.BasePlugin {
|
|
|
340
328
|
}
|
|
341
329
|
const header = parseFrameHeader(headData, syncOffset);
|
|
342
330
|
const absoluteFrameOffset = id3Size >= HEAD_SIZE ? id3Size + syncOffset : syncOffset;
|
|
343
|
-
// Parse Xing/VBRI
|
|
344
331
|
const vbrInfo = parseXingVbri(headData, syncOffset, header);
|
|
345
|
-
//
|
|
346
|
-
const
|
|
332
|
+
// Audio starts after the Xing/Info frame (if present), or at the first frame
|
|
333
|
+
const audioDataStart = vbrInfo
|
|
347
334
|
? absoluteFrameOffset + header.frameSize
|
|
348
335
|
: absoluteFrameOffset;
|
|
349
336
|
return {
|
|
350
337
|
header,
|
|
351
338
|
vbrInfo,
|
|
352
|
-
audioStart:
|
|
353
|
-
|
|
339
|
+
audioStart: audioDataStart,
|
|
340
|
+
xingFrameStart: absoluteFrameOffset,
|
|
354
341
|
fileSize,
|
|
355
342
|
};
|
|
356
343
|
}
|
|
357
|
-
computeDuration(header, vbrInfo, fileSize, audioStart) {
|
|
344
|
+
computeDuration(header, vbrInfo, fileSize, audioStart, encoderDelay = 0, encoderPadding = 0) {
|
|
358
345
|
if (vbrInfo?.totalFrames) {
|
|
359
|
-
const totalSamples = vbrInfo.totalFrames * header.samplesPerFrame;
|
|
346
|
+
const totalSamples = vbrInfo.totalFrames * header.samplesPerFrame - encoderDelay - encoderPadding;
|
|
360
347
|
return totalSamples / header.sampleRate;
|
|
361
348
|
}
|
|
362
349
|
if (fileSize) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp3.js","sourceRoot":"","sources":["../../../src/plugins/mp3.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mp3.js","sourceRoot":"","sources":["../../../src/plugins/mp3.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/plugins/mp4.js
CHANGED
|
@@ -5,9 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Mp4Plugin = void 0;
|
|
7
7
|
const core_js_1 = require("../core.js");
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
9
8
|
const mp4box_1 = __importDefault(require("mp4box"));
|
|
10
|
-
const
|
|
9
|
+
const MP4Box = mp4box_1.default;
|
|
10
|
+
const AAC_LC_PRIMING_SAMPLES = 2112;
|
|
11
|
+
const MOOV_TIMEOUT_MS = 30000;
|
|
12
|
+
const MOOV_INITIAL_BYTES = 2 * 1024 * 1024;
|
|
13
|
+
const RANGE_MERGE_GAP = 64 * 1024;
|
|
11
14
|
// ─── ADTS header construction ────────────────────────────────────────────────
|
|
12
15
|
function makeAdtsHeader(frameLength, audioObjectType, samplingFrequencyIndex, channelConfiguration) {
|
|
13
16
|
const header = new Uint8Array(7);
|
|
@@ -45,21 +48,24 @@ function getSamplingFrequencyIndex(sampleRate) {
|
|
|
45
48
|
// ─── Mp4Plugin ───────────────────────────────────────────────────────────────
|
|
46
49
|
class Mp4Plugin extends core_js_1.BasePlugin {
|
|
47
50
|
canHandle(url) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return (path.endsWith('.m4a') ||
|
|
51
|
-
path.endsWith('.mp4') ||
|
|
52
|
-
path.endsWith('.aac') ||
|
|
53
|
-
path.endsWith('.m4b'));
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
const lower = url.toLowerCase();
|
|
57
|
-
return lower.endsWith('.m4a') || lower.endsWith('.mp4') || lower.endsWith('.aac') || lower.endsWith('.m4b');
|
|
58
|
-
}
|
|
51
|
+
const path = url.split('?')[0].split('#')[0].toLowerCase();
|
|
52
|
+
return path.endsWith('.m4a') || path.endsWith('.mp4') || path.endsWith('.aac') || path.endsWith('.m4b');
|
|
59
53
|
}
|
|
60
54
|
async getInfo(url) {
|
|
61
|
-
const
|
|
55
|
+
const file = new core_js_1.RemoteFile(url);
|
|
56
|
+
const { info, audioTrack } = await this.loadMoovForDecode(file);
|
|
62
57
|
const duration = info.duration / info.timescale;
|
|
58
|
+
// Parse encoder delay from edit list (elst atom)
|
|
59
|
+
let encoderDelay;
|
|
60
|
+
const edits = audioTrack.edits;
|
|
61
|
+
if (edits && edits.length > 0 && edits[0].media_time > 0) {
|
|
62
|
+
const mediaTime = edits[0].media_time;
|
|
63
|
+
encoderDelay = Math.round(mediaTime * audioTrack.audio.sample_rate / audioTrack.timescale);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Default priming for AAC-LC: 1024 * 2 + 64 = 2112
|
|
67
|
+
encoderDelay = AAC_LC_PRIMING_SAMPLES;
|
|
68
|
+
}
|
|
63
69
|
return {
|
|
64
70
|
duration,
|
|
65
71
|
sampleRate: audioTrack.audio.sample_rate,
|
|
@@ -67,14 +73,25 @@ class Mp4Plugin extends core_js_1.BasePlugin {
|
|
|
67
73
|
bitrate: audioTrack.bitrate,
|
|
68
74
|
codec: audioTrack.codec,
|
|
69
75
|
isVbr: true, // AAC is always VBR conceptually
|
|
70
|
-
encoderDelay
|
|
76
|
+
encoderDelay,
|
|
71
77
|
};
|
|
72
78
|
}
|
|
73
79
|
async decode(ctx, url, startTime, endTime) {
|
|
74
80
|
// Step 1: Load moov atom only (a few MB) to get metadata + sample table
|
|
75
|
-
const
|
|
81
|
+
const file = new core_js_1.RemoteFile(url);
|
|
82
|
+
const { audioTrack, mp4 } = await this.loadMoovForDecode(file);
|
|
76
83
|
const sampleRate = audioTrack.audio.sample_rate;
|
|
77
84
|
const timescale = audioTrack.timescale;
|
|
85
|
+
// Parse encoder delay from edit list
|
|
86
|
+
let encoderDelay;
|
|
87
|
+
const edits = audioTrack.edits;
|
|
88
|
+
if (edits && edits.length > 0 && edits[0].media_time > 0) {
|
|
89
|
+
const mediaTime = edits[0].media_time;
|
|
90
|
+
encoderDelay = Math.round(mediaTime * sampleRate / timescale);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
encoderDelay = AAC_LC_PRIMING_SAMPLES; // Default AAC-LC priming
|
|
94
|
+
}
|
|
78
95
|
// Step 2: Use sample table to find which samples fall in [startTime, endTime]
|
|
79
96
|
const allSamples = mp4.getTrackSamplesInfo(audioTrack.id);
|
|
80
97
|
if (allSamples.length === 0) {
|
|
@@ -104,7 +121,7 @@ class Mp4Plugin extends core_js_1.BasePlugin {
|
|
|
104
121
|
// We read sample data directly from the fetched bytes — no onSamples needed.
|
|
105
122
|
const rangeData = new Map(); // range.start → data
|
|
106
123
|
for (const range of ranges) {
|
|
107
|
-
const data = await
|
|
124
|
+
const data = await file.getRange(range.start, range.end);
|
|
108
125
|
rangeData.set(range.start, data);
|
|
109
126
|
}
|
|
110
127
|
// Step 5: Extract raw AAC frame data for each needed sample
|
|
@@ -118,8 +135,9 @@ class Mp4Plugin extends core_js_1.BasePlugin {
|
|
|
118
135
|
for (const si of neededSamples) {
|
|
119
136
|
// Find which fetched range contains this sample
|
|
120
137
|
const rawData = this.readSampleFromRanges(si.offset, si.size, ranges, rangeData);
|
|
121
|
-
if (!rawData)
|
|
122
|
-
|
|
138
|
+
if (!rawData) {
|
|
139
|
+
throw new Error(`Failed to read sample at offset ${si.offset}, size ${si.size} — byte range not fetched`);
|
|
140
|
+
}
|
|
123
141
|
const adtsHeader = makeAdtsHeader(rawData.length, audioObjectType, samplingFreqIndex, channelConfig);
|
|
124
142
|
const frame = new Uint8Array(adtsHeader.length + rawData.length);
|
|
125
143
|
frame.set(adtsHeader, 0);
|
|
@@ -141,7 +159,7 @@ class Mp4Plugin extends core_js_1.BasePlugin {
|
|
|
141
159
|
const decodedRate = decoded.sampleRate;
|
|
142
160
|
const rangeStartTime = neededSamples[0].cts / timescale;
|
|
143
161
|
const trimStartSeconds = startTime - rangeStartTime;
|
|
144
|
-
const trimStartSamples = Math.round(trimStartSeconds * decodedRate);
|
|
162
|
+
const trimStartSamples = Math.round(trimStartSeconds * decodedRate) + encoderDelay;
|
|
145
163
|
const wantedSamples = Math.round((endTime - startTime) * decodedRate);
|
|
146
164
|
const startSample = Math.max(0, trimStartSamples);
|
|
147
165
|
const endSample = Math.min(decoded.length, startSample + wantedSamples);
|
|
@@ -176,7 +194,7 @@ class Mp4Plugin extends core_js_1.BasePlugin {
|
|
|
176
194
|
const sampleStart = sorted[i].offset;
|
|
177
195
|
const sampleEnd = sampleStart + sorted[i].size - 1;
|
|
178
196
|
// Merge if gap is < 64KB (cheaper to over-fetch than make another request)
|
|
179
|
-
if (sampleStart <= cur.end +
|
|
197
|
+
if (sampleStart <= cur.end + RANGE_MERGE_GAP) {
|
|
180
198
|
cur.end = Math.max(cur.end, sampleEnd);
|
|
181
199
|
}
|
|
182
200
|
else {
|
|
@@ -188,49 +206,68 @@ class Mp4Plugin extends core_js_1.BasePlugin {
|
|
|
188
206
|
return ranges;
|
|
189
207
|
}
|
|
190
208
|
// ─── Internal helpers ────────────────────────────────────────────────────
|
|
191
|
-
async
|
|
192
|
-
const { info, audioTrack } = await this.loadMoovForDecode(url);
|
|
193
|
-
return { info, audioTrack };
|
|
194
|
-
}
|
|
195
|
-
async loadMoovForDecode(url) {
|
|
196
|
-
const MP4Box = MP4BoxLib;
|
|
209
|
+
async loadMoovForDecode(file) {
|
|
197
210
|
const mp4 = MP4Box.createFile();
|
|
198
|
-
const fileSize = await
|
|
199
|
-
|
|
211
|
+
const fileSize = await file.fetchSize();
|
|
212
|
+
let timer;
|
|
213
|
+
const infoPromise = new Promise((resolve, reject) => {
|
|
200
214
|
mp4.onReady = resolve;
|
|
201
215
|
mp4.onError = reject;
|
|
202
|
-
this.streamToMP4Box(mp4,
|
|
216
|
+
this.streamToMP4Box(mp4, file, fileSize).catch(reject);
|
|
217
|
+
});
|
|
218
|
+
const timeout = new Promise((_, reject) => {
|
|
219
|
+
timer = setTimeout(() => reject(new Error('Timeout: could not parse MP4 metadata')), MOOV_TIMEOUT_MS);
|
|
203
220
|
});
|
|
221
|
+
let info;
|
|
222
|
+
try {
|
|
223
|
+
info = await Promise.race([infoPromise, timeout]);
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
clearTimeout(timer);
|
|
227
|
+
}
|
|
204
228
|
const audioTrack = info.tracks.find((t) => t.type === 'audio');
|
|
205
229
|
if (!audioTrack)
|
|
206
230
|
throw new Error('No audio track found in MP4');
|
|
207
231
|
return { info, audioTrack, mp4 };
|
|
208
232
|
}
|
|
209
|
-
async streamToMP4Box(mp4,
|
|
233
|
+
async streamToMP4Box(mp4, file, fileSize) {
|
|
210
234
|
const chunkSize = 256 * 1024;
|
|
211
|
-
|
|
235
|
+
if (!fileSize)
|
|
236
|
+
throw new Error('Cannot determine file size — needed for MP4 parsing');
|
|
237
|
+
// mp4box calls onReady when moov is parsed. We track that to stop early.
|
|
238
|
+
let moovFound = false;
|
|
239
|
+
const origOnReady = mp4.onReady;
|
|
240
|
+
mp4.onReady = (info) => {
|
|
241
|
+
moovFound = true;
|
|
242
|
+
origOnReady?.(info);
|
|
243
|
+
};
|
|
244
|
+
// Stream from start until moov is found or we hit MOOV_INITIAL_BYTES
|
|
212
245
|
let offset = 0;
|
|
213
|
-
while (offset <
|
|
214
|
-
const end = Math.min(offset + chunkSize - 1,
|
|
215
|
-
const data = await
|
|
246
|
+
while (offset < fileSize && !moovFound) {
|
|
247
|
+
const end = Math.min(offset + chunkSize - 1, fileSize - 1);
|
|
248
|
+
const data = await file.getRange(offset, end);
|
|
216
249
|
const ab = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
217
250
|
ab.fileStart = offset;
|
|
218
251
|
mp4.appendBuffer(ab);
|
|
219
252
|
offset = end + 1;
|
|
220
|
-
//
|
|
221
|
-
//
|
|
222
|
-
if (
|
|
223
|
-
// For the moov-at-end case, try the tail
|
|
253
|
+
// After reading MOOV_INITIAL_BYTES from start without finding moov,
|
|
254
|
+
// jump to the tail (moov-at-end layout)
|
|
255
|
+
if (!moovFound && offset >= MOOV_INITIAL_BYTES && offset < fileSize - chunkSize) {
|
|
224
256
|
break;
|
|
225
257
|
}
|
|
226
258
|
}
|
|
227
|
-
// If moov
|
|
228
|
-
if (
|
|
229
|
-
const tailStart = Math.max(offset, fileSize -
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
259
|
+
// If moov wasn't in the head, try the tail
|
|
260
|
+
if (!moovFound && offset < fileSize) {
|
|
261
|
+
const tailStart = Math.max(offset, fileSize - MOOV_INITIAL_BYTES);
|
|
262
|
+
let tailOffset = tailStart;
|
|
263
|
+
while (tailOffset < fileSize && !moovFound) {
|
|
264
|
+
const end = Math.min(tailOffset + chunkSize - 1, fileSize - 1);
|
|
265
|
+
const data = await file.getRange(tailOffset, end);
|
|
266
|
+
const ab = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
267
|
+
ab.fileStart = tailOffset;
|
|
268
|
+
mp4.appendBuffer(ab);
|
|
269
|
+
tailOffset = end + 1;
|
|
270
|
+
}
|
|
234
271
|
}
|
|
235
272
|
mp4.flush();
|
|
236
273
|
}
|