UNPKG

ts-ebml-esm

Version:
123 lines (122 loc) 4.14 kB
import { EventEmitter } from 'events'; import * as EBML from "./EBML.js"; /** * This is an informal code for reference. * EBMLReader is a class for getting information to enable seeking Webm recorded by MediaRecorder. * So please do not use for regular WebM files. */ export default class EBMLReader extends EventEmitter { private metadataloaded; private stack; private chunks; private segmentOffset; private last2SimpleBlockVideoTrackTimestamp; private last2SimpleBlockAudioTrackTimestamp; private lastClusterTimestamp; private lastClusterPosition; private firstVideoBlockRead; private firstAudioBlockRead; timestampScale: number; metadataSize: number; metadatas: EBML.EBMLElementDetail[]; private currentTrack; private trackTypes; private trackDefaultDuration; private trackCodecDelay; private ended; trackInfo: { type: "video" | "audio" | "both"; trackNumber: number; } | { type: "nothing"; }; /** * usefull for thumbnail creation. */ use_webp: boolean; /** Enabling this flag will slow down the operation */ use_duration_every_simpleblock: boolean; logging: boolean; logGroup: string; private hasLoggingStarted; /** * usefull for recording chunks. */ use_segment_info: boolean; /** see: https://bugs.chromium.org/p/chromium/issues/detail?id=606000#c22 */ drop_default_duration: boolean; cues: { CueTrack: number; CueClusterPosition: number; CueTime: number; }[]; constructor(); /** * emit final state. */ stop(): void; /** * emit chunk info */ private emit_segment_info; read(elm: EBML.EBMLElementDetail): void; /** * DefaultDuration が定義されている場合は最後のフレームのdurationも考慮する * 単位 timestampScale * * !!! if you need duration with seconds !!! * ```js * const nanosec = reader.duration * reader.timestampScale; * const sec = nanosec / 1000 / 1000 / 1000; * ``` */ get duration(): number; /** * @deprecated * emit on every segment * https://www.matroska.org/technical/specs/notes.html#Position_References */ addListener(event: "segment_offset", listener: (ev: number) => void): this; /** * @deprecated * emit on every cluster element start. * Offset byte from __file start__. It is not an offset from the Segment element. */ addListener(event: "cluster_ptr", listener: (ev: number) => void): this; /** @deprecated * emit on every cue point for cluster to create seekable webm file from MediaRecorder * */ addListener(event: "cue_info", listener: (ev: CueInfo) => void): this; /** emit on every cue point for cluster to create seekable webm file from MediaRecorder */ addListener(event: "cue", listener: (ev: CueInfo) => void): this; /** latest EBML > Info > TimestampScale and EBML > Info > Duration to create seekable webm file from MediaRecorder */ addListener(event: "duration", listener: (ev: DurationInfo) => void): this; /** EBML header without Cluster Element for recording metadata chunk */ addListener(event: "metadata", listener: (ev: SegmentInfo & { metadataSize: number; }) => void): this; /** emit every Cluster Element and its children for recording chunk */ addListener(event: "cluster", listener: (ev: SegmentInfo & { timestamp: number; }) => void): this; /** for thumbnail */ addListener(event: "webp", listener: (ev: ThumbnailInfo) => void): this; put(elm: EBML.EBMLElementDetail): void; } /** CueClusterPosition: Offset byte from __file start__. It is not an offset from the Segment element. */ export interface CueInfo { CueTrack: number; CueClusterPosition: number; CueTime: number; } export interface SegmentInfo { data: EBML.EBMLElementDetail[]; } export interface DurationInfo { duration: number; timestampScale: number; } export interface ThumbnailInfo { webp: Blob; currentTime: number; }