Remotion で自作ツールの紹介動画を React コンポーネントで作った

背景

Remotion という、React コンポーネントで動画を生成できるフレームワークを知りました。ちょうど自作の HTTP/HTTPS プロキシツール Mimicry の紹介動画がほしいと思っていたので、試しに使ってみることにしました。

今回は Claude Code に「Mimicry の紹介ポイントを調査して、Remotion で紹介動画を作って」と依頼するだけで動画を生成できました。テキストの修正や構成の調整もコードの変更だけで済むので、画面収録より手軽です。

Remotion の概要

Remotion は React コンポーネントを使って動画を生成するフレームワークです。

通常の React アプリと同じように JSX でレイアウトを組み、useCurrentFrame() で現在のフレーム番号を取得してアニメーションを制御します。開発中は Remotion Studio というブラウザベースのプレビュー環境でリアルタイムに確認でき、完成したら npx remotion render で MP4 に書き出せます。

コードで管理できるので Git で差分管理もできます。After Effects のようなタイムラインを操作する必要はありません。

プロジェクトのセットアップ

Remotion の空テンプレートからプロジェクトを作成しました。

npx degit remotion-dev/template-empty mimicry-video
cd mimicry-video
npm install

開発中のプレビューは npm run dev で Remotion Studio を起動します。ブラウザ上でシークバーを動かしながらアニメーションを確認できるので、フィードバックループが速いです。

Remotion Studio のプレビュー画面。タイムライン上で各シーンの配置を確認しながら動画を編集できる

共通コンポーネント

シーン間で使い回すアニメーションコンポーネントをいくつか用意しました。

FadeIn

フェードイン + スライドアニメーションを行うコンポーネントです。direction props で上下左右のスライド方向を指定できます。

export const FadeIn: React.FC<{
  children: ReactNode;
  delay?: number;
  duration?: number;
  direction?: "up" | "down" | "left" | "right" | "none";
}> = ({ children, delay = 0, duration = 20, direction = "up" }) => {
  const frame = useCurrentFrame();
  const opacity = interpolate(frame - delay, [0, duration], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });
  // ...
};

interpolate() は Remotion の中核的な関数で、フレーム数をアニメーション値に変換してくれます。この例だと「delay フレーム経過後の duration フレームで opacity を 0 から 1 に変化させる」という意味です。extrapolateLeft/Right: 'clamp' を付けておくと、範囲外の値がクランプされます。

TypeWriter

テキストを 1 文字ずつ表示するタイプライターエフェクトです。フレーム数に応じて表示する文字数を増やしているだけのシンプルな実装ですが、動画にリズムが出ます。

CodeBlock

コードブロックを行ごとにフェードインで表示するコンポーネントです。セットアップ手順やコマンド例を見せるシーンで使っています。

SceneTransition

シーン間のクロスフェードを実現するラッパーコンポーネントです。

シーンのタイムライン管理

Remotion の Sequence コンポーネントを使うと、各シーンの開始フレームと長さを宣言的に管理できます。今回はシーンの定義を配列にまとめて map で展開する形にしました。

const scenes = [
  { duration: 120, Component: Opening },
  { duration: 150, Component: ProblemStatement },
  { duration: 120, Component: SetupDemo },
  // ...
];

export const MyComposition: React.FC = () => {
  let offset = 0;
  return (
    <AbsoluteFill style={{ background: colors.bg }}>
      {scenes.map(({ duration, Component }, i) => {
        const from = offset;
        offset += duration;
        return (
          <Sequence key={i} from={from} durationInFrames={duration}>
            <SceneTransition durationInFrames={duration}>
              <Component />
            </SceneTransition>
          </Sequence>
        );
      })}
    </AbsoluteFill>
  );
};

シーンの追加や順序変更は配列を編集するだけです。各シーンの duration はフレーム数で指定し、30fps なので 120 は 4 秒になります。

スタイリング

VS Code にインスパイアされたダークテーマのカラーパレットを定義して、全シーンで統一した見た目にしました。

export const colors = {
  bg: "#1e1e1e",
  bgLight: "#252526",
  text: "#d4d4d4",
  accent: "#0e639c",
  success: "#4ec9b0",
  error: "#f14c4c",
  // ...
};

プロジェクト構成

最終的なディレクトリ構成はこのようになりました。

mimicry-video/
  src/
    styles.ts           カラーパレット + フォント定義
    Composition.tsx     シーン構成 + トランジション
    Root.tsx            Composition 定義(解像度・fps など)
    components/         共通コンポーネント(FadeIn, TypeWriter など)
    scenes/             各シーン(Opening, Problem, Setup ...)
  public/
    mimicry-icon.png    アプリアイコン

動画の書き出し

完成したら 1 コマンドで MP4 に書き出せます。

npx remotion render MimicryIntro out/mimicry-intro.mp4

書き出しにかかった時間は数十秒程度でした。テキストを微修正して再レンダリング、という繰り返しが気軽にできます。

やってみた感想

今回は Claude Code に「Mimicry の紹介すべきポイントを調査して Remotion で紹介動画を作って」と依頼しました。プロジェクトの機能調査からシーン構成の設計、コンポーネントの実装、MP4 の書き出しまで一気にやってくれたので、手軽でした。日本語への変更やインストールコマンドの修正といった細かい調整も、コードの変更だけで済みます。

凝った映像表現やカメラワークが必要な動画には向いていませんが、プロダクト紹介動画やテキストベースのモーショングラフィックスにはぴったりだと感じました。

まとめ

Remotion を使うと React コンポーネントで動画を作れます。プロダクトの紹介動画やデモ動画を作る機会がある方は試してみてください。

参考リンク