mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-09-27 10:53:50 +02:00
Fix MP3 files with initial XING frame not being properly recognized (fixes #294)
This commit is contained in:
Generated
+6
-6
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mediabunny",
|
"name": "mediabunny",
|
||||||
"version": "1.31.0",
|
"version": "1.31.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mediabunny",
|
"name": "mediabunny",
|
||||||
"version": "1.31.0",
|
"version": "1.31.1",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/*"
|
"packages/*"
|
||||||
@@ -7739,9 +7739,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mediabunny": {
|
"node_modules/mediabunny": {
|
||||||
"version": "1.30.1",
|
"version": "1.31.0",
|
||||||
"resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.30.1.tgz",
|
"resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.31.0.tgz",
|
||||||
"integrity": "sha512-FRmQAUoRqYoSd84mBKK0A4HVYEJWHhnqw6gM88mPsVfsm0ki5OG008v35yHsiEh1YcXj06d4ZkPrU0VFgUb9Og==",
|
"integrity": "sha512-nqM+6cOpNC/aDxCAZKnZe7oXnGaCn4rlgprzAmiH6C8GRdOHFnB6bZC0+WXGTT6mtAxXQd+BXuZ2q2zkma7dWg==",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"peer": true,
|
"peer": true,
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
@@ -12065,7 +12065,7 @@
|
|||||||
},
|
},
|
||||||
"packages/mp3-encoder": {
|
"packages/mp3-encoder": {
|
||||||
"name": "@mediabunny/mp3-encoder",
|
"name": "@mediabunny/mp3-encoder",
|
||||||
"version": "1.31.0",
|
"version": "1.31.1",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/emscripten": "^1.40.1"
|
"@types/emscripten": "^1.40.1"
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "mediabunny",
|
"name": "mediabunny",
|
||||||
"author": "Vanilagy",
|
"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.",
|
"description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@mediabunny/mp3-encoder",
|
"name": "@mediabunny/mp3-encoder",
|
||||||
"author": "Vanilagy",
|
"author": "Vanilagy",
|
||||||
"version": "1.31.0",
|
"version": "1.31.1",
|
||||||
"description": "MP3 encoder extension for Mediabunny, based on LAME.",
|
"description": "MP3 encoder extension for Mediabunny, based on LAME.",
|
||||||
"main": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
"main": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
||||||
"module": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
"module": "./dist/bundles/mediabunny-mp3-encoder.mjs",
|
||||||
|
|||||||
+17
-7
@@ -21,14 +21,14 @@ import {
|
|||||||
} from './matroska/ebml';
|
} from './matroska/ebml';
|
||||||
import { MatroskaDemuxer } from './matroska/matroska-demuxer';
|
import { MatroskaDemuxer } from './matroska/matroska-demuxer';
|
||||||
import { Mp3Demuxer } from './mp3/mp3-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 { ID3_V2_HEADER_SIZE, readId3V2Header } from './id3';
|
||||||
import { readNextMp3FrameHeader } from './mp3/mp3-reader';
|
import { readNextMp3FrameHeader } from './mp3/mp3-reader';
|
||||||
import { OggDemuxer } from './ogg/ogg-demuxer';
|
import { OggDemuxer } from './ogg/ogg-demuxer';
|
||||||
import { WaveDemuxer } from './wave/wave-demuxer';
|
import { WaveDemuxer } from './wave/wave-demuxer';
|
||||||
import { MAX_ADTS_FRAME_HEADER_SIZE, MIN_ADTS_FRAME_HEADER_SIZE, readAdtsFrameHeader } from './adts/adts-reader';
|
import { MAX_ADTS_FRAME_HEADER_SIZE, MIN_ADTS_FRAME_HEADER_SIZE, readAdtsFrameHeader } from './adts/adts-reader';
|
||||||
import { AdtsDemuxer } from './adts/adts-demuxer';
|
import { AdtsDemuxer } from './adts/adts-demuxer';
|
||||||
import { readAscii, readBytes } from './reader';
|
import { readAscii, readBytes, readU32Be } from './reader';
|
||||||
import { FlacDemuxer } from './flac/flac-demuxer';
|
import { FlacDemuxer } from './flac/flac-demuxer';
|
||||||
import { MpegTsDemuxer } from './mpeg-ts/mpeg-ts-demuxer';
|
import { MpegTsDemuxer } from './mpeg-ts/mpeg-ts-demuxer';
|
||||||
import { TS_PACKET_SIZE } from './mpeg-ts/mpeg-ts-misc';
|
import { TS_PACKET_SIZE } from './mpeg-ts/mpeg-ts-misc';
|
||||||
@@ -261,10 +261,6 @@ export class WebMInputFormat extends MatroskaInputFormat {
|
|||||||
export class Mp3InputFormat extends InputFormat {
|
export class Mp3InputFormat extends InputFormat {
|
||||||
/** @internal */
|
/** @internal */
|
||||||
async _canReadInput(input: Input) {
|
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;
|
let currentPos = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -285,6 +281,21 @@ export class Mp3InputFormat extends InputFormat {
|
|||||||
return false;
|
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;
|
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
|
// 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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const firstHeader = firstResult.header;
|
|
||||||
const secondHeader = secondResult.header;
|
const secondHeader = secondResult.header;
|
||||||
|
|
||||||
// In a well-formed MP3 file, we'd expect these two frames to share some similarities:
|
// In a well-formed MP3 file, we'd expect these two frames to share some similarities:
|
||||||
|
|||||||
Reference in New Issue
Block a user