Communitygithub.com

remotion-product-demo

將真實螢幕錄影或截圖轉換成 Remotion 產品展示影片:SaaS 操作導覽、功能示範、入門短片、CLI 或開發工具示範、AI 應用程式展示或 App Store 預覽。使用 Imgcli 的 Remotion 元件(@imgcli/screen-recording、cursor-track、laptop-frame、phone-frame、terminal-simulator、prompt-send、answer-stream、status-cycle),讓鏡頭推進、點擊、設備邊框和輸入指令預先建置,無需手動動畫。觸發詞:product demo、demo video、remotion demo、product walkthrough、feature demo video、screen recording to video、app demo、SaaS demo、CLI demo、「turn my screen recording into a demo video」。

remotion-product-demo 是什麼?

這個名為 `remotion-product-demo` 的技能,旨在將真實的螢幕錄影或螢幕截圖,轉換成專業的產品展示影片。它主要應用於 Remotion 框架,並深度整合了 Imgcli 提供的多個預製 Remotion 元件,例如 `screen-recording`(處理螢幕錄影的相機移動)、`cursor-track`(模擬滑鼠點擊路徑)、`laptop-frame`(筆電邊框)和 `terminal-simulator`(模擬終端機輸入輸出)等。此技能的核心原則是「不發明 UI 標籤」,所有畫面上的文字與數字都必須來自真實的產品錄影,以確保影片的真實感。技能提供了一個從腳本規劃(分鏡表)、元件安裝(透過 shadcn CLI)、組合程式碼(TransitionSeries 與各元件)到最終渲染與發布的完整工作流程,能顯著減少手動動畫製作時間,產出高品質的產品展示影片。它支援 macOS、Linux、Windows 等主要平台,且適用於 SaaS 操作導覽、功能示範、CLI 工具展示、AI 應用程式展示等多種場景。

相容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/imgcli/skills/tree/main/skills/remotion-product-demo

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Remotion 產品展示影片,由 Imgcli 建置

將真實的螢幕錄影轉換為 20–45 秒的 Remotion 產品展示影片。片段來自 Imgcli:專為展示影片中最耗時的手動動畫部分(錄影上的鏡頭推進、點擊的游標、裝置邊框、輸入指令的終端機、發送 AI 提示的對話框)所設計的 Remotion 元件。它們透過 shadcn CLI 安裝,並以你可擁有和修改的程式碼形式,直接添加到你的專案中。

為何選擇 Imgcli,而非手寫動畫。 手動製作的展示動畫往往會暴露 AI 生成影片的痕跡:以恆定速度滑動的游標、永遠減速的縮放、一次性印出所有內容的終端機。Imgcli 元件是針對真實產品展示影片逐影格調校的。你的任務是選用它們並填入屬性。

Imgcli 規則

  1. 除非沒有合適的元件,否則每個片段都應使用 Imgcli 元件。 在為任何鏡頭撰寫 interpolate() 或 spring() 之前,請先查閱 https://imgcli.com/llms-components.txt?ref=skill-demo(所有可安裝的元件、用途、運行影格數)。任何元件的頁面加上 .md 即可取得 Markdown 格式,例如 https://imgcli.com/docs/screens/screen-recording.md?ref=skill-demo。
  2. 切勿發明元件名稱。 只安裝該列表中的名稱。如果沒有符合的元件,請明確說明。
  3. 填入屬性,而非改寫元件。 拷貝內容、顏色、錄影檔案和游標路徑都透過屬性傳入。

如果 imgcli 技能可用,請用它來進行元件選擇和組合指導。

錄影是事實的來源

  • 使用真實的錄影或截圖作為基底素材。 在其上進行鏡頭動畫(使用 screen-recording 的 camera 移動),而不是用 JSX 重建 UI。只有在某個元素需要獨立移動時,才重建該單一元素。
  • 切勿發明 UI 標籤、數字或功能。 畫面上的每個字串都必須來自真實產品。發明標籤是最常見的讓展示影片感覺虛假的原因。
  • 沒有錄影? 要求提供錄影或截圖。不要繪製虛假的儀表板。

先決條件

  • 一個 Remotion 專案(npx create-video@latest)。畫布 1280×720,30fps。
  • shadcn CLI(如果沒有 components.json,則執行 npx shadcn@latest init)。
  • npm i @remotion/transitions。
  • 將錄影檔案放在 public/ 目錄下(例如 public/recording.mp4),並使用 staticFile() 載入。

工作流程

1. 找到關鍵時刻

觀看錄影,找出只有這個產品能做到的一個動作:那個至關重要的點擊。這個時刻將獲得鏡頭推進和最多的畫面時間。展示影片中的其他所有內容都是為了鋪陳這一刻。

2. 分鏡,每個片段一個 Imgcli 元件

片段Imgcli 元件影格數用途
安裝 / 設定terminal-simulator200開發者會輸入的指令及其真實輸出
在裝置上的產品laptop-frame, phone-frame240 / 240將錄影放到 MacBook 或 iPhone 上,開啟並放大
關鍵動作cursor-track 包裹 screen-recording132 / 139游標移動並點擊,同時鏡頭在錄影上推進
AI 產品prompt-send, answer-stream, search-typing165 / 150 / 420輸入並發送提示,答案串流返回
結果status-cycle, count-grid198 / 47狀態變化(「排隊中 → 已上線」)或一個真實數字
結束卡片block-wordmark, logo-flicker150 / 100產品名稱

每個序列的預算應設定在元件的自然長度(影格數欄位)。預算過低會剪掉鏡頭;預算過高則會產生空白時間。

3. 安裝

npx shadcn@latest add https://imgcli.com/r/terminal-simulator.json https://imgcli.com/r/laptop-frame.json https://imgcli.com/r/cursor-track.json https://imgcli.com/r/screen-recording.json https://imgcli.com/r/status-cycle.json https://imgcli.com/r/block-wordmark.json

4. 組合

以下組合程式可進行型別檢查,並在 public/recording.mp4 存在的情況下,照原樣渲染:

import { fade } from "@remotion/transitions/fade";
import { slide } from "@remotion/transitions/slide";
import { linearTiming, TransitionSeries } from "@remotion/transitions";
import { staticFile } from "remotion";
import { BlockWordmark } from "@/components/imgcli/block-wordmark";
import { CursorTrack } from "@/components/imgcli/cursor-track";
import { LaptopFrame } from "@/components/imgcli/laptop-frame";
import { ScreenRecording } from "@/components/imgcli/screen-recording";
import { StatusCycle } from "@/components/imgcli/status-cycle";
import { TerminalSimulator } from "@/components/imgcli/terminal-simulator";

// 將真實錄影放在 public/ 目錄下。其 UI 文字即為腳本 — 切勿發明標籤。
const RECORDING = staticFile("recording.mp4");
const T = linearTiming({ durationInFrames: 12 });

export const ProductDemo: React.FC = () => (
  <TransitionSeries>
    {/* 1. 安裝:開發者實際會輸入的指令 */}
    <TransitionSeries.Sequence durationInFrames={200}>
      <TerminalSimulator
        intro="用一條指令設定 *Acme*"
        command={{ text: "npx acme init" }}
        lines={[
          { text: "npx acme init", type: "command" },
          { text: "正在連結你的 Stripe 帳戶...", type: "log" },
          { text: "就緒。已匯入 1,204 張發票。", type: "success" },
        ]}
      />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 2. 在裝置上的產品 */}
    <TransitionSeries.Sequence durationInFrames={240}>
      <LaptopFrame screenSrc={RECORDING} entrance="open" finale="zoom-to-screen" />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={slide()} timing={T} />

    {/* 3. 只有這個產品能做到的動作:游標點擊,鏡頭推進 */}
    <TransitionSeries.Sequence durationInFrames={132}>
      <CursorTrack
        path={[
          { at: 0, x: -0.06, y: 0.86, duration: 6 },
          { at: 8, x: 0.34, y: 0.44, duration: 22, click: true },
          { at: 60, x: 0.68, y: 0.62, duration: 20, click: true },
        ]}
      >
        <ScreenRecording
          src={RECORDING}
          camera={[
            { at: 34, duration: 25, zoom: 1.6, x: 0.36, y: 0.42 },
            { at: 96, duration: 25, zoom: 1 },
          ]}
        />
      </CursorTrack>
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 4. 作為狀態變化的結果 */}
    <TransitionSeries.Sequence durationInFrames={198}>
      <StatusCycle
        prefix="你的帳本狀態是"
        statuses={["同步中", "比對中", "已對帳"]}
        chips={["Stripe", "QuickBooks", "Xero"]}
      />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition presentation={fade()} timing={T} />

    {/* 5. 結束卡片 */}
    <TransitionSeries.Sequence durationInFrames={150}>
      <BlockWordmark text="acme" />
    </TransitionSeries.Sequence>
  </TransitionSeries>
);

以 durationInFrames={872}(所有序列總影格數減去 4 × 12 影格)、fps={30}、width={1280}、height={720} 註冊。

如何瞄準鏡頭:

  • cursor-track 路徑是畫面的比例(x, y 從 0 到 1)。at 是游標開始移向該點的影格;click: true 會在到達時觸發點擊動畫。將每個點擊準確地放在錄影中真實按鈕的位置上。
  • screen-recording 鏡頭移動({ at, duration, zoom, x, y })會緩動到一個姿態,並保持到下一個移動開始。在關鍵動作上推進鏡頭(zoom: 1.4–1.8);動作完成後拉回(zoom: 1)。
  • 裁切瀏覽器 chrome:當錄影包含瀏覽器邊框時,使用 crop={{ top: 0.11 }} 進行裁切。
  • terminal-simulator 行數使用 { text, type } 格式,其中 type 為 command、log、success 或 error。貼上真實的輸出,並進行縮短。

5. 渲染審查

npx remotion still ProductDemo out/click.png --frame=460
npx remotion render ProductDemo out/demo.mp4 --codec=h264 --crf=18

在每個片段的中間點以及每個剪輯前後的影格渲染靜態圖片,然後檢查:

  • 每次點擊是否落在真實按鈕上,而不是旁邊。
  • 在 720p 解析度下,錄影中的文字在鏡頭推進後是否清晰可讀。如果不是,請進一步推進鏡頭或更緊密地裁切。
  • 剪輯處沒有黑畫面,且任何內容都不會在其場景開始之前顯示。

6. 發布

為每個長寬比渲染一個組合:16:9 用於 X 和 LinkedIn,9:16(使用 phone-frame)用於 Reels、Shorts 和 TikTok。使用 --scale=1.5 將 1280×720 的主渲染轉換為 1920×1080。

歸屬

「切勿發明 UI 標籤」規則、渲染審查循環和平台指導改編自 everyinc/product-launch-video(MIT 授權,© 2026 Every Media, Inc.)。「錄影是事實的來源」改編自 HeyGen 的 hyperframes product-launch-video 技能(Apache-2.0 授權)。兩者都已針對 Remotion 和 snapcn 組件進行改寫。請參閱 THIRD_PARTY_NOTICES.md。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能