ts-ebml-esm
Version:
ebml decoder and encoder
123 lines (122 loc) • 4.14 kB
TypeScript
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;
}