產品廣告影片,以程式碼製作
一個 15-20 秒產品廣告的管道,無需影片編輯器:每個影格、聲音和旁白都由腳本產生,因此整個過程可重現且可像文字一樣編輯。
專案事實 ─► 簡報 + 分鏡腳本 ─► 視覺效果 ─────────────► Remotion 渲染 ─► MP4
├ 2D:React (Remotion) ▲
└ 3D:Blender (無頭模式) ─► JPG 影格
音效:scripts/score.py ─► WAV ┘
旁白:scripts/kokoro_tts.py ─┘
實際範例(GhostCommits,真實檔案):examples/ghostcommits/。
步驟 1 — 了解產品,編寫簡報
閱讀 README、落地頁面和程式碼。提取:一句話介紹、3-4 個具體證明點(數字優於形容詞:「1 個檔案」、「0 次登入」),來自 CSS 的品牌顏色、Logo SVG、網址。寫下哪些是不得聲稱的(例如「僅限測試網」、「非匿名」、沒有使用者數量)。畫面上的每一行文字和旁白都會根據此列表進行檢查。僅當品牌尚未定義調色盤/風格時,才要求使用者選擇。
步驟 2 — 分鏡腳本(在開始建置前將其寫入 .md 檔案)
18 秒,30 fps = 540 個影格。5-6 個鏡頭,每個約 2.5 秒(75 個影格 = 96 BPM 下的一個小節,因此剪輯點會落在節拍上)。每個鏡頭:影格、攝影機/運動、畫面上文字、音效。以 3-4 秒的結束卡片(名稱、標語、網址)結尾。範本:references/storyboard.md。
步驟 3a — 2D 風格(Remotion)
動態文字 + 平面形狀,具有「Spotify Wrapped」的能量。請參閱 references/remotion-2d.md。
npx create-video@latest --yes --blank --no-tailwind video,然後為每個廣告建立一個元件,僅由 useCurrentFrame() + 帶有緩動效果的 interpolate 驅動。不使用 CSS 過渡。
步驟 3b — 3D 風格(Blender,無頭模式)
黑色虛空中的光澤英雄物件,微距特寫,光線條紋劃過表面,硬切,大統計數字 + 左下角的小說明文字。請參閱 references/blender-3d.md。
一個 Python 腳本建構場景,為每個鏡頭設定關鍵影格並渲染影格:
blender -b --factory-startup -P scene.py -- anim ../public/frames。Remotion 將文字疊加在影格上(examples/ghostcommits/GhostAdV2.tsx)。先渲染 2-3 張靜止畫面並在完整動畫之前查看它們。
步驟 4 — 音效(scripts/score.py)
編寫一個 JSON 提示表:每個視覺事件一個條目,以來自動畫程式碼的影格編號為鍵(剪輯 → cut_hit,物體飛入 → whoosh,落地 → click/lock,光線條紋 → glint,結束卡片 → impact,鋪墊 → riser)。然後執行 python scripts/score.py cues.json。
它合成所有音效(無樣本,無授權),添加一個在 break_frame 下降並在 end_frame 解決的 96 BPM 背景音樂,並印出每秒響度,以便無需聆聽即可進行合理性檢查。詳細資訊和增益指南:references/sound.md。
步驟 5 — 旁白(可選)
簡短台詞,≤ 6 個字,每個鏡頭一句,與畫面上的文字匹配。最佳免費選項:
python scripts/kokoro_tts.py lines.txt vo/(託管的 Kokoro,提供 3 種聲音進行比較)。將檔案新增到提示表的 voiceover 列表中,起始時間 = 該鏡頭文字出現的時間;score.py 會修剪靜音並在旁白下降低音樂音量。測量每行台詞的長度,確保它在下一句開始前結束。選項和教訓:references/voiceover.md。
步驟 6 — 渲染和交付
在組合中加入 <Html5Audio src={staticFile("audio/soundtrack.wav")} />,然後執行
npx remotion render <CompositionId> out/ad.mp4。將 MP4 發送給使用者。明確說明您無法聽到音訊:電平與時間點是透過數值方式檢查的,而不是透過聽覺。
重要規則
- 誠實文案:不得聲稱產品無法支持的內容;在畫面上保留注意事項(beta、測試網)。
- 不要重新創作特定品牌的廣告(標誌、音樂、角色)— 僅借用其風格。
- 文字在 1080p 下 ≥ 48 px,在畫面上停留 ≥ 1.2 秒,位於左下角或居中,切勿覆蓋在英雄物件的臉上。
- 在完整渲染之前先渲染靜止畫面;檢查每個鏡頭中的一個影格。
- 將產生的影格/音訊排除在 git 之外(
.gitignore);提交腳本 + 分鏡腳本。