/** * Metrics collected from a video element's rendered frames. */ export interface VideoElementFrameMetrics { /** * Current frames per second. */ fps: number; /** * Timestamp of the measurement in milliseconds since epoch. */ timestampMs: number; } /** * Observer for frame-level events on a video element. */ export interface VideoElementFrameObserver { /** * Called when the first video frame is rendered. * @param metadata The VideoFrameCallbackMetadata, if available (only on browsers supporting requestVideoFrameCallback) */ firstVideoElementFrameDidRender?(metadata?: VideoFrameCallbackMetadata): void; /** * Called periodically with render metrics (e.g. FPS). * Only fires on browsers that support requestVideoFrameCallback. * @param metrics The collected metrics */ videoElementFrameMetricsDidReceive?(metrics: VideoElementFrameMetrics): void; } /** * Monitors a video element for first-frame rendering and ongoing FPS metrics. * * Internally uses requestVideoFrameCallback when available (Chrome/Edge) and * falls back to the 'resize' event for first-frame detection on other browsers. * FPS tracking is only available when requestVideoFrameCallback is supported. */ export default class VideoElementFrameMonitor { private static readonly METRICS_INTERVAL_MS; private element; private observer; private firstFrameRendered; private videoFrameCallbackId; private metricsCallbackId; private frameCount; private metricsWindowStartMs; private resizeListener; private get supportsVideoFrameCallback(); /** * Start monitoring the given element with the given observer. * Any previous monitoring is stopped first. */ start(element: HTMLVideoElement, observer: VideoElementFrameObserver): void; /** * Stop monitoring and release all resources. */ stop(): void; private startFirstFrameDetection; private onFirstFrame; private startMetricsTracking; private scheduleMetricsCallback; private stopMetricsTracking; }