From 6da8556f1316b2c80f570ebe4ec1e988ade5fcf5 Mon Sep 17 00:00:00 2001 From: lonelyhentxi Date: Tue, 18 Mar 2025 06:44:58 +0800 Subject: [PATCH] fix: fix --- apps/playground/src/media/mkv/model.ts | 7 ++++++- apps/playground/src/video-pipeline-demo.ts | 24 ++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/apps/playground/src/media/mkv/model.ts b/apps/playground/src/media/mkv/model.ts index 0fb0b46..c78106a 100644 --- a/apps/playground/src/media/mkv/model.ts +++ b/apps/playground/src/media/mkv/model.ts @@ -60,9 +60,14 @@ export class EbmlSegment { .filter((c): c is EbmlSeekEntry => !!c); } + findSeekPositionBySeekId(seekId: Uint8Array): number | undefined { + return this.seekEntries.find((c) => isEqual(c.seekId, seekId)) + ?.seekPosition; + } + findLocalNodeBySeekId(seekId: Uint8Array): EbmlTagType | undefined { return this.findLocalNodeBySeekPosition( - this.seekEntries.find((c) => isEqual(c.seekId, seekId))?.seekPosition + this.findSeekPositionBySeekId(seekId) ); } diff --git a/apps/playground/src/video-pipeline-demo.ts b/apps/playground/src/video-pipeline-demo.ts index fbd47d8..b48c584 100644 --- a/apps/playground/src/video-pipeline-demo.ts +++ b/apps/playground/src/video-pipeline-demo.ts @@ -17,6 +17,7 @@ import { Observable, of, reduce, + scan, share, Subject, type Subscription, @@ -156,8 +157,7 @@ export class VideoPipelineDemo extends LitElement { s.cuesNode ? Number.NaN : s.dataOffset + - (s.seekEntries.find((e) => e.seekId === SEEK_ID_KAX_CUES) - ?.seekPosition ?? Number.NaN) + (s.findSeekPositionBySeekId(SEEK_ID_KAX_CUES) ?? Number.NaN) ), filter((cuesStartOffset) => cuesStartOffset >= 0), switchMap((cuesStartOffset) => @@ -172,7 +172,8 @@ export class VideoPipelineDemo extends LitElement { map(([cues, withMeta]) => { withMeta.cuesNode = cues; return withMeta; - }) + }), + share() ); const withLocalCues$ = withMeta$.pipe(filter((s) => !!s.cuesNode)); @@ -191,7 +192,22 @@ export class VideoPipelineDemo extends LitElement { if (seekTime === 0) { return cluster$; } - return cluster$.pipe(filter((c) => c.timestamp >= seekTime)); + + return cluster$.pipe( + scan( + (prev, curr) => + [prev?.[1], curr] as [ + EbmlCluster | undefined, + EbmlCluster | undefined, + ], + [undefined, undefined] as [ + EbmlCluster | undefined, + EbmlCluster | undefined, + ] + ), + filter((c) => c[1]?.timestamp! >= seekTime), + map((c) => c[1]!) + ); }; const seekWithCues = (