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
text/typescript
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 };