UNPKG

@omnimedia/omnitool

Version:

open source video processing tools

107 lines (106 loc) 2.85 kB
import { TextStyleOptions } from "pixi.js"; import { AsSchematic } from "@e280/comrade"; import type { AudioEncodingConfig, StreamTargetChunk, VideoEncodingConfig } from "mediabunny"; import { Id } from "../../timeline/index.js"; import { Crop } from "../../timeline/parts/item.js"; import { Mat6 } from "../../timeline/utils/matrix.js"; import { FilterParams, FilterType } from "../../timeline/parts/filters.js"; import { TransitionName } from "../../timeline/parts/transitions.js"; export type DriverSchematic = AsSchematic<{ work: { hello(): Promise<void>; decodeAudio(input: { source: DecoderSource; cancel: MessagePort; audio: WritableStream<AudioData>; start?: number; end?: number; }): Promise<void>; decodeVideo(input: { source: DecoderSource; cancel: MessagePort; video: WritableStream<VideoFrame>; start?: number; end?: number; }): Promise<void>; encode(input: EncoderInput & { writable: WritableStream<StreamTargetChunk>; }): Promise<void>; }; host: { world(): Promise<void>; }; }>; export interface EncoderInput { video?: ReadableStream<VideoFrame>; audio?: ReadableStream<AudioData>; config: RenderConfig; } export interface RenderConfig { video: VideoEncodingConfig; audio: AudioEncodingConfig; } export type DecoderSource = Blob | string | URL; export interface DecoderInput { source: DecoderSource; start?: number; end?: number; onFrame?: (frame: VideoFrame) => Promise<VideoFrame>; } export interface MuxOpts { config: { video: { width: number; height: number; }; audio?: { codec: "opus" | "aac"; numberOfChannels: number; sampleRate: number; }; }; } export type Composition = Layer | (Layer | Composition)[]; export type FilterSpec = { [TFilter in FilterType]: { type: TFilter; params?: FilterParams<TFilter>; }; }[FilterType]; export type TextLayer = { id: Id; kind: 'text'; content: string; style?: TextStyleOptions; matrix?: Mat6; alpha?: number; crop?: Crop; filters?: FilterSpec[]; }; export type ImageLayer = { id: Id; kind: 'image'; frame: VideoFrame; matrix?: Mat6; alpha?: number; crop?: Crop; filters?: FilterSpec[]; }; export type TransitionLayer = { id: Id; kind: 'transition'; name: TransitionName; progress: number; from: ImageLayer; to: ImageLayer; }; export type GapLayer = { id: Id; kind: 'gap'; }; export type Audio = { id: Id; kind: "audio"; data: AudioData; }; export type Layer = TextLayer | ImageLayer | TransitionLayer | GapLayer;