From 152002bd5d8a0935024ec6c83983998ad0e368c7 Mon Sep 17 00:00:00 2001 From: Igor Samokhovets Date: Thu, 26 Feb 2026 21:48:11 +0100 Subject: [PATCH 1/2] fix(isobmff): write QuickTime-compliant MOV AAC sample entry (#311) * fix(isobmff): write QuickTime-compliant MOV AAC sample entry * Clean up logic, only version 1 sample description box was needed, remove bloaty tests --------- Co-authored-by: Vanilagy <1696106+Vanilagy@users.noreply.github.com> --- src/isobmff/isobmff-boxes.ts | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/isobmff/isobmff-boxes.ts b/src/isobmff/isobmff-boxes.ts index c2952dd..040f00b 100644 --- a/src/isobmff/isobmff-boxes.ts +++ b/src/isobmff/isobmff-boxes.ts @@ -726,9 +726,10 @@ export const soundSampleDescription = ( ) => { let version = 0; let contents: NestedNumberArray; - let sampleSizeInBits = 16; - if ((PCM_AUDIO_CODECS as readonly AudioCodec[]).includes(trackData.track.source._codec)) { + + const isPcmCodec = (PCM_AUDIO_CODECS as readonly AudioCodec[]).includes(trackData.track.source._codec); + if (isPcmCodec) { const codec = trackData.track.source._codec as PcmAudioCodec; const { sampleSize } = parsePcmCodec(codec); sampleSizeInBits = 8 * sampleSize; @@ -738,6 +739,10 @@ export const soundSampleDescription = ( } } + if (trackData.muxer.isQuickTime) { + version = 1; + } + if (version === 0) { contents = [ Array(6).fill(0), // Reserved @@ -753,6 +758,8 @@ export const soundSampleDescription = ( u16(0), // Sample rate (lower) ]; } else { + const compressionId = isPcmCodec ? 0 : -2; + contents = [ Array(6).fill(0), // Reserved u16(1), // Data reference index @@ -761,13 +768,21 @@ export const soundSampleDescription = ( u32(0), // Vendor u16(trackData.info.numberOfChannels), // Number of channels u16(Math.min(sampleSizeInBits, 16)), // Sample size (bits) - u16(0), // Compression ID + i16(compressionId), // Compression ID u16(0), // Packet size u16(trackData.info.sampleRate < 2 ** 16 ? trackData.info.sampleRate : 0), // Sample rate (upper) u16(0), // Sample rate (lower) - u32(1), // Samples per packet (must be 1 for uncompressed formats) - u32(sampleSizeInBits / 8), // Bytes per packet - u32(trackData.info.numberOfChannels * sampleSizeInBits / 8), // Bytes per frame + isPcmCodec + ? [ + u32(1), // Samples per packet (must be 1 for uncompressed formats) + u32(sampleSizeInBits / 8), // Bytes per packet + u32(trackData.info.numberOfChannels * sampleSizeInBits / 8), // Bytes per frame + ] + : [ + u32(0), // Samples per packet (don't bother, still works with 0) + u32(0), // Bytes per packet (variable) + u32(0), // Bytes per frame (variable) + ], u32(2), // Bytes per sample (constant in FFmpeg) ]; } From 76e0703b13bf96fb1636dfe5999684b0e9b615a5 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:48:36 +0100 Subject: [PATCH 2/2] Bump patch --- package-lock.json | 14 +++++++------- package.json | 2 +- packages/ac3/package.json | 2 +- packages/mp3-encoder/package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57c2cdd..7fb6a76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mediabunny", - "version": "1.35.0", + "version": "1.35.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mediabunny", - "version": "1.35.0", + "version": "1.35.1", "license": "MPL-2.0", "workspaces": [ "packages/*" @@ -7743,9 +7743,9 @@ } }, "node_modules/mediabunny": { - "version": "1.34.5", - "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.34.5.tgz", - "integrity": "sha512-Hs31rd+ane6GQJClM77KfNnf49DenK7yRU9MC4JeHwpNIFCSww/XUoGyKleAVrylw6Snrep2Sm+BhD2CS5ARkg==", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.35.0.tgz", + "integrity": "sha512-nDCwdkK9aWDam1+L/VnK2EWzENj5WcPAAmm6HBTXQe5FZ/Mx7uSJewTKeA1JKXpkXvSsp+7UzTsx+G7HfcwOGA==", "license": "MPL-2.0", "peer": true, "workspaces": [ @@ -12069,7 +12069,7 @@ }, "packages/ac3": { "name": "@mediabunny/ac3", - "version": "1.35.0", + "version": "1.35.1", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" @@ -12084,7 +12084,7 @@ }, "packages/mp3-encoder": { "name": "@mediabunny/mp3-encoder", - "version": "1.35.0", + "version": "1.35.1", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" diff --git a/package.json b/package.json index f4cdf84..15fe549 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mediabunny", "author": "Vanilagy", - "version": "1.35.0", + "version": "1.35.1", "description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.", "type": "module", "workspaces": [ diff --git a/packages/ac3/package.json b/packages/ac3/package.json index 35a3339..c53f57c 100644 --- a/packages/ac3/package.json +++ b/packages/ac3/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/ac3", "author": "Vanilagy", - "version": "1.35.0", + "version": "1.35.1", "description": "AC-3 and E-AC-3 (Dolby Digital) decoder and encoder extension for Mediabunny, based on FFmpeg.", "main": "./dist/bundles/mediabunny-ac3.mjs", "module": "./dist/bundles/mediabunny-ac3.mjs", diff --git a/packages/mp3-encoder/package.json b/packages/mp3-encoder/package.json index cbe3af7..c0f3e7c 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.35.0", + "version": "1.35.1", "description": "MP3 encoder extension for Mediabunny, based on LAME.", "main": "./dist/bundles/mediabunny-mp3-encoder.mjs", "module": "./dist/bundles/mediabunny-mp3-encoder.mjs",