From 9af3e6eb66bb9cf5dd48762429c673a93529fb40 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Tue, 14 Jan 2025 21:23:37 +0100 Subject: [PATCH] Fix atTimestamps iterator --- dev/demux.html | 36 +++++++++++++++++++++--------------- src/codec.ts | 2 +- src/media-sink.ts | 5 ++++- src/sample.ts | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/dev/demux.html b/dev/demux.html index 3657899..8fd7a01 100644 --- a/dev/demux.html +++ b/dev/demux.html @@ -40,6 +40,15 @@ source }); + const videoTrack = await input.getPrimaryVideoTrack(); + const sink = new Metamuxer.VideoFrameSink(videoTrack); + + for await (const thing of sink.framesAtTimestamps([0.2, 1, 2, 423])) { + console.log(thing) + } + console.log("Done") + + /* //const videoTrack = await input.getPrimaryVideoTrack(); //console.log(await videoTrack.computeSampleStats()); //return; @@ -71,26 +80,22 @@ - /* - for await (const sample of sink.samples()) { - //console.log(sample.timestamp); - //sample.timestamp *= 2; - //console.log(sample); - //console.log(sample) - await sampleSource.digest(sample, { decoderConfig }); - } - */ + //for await (const sample of sink.samples()) { + // //console.log(sample.timestamp); + // //sample.timestamp *= 2; + // //console.log(sample); + // //console.log(sample) + // await sampleSource.digest(sample, { decoderConfig }); + //} for await (const { data, timestamp } of new Metamuxer.AudioDataSink(audioTrack).data()) { //console.log("wow", data.timestamp); //console.log(sample) await audioDataSource.digest(data); } - /* - for await (const sample of new Metamuxer.EncodedVideoSampleSink(videoTrack).samples()) { - //console.log(sample) - await videoSampleSource.digest(sample, { decoderConfig: videoDecoderConfig }); - } - */ + //for await (const sample of new Metamuxer.EncodedVideoSampleSink(videoTrack).samples()) { + // //console.log(sample) + // await videoSampleSource.digest(sample, { decoderConfig: videoDecoderConfig }); + //} await output.finalize(); @@ -107,6 +112,7 @@ download(new Blob([target.buffer]), 'converted.wav'); document.body.textContent = performance.now() - start; + */ /* const input2 = new Metamuxer.Input({ diff --git a/src/codec.ts b/src/codec.ts index 882dadb..ffdd70b 100644 --- a/src/codec.ts +++ b/src/codec.ts @@ -41,7 +41,7 @@ export const AUDIO_CODECS = [ 'vorbis', 'flac', ...PCM_CODECS, -] as const; // TODO add the rest +] as const; /** @public */ export const SUBTITLE_CODECS = ['webvtt'] as const; // TODO add the rest diff --git a/src/media-sink.ts b/src/media-sink.ts index 99dae39..229cc04 100644 --- a/src/media-sink.ts +++ b/src/media-sink.ts @@ -392,7 +392,10 @@ export abstract class BaseMediaFrameSink< } let frameUsed = false; - while (samplesOfInterest.length > 0 && samplesOfInterest[0] === wrappedFrame.sample) { + while ( + samplesOfInterest.length > 0 + && samplesOfInterest[0]!.is(wrappedFrame.sample as EncodedVideoSample & EncodedAudioSample) + ) { pushToQueue(this._duplicateFrame(wrappedFrame)); samplesOfInterest.shift(); frameUsed = true; diff --git a/src/sample.ts b/src/sample.ts index cba8d25..4a53810 100644 --- a/src/sample.ts +++ b/src/sample.ts @@ -42,6 +42,15 @@ export class EncodedVideoSample { }); } + is(otherSample: EncodedVideoSample) { + return ( + this.type === otherSample.type + && this.timestamp === otherSample.timestamp + && this.duration === otherSample.duration + && this.byteLength === otherSample.byteLength + ); + } + static fromEncodedVideoChunk(chunk: EncodedVideoChunk) { if (typeof EncodedVideoChunk === 'undefined') { throw new Error('Your browser does not support EncodedVideoChunk.'); @@ -98,6 +107,15 @@ export class EncodedAudioSample { }); } + is(otherSample: EncodedAudioSample) { + return ( + this.type === otherSample.type + && this.timestamp === otherSample.timestamp + && this.duration === otherSample.duration + && this.byteLength === otherSample.byteLength + ); + } + static fromEncodedAudioChunk(chunk: EncodedAudioChunk) { if (typeof EncodedAudioChunk === 'undefined') { throw new Error('Your browser does not support EncodedAudioChunk.');