UNPKG

webcodecs-encoder

Version:

A TypeScript library for browser environments to encode video (H.264/AVC, VP9, VP8) and audio (AAC, Opus) using the WebCodecs API and mux them into MP4 or WebM containers with real-time streaming support. New function-first API design.

138 lines (134 loc) 4.25 kB
type Frame = VideoFrame | HTMLCanvasElement | OffscreenCanvas | ImageBitmap | ImageData; interface VideoFile { file: File | Blob; type: string; } type VideoSource = Frame[] | AsyncIterable<Frame> | MediaStream | VideoFile; type QualityPreset = 'low' | 'medium' | 'high' | 'lossless'; interface VideoConfig { codec?: 'avc' | 'hevc' | 'vp9' | 'vp8' | 'av1'; bitrate?: number; hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software'; latencyMode?: 'quality' | 'realtime'; keyFrameInterval?: number; } interface AudioConfig { codec?: 'aac' | 'opus'; bitrate?: number; sampleRate?: number; channels?: number; bitrateMode?: 'constant' | 'variable'; } interface ProgressInfo { percent: number; processedFrames: number; totalFrames?: number; fps: number; stage: string; estimatedRemainingMs?: number; } interface EncodeOptions { width?: number; height?: number; frameRate?: number; quality?: QualityPreset; video?: VideoConfig | false; audio?: AudioConfig | false; container?: 'mp4' | 'webm'; firstTimestampBehavior?: "offset" | "strict"; latencyMode?: "quality" | "realtime"; maxVideoQueueSize?: number; maxAudioQueueSize?: number; backpressureStrategy?: "drop" | "wait"; onProgress?: (progress: ProgressInfo) => void; onError?: (error: EncodeError) => void; } type EncodeErrorType = 'not-supported' | 'initialization-failed' | 'configuration-error' | 'invalid-input' | 'encoding-failed' | 'video-encoding-error' | 'audio-encoding-error' | 'muxing-failed' | 'cancelled' | 'timeout' | 'worker-error' | 'filesystem-error' | 'unknown'; declare class EncodeError extends Error { type: EncodeErrorType; cause?: unknown; constructor(type: EncodeErrorType, message: string, cause?: unknown); } /** * カスタムエンコーダーファクトリ */ /** * エンコーダー関数のファクトリ * 設定を事前に部分適用した専用エンコーダー関数を作成 */ interface EncoderFactory { /** * ワンショットエンコード */ encode(source: VideoSource, additionalOptions?: Partial<EncodeOptions>): Promise<Uint8Array>; /** * ストリーミングエンコード */ encodeStream(source: VideoSource, additionalOptions?: Partial<EncodeOptions>): AsyncGenerator<Uint8Array>; /** * 設定された設定を取得 */ getConfig(): EncodeOptions; /** * 新しい設定でファクトリを拡張 */ extend(newOptions: Partial<EncodeOptions>): EncoderFactory; } /** * カスタムエンコーダーファクトリを作成 * * @param baseOptions 基本エンコードオプション * @returns 設定済みエンコーダーファクトリ */ declare function createEncoder(baseOptions?: EncodeOptions): EncoderFactory; /** * 事前定義されたエンコーダーファクトリ */ declare const encoders: { /** * YouTube向け高品質エンコーダー */ youtube: EncoderFactory; /** * Twitter向け最適化エンコーダー */ twitter: EncoderFactory; /** * Discord向け最適化エンコーダー */ discord: EncoderFactory; /** * Web再生向けバランス型エンコーダー */ web: EncoderFactory; /** * 軽量・高速エンコーダー */ fast: EncoderFactory; /** * 高品質・低圧縮エンコーダー */ lossless: EncoderFactory; /** * VP9ストリーミング用エンコーダー */ vp9Stream: EncoderFactory; }; /** * 使用例とヘルパー関数 */ declare const examples: { /** * プラットフォーム別のエンコーダーを取得 */ getEncoderForPlatform(platform: "youtube" | "twitter" | "discord" | "web"): EncoderFactory; /** * 解像度ベースのエンコーダーを作成 */ createByResolution(width: number, height: number): EncoderFactory; /** * ファイルサイズ制約ベースのエンコーダーを作成 */ createForFileSize(targetSizeMB: number, durationSeconds: number): EncoderFactory; }; export { type EncoderFactory, createEncoder, encoders, examples };