Add metadata-based duration retrieval

This commit is contained in:
Vanilagy
2026-03-13 17:03:36 +01:00
parent c43ca025d9
commit a9a455e132
23 changed files with 517 additions and 49 deletions
+25
View File
@@ -30,6 +30,7 @@ export const INFO = 0x496e666f;
export type Mp3FrameHeader = {
totalSize: number;
mpegVersionId: number;
lowSamplingFrequency: number;
layer: number;
bitrate: number;
frequencyIndex: number;
@@ -60,6 +61,23 @@ export const computeMp3FrameSize = (
}
};
export const computeAverageMp3FrameSize = (
lowSamplingFrequency: number,
layer: number,
bitrate: number,
sampleRate: number,
) => {
if (layer === 0) {
return 0; // Not expected that this is hit
} else if (layer === 1) {
return 144 * bitrate / (sampleRate << lowSamplingFrequency);
} else if (layer === 2) {
return 144 * bitrate / sampleRate;
} else { // layer === 3
return (12 * bitrate / sampleRate) * 4;
}
};
export const getXingOffset = (mpegVersionId: number, channel: number) => {
return mpegVersionId === 3
? (channel === 3 ? 21 : 36)
@@ -144,6 +162,7 @@ export const readMp3FrameHeader = (word: number, remainingBytes: number | null):
header: {
totalSize: frameLength,
mpegVersionId,
lowSamplingFrequency,
layer,
bitrate,
frequencyIndex,
@@ -187,3 +206,9 @@ export const decodeSynchsafe = (synchsafed: number) => {
return unsynchsafed;
};
export enum XingFlags {
FrameCount = 1 << 0,
FileSize = 1 << 1,
Toc = 1 << 2,
}