🔧

Remotion内部アーキテクチャ — フレームをビデオに変換するパイプライン

Headless Chrome → スクリーンショット → FFmpegエンコーディングまでのレンダリングパイプライン解剖

RemotionがReactコードをビデオに変換する過程はWeb技術の創造的な活用です。

まずWebpackまたはesbuildがReactコンポーネントをブラウザ実行可能なバンドルにビルドします。このバンドルにはビデオのメタデータ(fps、解像度、総フレーム数)が含まれます。

次にPuppeteerがHeadless Chromeを起動し、バンドルされたページをロードした後、フレーム番号を0から最後まで順次変更しながら各フレームをPNG/JPEGでスクリーンショットします。delayRender()/continueRender() APIで非同期データロード(API呼び出し、フォントロードなど)が完了するまでスクリーンショットを遅延させることができます。

最後にFFmpegがイメージシーケンスを受け取りH.264(MP4)またはVP8/VP9(WebM)にエンコードします。オーディオトラックがあれば一緒にmuxします。

マルチスレッドレンダリングもサポートしています。--concurrencyオプションで複数のChromeインスタンスを同時実行しフレームを分散処理できます。

動作フロー

1

Webpack/esbuildがReactコンポーネント + メタデータ(fps、width、height、durationInFrames)をバンドル

2

PuppeteerがHeadless Chromeインスタンスを起動しバンドルされたHTMLページをロード

3

フレーム0からNまで巡回しcurrentFrameを注入 → React再レンダリング → スクリーンショット(PNG/JPEG)

4

delayRender()がアクティブな場合continueRender()呼び出しまでスクリーンショットを待機(非同期安全)

5

FFmpegがイメージシーケンス + オーディオトラックをH.264/VP9でエンコードし最終MP4/WebMを出力

メリット

  • Web標準技術のみ使用: Chrome + FFmpegという実証済みの組み合わせ
  • CSS/SVG/Canvas/WebGLなどブラウザがレンダリングできるすべてがビデオフレームになる
  • delayRenderで非同期データ完了を保証 → データ駆動ビデオでの空フレーム防止

デメリット

  • Chrome依存: Headless Chromeがない環境ではレンダリング不可
  • メモリ使用量: フルHDフレームをメモリに保持するため長いビデオはRAM消費が大きい
  • デバッグの複雑さ: レンダリングエラーがPuppeteer/Chrome/FFmpegのどこで発生したか特定が困難

ユースケース

Remotionレンダリングパイプラインのボトルネック診断と最適化 CI/CDでのレンダリング自動化時のリソース(CPU/メモリ)見積もり Lambdaレンダリング vs ローカルレンダリングの選択基準の理解