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.');