--- name: helios-renderer description: Renderer API for generating video/image output from Helios compositions. Use when you need to programmatically render a composition to a file using Node.js. --- # Helios Renderer API The `Renderer` class enables headless rendering of Helios compositions using Playwright and FFmpeg. It supports both DOM-based and Canvas-based rendering strategies. ## Quick Start ```typescript import { Renderer } from '@helios-project/renderer'; const renderer = new Renderer({ width: 1920, height: 1080, fps: 30, durationInSeconds: 10, mode: 'canvas', // or 'dom' inputProps: { title: "Render Job 1" } }); await renderer.render( 'http://localhost:3000/composition.html', './output.mp4', { onProgress: (progress) => console.log(`Rendering: ${(progress * 100).toFixed(1)}%`) } ); ``` ## API Reference ### Constructor ```typescript new Renderer(options: RendererOptions) interface RendererOptions { width: number; // Output width height: number; // Output height fps: number; // Frames per second durationInSeconds: number; // Duration of the clip frameCount?: number; // Exact total frames (overrides durationInSeconds) startFrame?: number; // Frame to start rendering from (default: 0) mode?: 'dom' | 'canvas'; // Rendering strategy (default: 'canvas') inputProps?: Record; // Inject props into window.__HELIOS_PROPS__ // Audio Configuration audioFilePath?: string; // Path to single audio file audioTracks?: (string | AudioTrackConfig)[]; // List of audio tracks audioCodec?: string; // e.g., 'aac', 'libvorbis' audioBitrate?: string; // e.g., '128k', '192k' // Video Encoding videoCodec?: string; // e.g., 'libx264' (default, prioritized), 'libvpx' pixelFormat?: string; // e.g., 'yuv420p' (default) crf?: number; // Constant Rate Factor (quality control) preset?: string; // Encoding preset (e.g., 'fast') videoBitrate?: string; // e.g., '5M', '1000k' subtitles?: boolean; // Burn subtitles into video (requires libx264) // Intermediate Capture (Canvas Mode) intermediateVideoCodec?: string; // 'vp8' (default), 'vp9', 'av1' // Intermediate Capture (DOM Mode) intermediateImageFormat?: 'png' | 'jpeg'; // Default: 'png' intermediateImageQuality?: number; // 0-100 (only for jpeg) // System ffmpegPath?: string; // Custom FFmpeg binary path browserConfig?: { // Playwright Launch Options headless?: boolean; executablePath?: string; args?: string[]; }; } interface AudioTrackConfig { path: string; volume?: number; // 0.0 to 1.0 offset?: number; // Start time in composition (seconds) seek?: number; // Start time in source file (seconds) playbackRate?: number; // Speed multiplier (default: 1.0) } ``` ### Methods #### Render Renders the composition at the given URL to a video file. ```typescript async render( compositionUrl: string, outputPath: string, jobOptions?: RenderJobOptions ): Promise interface RenderJobOptions { onProgress?: (progress: number) => void; // Callback 0.0 to 1.0 signal?: AbortSignal; // For cancellation tracePath?: string; // Path to save Playwright trace (for debugging) } ``` #### Diagnose Check the rendering environment (Playwright, WebCodecs support, FFmpeg). ```typescript // Returns a comprehensive diagnostic report const diagnostics = await renderer.diagnose(); /* { browser: { waapi: boolean, webCodecs: boolean, offscreenCanvas: boolean, userAgent: string }, ffmpeg: { version: string, encoders: string[], filters: string[] } } */ ``` ## Rendering Modes ### Canvas Mode (`mode: 'canvas'`) - **Best for:** WebGL, Three.js, Pixi.js, 2D Canvas. - **Mechanism:** Uses `CdpTimeDriver` to control time and `CanvasStrategy` to capture the canvas context directly. - **Performance:** High. Fast capture via CDP. - **Sync:** Uses `TreeWalker` to recursively discover and sync media in Shadow DOMs. ### DOM Mode (`mode: 'dom'`) - **Best for:** CSS Animations, HTML/DOM elements, complex video/audio compositions. - **Mechanism:** Uses `SeekTimeDriver` (seek & screenshot) to ensure DOM layouts settle. - **Performance:** Slower than Canvas mode due to full-page screenshots. - **Implicit Audio:** Automatically discovers `