diff --git a/package-lock.json b/package-lock.json index 2a64c6d..44cfa89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mediabunny", - "version": "1.31.0", + "version": "1.31.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mediabunny", - "version": "1.31.0", + "version": "1.31.1", "license": "MPL-2.0", "workspaces": [ "packages/*" @@ -7739,9 +7739,9 @@ } }, "node_modules/mediabunny": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.30.1.tgz", - "integrity": "sha512-FRmQAUoRqYoSd84mBKK0A4HVYEJWHhnqw6gM88mPsVfsm0ki5OG008v35yHsiEh1YcXj06d4ZkPrU0VFgUb9Og==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.31.0.tgz", + "integrity": "sha512-nqM+6cOpNC/aDxCAZKnZe7oXnGaCn4rlgprzAmiH6C8GRdOHFnB6bZC0+WXGTT6mtAxXQd+BXuZ2q2zkma7dWg==", "license": "MPL-2.0", "peer": true, "workspaces": [ @@ -12065,7 +12065,7 @@ }, "packages/mp3-encoder": { "name": "@mediabunny/mp3-encoder", - "version": "1.31.0", + "version": "1.31.1", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" diff --git a/package.json b/package.json index a1aa3ae..5bb2070 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mediabunny", "author": "Vanilagy", - "version": "1.31.0", + "version": "1.31.1", "description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.", "type": "module", "workspaces": [ diff --git a/packages/mp3-encoder/package.json b/packages/mp3-encoder/package.json index bbcde74..3410481 100644 --- a/packages/mp3-encoder/package.json +++ b/packages/mp3-encoder/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/mp3-encoder", "author": "Vanilagy", - "version": "1.31.0", + "version": "1.31.1", "description": "MP3 encoder extension for Mediabunny, based on LAME.", "main": "./dist/bundles/mediabunny-mp3-encoder.mjs", "module": "./dist/bundles/mediabunny-mp3-encoder.mjs", diff --git a/src/input-format.ts b/src/input-format.ts index f5c52e9..ed09428 100644 --- a/src/input-format.ts +++ b/src/input-format.ts @@ -21,14 +21,14 @@ import { } from './matroska/ebml'; import { MatroskaDemuxer } from './matroska/matroska-demuxer'; import { Mp3Demuxer } from './mp3/mp3-demuxer'; -import { FRAME_HEADER_SIZE } from '../shared/mp3-misc'; +import { FRAME_HEADER_SIZE, getXingOffset, INFO, XING } from '../shared/mp3-misc'; import { ID3_V2_HEADER_SIZE, readId3V2Header } from './id3'; import { readNextMp3FrameHeader } from './mp3/mp3-reader'; import { OggDemuxer } from './ogg/ogg-demuxer'; import { WaveDemuxer } from './wave/wave-demuxer'; import { MAX_ADTS_FRAME_HEADER_SIZE, MIN_ADTS_FRAME_HEADER_SIZE, readAdtsFrameHeader } from './adts/adts-reader'; import { AdtsDemuxer } from './adts/adts-demuxer'; -import { readAscii, readBytes } from './reader'; +import { readAscii, readBytes, readU32Be } from './reader'; import { FlacDemuxer } from './flac/flac-demuxer'; import { MpegTsDemuxer } from './mpeg-ts/mpeg-ts-demuxer'; import { TS_PACKET_SIZE } from './mpeg-ts/mpeg-ts-misc'; @@ -261,10 +261,6 @@ export class WebMInputFormat extends MatroskaInputFormat { export class Mp3InputFormat extends InputFormat { /** @internal */ async _canReadInput(input: Input) { - let slice = input._reader.requestSlice(0, 10); - if (slice instanceof Promise) slice = await slice; - if (!slice) return false; - let currentPos = 0; while (true) { @@ -285,6 +281,21 @@ export class Mp3InputFormat extends InputFormat { return false; } + const firstHeader = firstResult.header; + const xingOffset = getXingOffset(firstHeader.mpegVersionId, firstHeader.channel); + + let slice = input._reader.requestSlice(firstResult.startPos + xingOffset, 4); + if (slice instanceof Promise) slice = await slice; + if (!slice) return false; + + const word = readU32Be(slice); + const isXing = word === XING || word === INFO; + + if (isXing) { + // Gotta be MP3 + return true; + } + currentPos = firstResult.startPos + firstResult.header.totalSize; // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find @@ -294,7 +305,6 @@ export class Mp3InputFormat extends InputFormat { return false; } - const firstHeader = firstResult.header; const secondHeader = secondResult.header; // In a well-formed MP3 file, we'd expect these two frames to share some similarities: