From e0a4169bf888bdb9b331d98403f0edb3c1027262 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:29:57 +0200 Subject: [PATCH] Handle missing starting key sample in ISOBMFF --- dev/demux.html | 18 +++++++++--------- src/isobmff/isobmff-demuxer.ts | 6 ++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/dev/demux.html b/dev/demux.html index c9c5fd5..04d1e43 100644 --- a/dev/demux.html +++ b/dev/demux.html @@ -8,15 +8,6 @@ document.body.append(fileInput); fileInput.addEventListener('change', async () => { - const videoUrl = "https://upload.wikimedia.org/wikipedia/commons/5/53/1941._%D0%9A%D0%BE%D0%BD%D1%91%D0%BA-%D0%B3%D0%BE%D1%80%D0%B1%D1%83%D0%BD%D0%BE%D0%BA.webm" - const source = new Mediabunny.UrlSource(videoUrl) - const input = new Mediabunny.Input({ formats: Mediabunny.ALL_FORMATS, source }); - - const videoTrack = await input.getPrimaryVideoTrack(); - - console.log(videoTrack); - - /* const file = fileInput.files[0]; const source = new Mediabunny.BlobSource(file); @@ -25,6 +16,15 @@ source }); + const videoTrack = await input.getPrimaryVideoTrack(); + const sink = new Mediabunny.EncodedPacketSink(videoTrack); + + for await (const packet of sink.packets(undefined, undefined, { verifyKeyPackets: false })) { + console.log(packet); + if (packet.timestamp >= 2.4) break; + } + + /* const audioTrack = await input.getPrimaryAudioTrack(); const sink = new Mediabunny.EncodedPacketSink(audioTrack); diff --git a/src/isobmff/isobmff-demuxer.ts b/src/isobmff/isobmff-demuxer.ts index 20bcf42..80c1dc2 100644 --- a/src/isobmff/isobmff-demuxer.ts +++ b/src/isobmff/isobmff-demuxer.ts @@ -1459,6 +1459,12 @@ export class IsobmffDemuxer extends Demuxer { const sampleIndex = this.metadataReader.readU32() - 1; // Convert to 0-indexed track.sampleTable.keySampleIndices.push(sampleIndex); } + + if (track.sampleTable.keySampleIndices[0] !== 0) { + // Some files don't mark the first sample a key sample, which is basically almost always incorrect. + // Here, we correct for that mistake: + track.sampleTable.keySampleIndices.unshift(0); + } }; break; case 'stsc': {