手機傳送門短片
概述
一個 9 秒 9:16 的產品廣告,拍攝於單一鎖定腳架畫面,分為三個節拍:
- 傳送門掉落(約 4.3 秒)。一隻手拿著手機。另一隻手滑過螢幕,每一次滑動就將一個產品從螢幕掉落到下方的架子上,落在節拍點上。主力產品在音樂突然停頓後最後掉落。
- 停格動畫序列(約 2.7 秒)。一個硬切移除手機與手。產品在整條線上輪流出現,每個十六分音符一個靜止幀,維持在第四拍。
- Logo 停留(約 2 秒)。字標在 6 到 8 幀內淡入並靜止。僅有音樂,無配音。
沒有實際攝影畫面。一張生成的圖片被切割成圖層(場景、手機與持機手、滑動手)並以程式動畫處理。產品是真實 3D 模型,由同一部相機在手機內和房間內渲染,因此它作為一個物體跨越玻璃。
標準: 它要能被當作真實拍攝。我們遇到的每一次失敗都是某人在單一幀中發現的連續性破綻。請以全尺寸檢視交付檔案的每一個接觸時刻。
你需要
| 需求 | 用途 |
|---|---|
OPENAI_API_KEY | gpt-image-2 用於場景圖與主圖;gpt-image-1.5 搭配 input_fidelity: high 用於必須保留照片的編輯 |
ELEVENLABS_API_KEY | 音樂背景(music_v2_5)與音效 |
HyperFrames CLI(npx hyperframes),three.js r169 | 幀引擎與渲染 |
ffmpeg;Python 3 搭配 numpy opencv-python-headless pillow openai | 腳本 |
腳本從環境變數或工作目錄(或其上層目錄)的 .env 檔案讀取金鑰。它們絕不會列印金鑰。請回報每次執行花費的 OpenAI 美元(腳本會記錄估計值)與 ElevenLabs 點數。
如果有人能拍攝真實的手在腳架上滑手機的畫面,請使用那段影片來製作手部。這是最難偽造的部分。
關卡:每個階段需獲得確認才能繼續
- 簡報與節拍表。 品牌、4 到 6 個產品(主力產品最後,使用與場景互補的顏色)、場景,以及一個節拍為整數幀數的節奏。在 30 fps 下,112.5 BPM 對應 16 幀,120 BPM 對應 15 幀,90 BPM 對應 20 幀。將每個落地點放在音樂的網格上,落在正拍或半拍上,絕不能落在之間。關於掉落數量,請參閱
references/build.md第 1 節。 - 視覺風格。 場景圖、主圖(手與手機)、在已設定相機中 3D 產品的第一版渲染,以及以 3 種字體組合設定的結尾卡,全部放在同一張版面上。
- 動態測試。 一次滑動與一次掉落,以交付品質渲染並逐幀檢查。大多數失敗會在此顯現。
- 建構,然後聲音,然後最終版。
建構
請遵循 references/build.md。其中包含每一步驟以及可運作的數字。順序如下:
- 生成場景圖(空場景),然後主圖:將場景圖進行一次編輯,加入雙手與空白手機。主圖就是基礎幀。 每個乾淨場景圖都從它製作。
- 從主圖切割圖層,並測量螢幕角落、螢幕底部邊緣、指尖與手腕。
- 將 3D 相機對齊架子邊緣。
- 建構引擎。複製
example/studio/(參考建構:一個茶品牌,五個盒子)並重新測量其常數以符合你的場景圖。它只包含程式碼:請自備圖片、字體、標籤藝術與 three.js 檔案。如果產品不是紙盒(如果是罐子、瓶子、易開罐、玻璃容器),請先閱讀build.md中的「其他產品」。 - 先製作音樂並測量其節拍。然後將落地點鎖定在網格上,加入音效並混音。
- 渲染,然後執行以下檢查。
破壞幻覺的規則
| 出現情況 | 修正方法 |
|---|---|
| 產品比手機慢幾幀才出現 | 它在玻璃兩側是同一個 3D 物體。從每個落地的幀數回溯處理每次滑動:從其最低點到達邊緣的幀數開始,它以滾動速度在重力下掉落 |
| 產品掉在手後面 | 在螢幕底部邊緣以下,將其繪製在邊框和手指前方 |
| 產品在手機下懸掛幾幀 | 重力在邊緣接管。不要讓它繼續跟隨頁面的滑動 |
| 滑動看起來像滑動照片 | 從手腕發力並保持前臂僵硬。調整手腕角度使指尖與頁面一起移動。沒有兩次滑動是相同的 |
| 畫面看起來像靜止圖 | 手持手機有 1.5 到 2 像素的漂移,並在每次按壓下稍微下沉。牆壁從不移動 |
| 一道暗線穿過手機 | 動態消息中沒有頁面分隔線。保持任何殘影低調 |
| 手錶或首飾在手腕上滑動 | 在主圖中要求裸露手腕。如果不小心出現,遮罩整個區域並使用 scripts/blend-edit.py 移除 |
| 切換變成溶解 | 決定整個幀上的每個切換、交換和靜止,絕不在快門樣本內部進行 |
| 標籤列印成複製梳齒狀 | 在產品掉落時使用 48 個子幀,其他情況使用 10 個子幀,搭配 0.38 幀快門 |
| 生成的編輯移動了遮罩外的東西 | 遮罩編輯不會被尊重。先註冊編輯,然後只取遮罩內的內容 |
| 砰的一聲在盒子之前響起 | 將每個片段修剪到其最大攻擊音前 4 毫秒,並對齊該攻擊音 |
完整列表(含原因)在 references/lessons.md。
發送前檢查
- 交付檔案在每個接觸時刻的全尺寸裁切:每次滑動的第一幀、產品越過邊緣處、每個落地點、切換處、手臂離開畫面處。
python3 scripts/sync-sheet.py final.mp4 --audio sound/stems/sfx.wav:每個撞擊點都在其指定的幀上。bash scripts/check-final.sh final.mp4 1080x1920:-14 LUFS ±1,真實峰值在 -1 dBTP 或以下。
腳本
| 腳本 | 功能 |
|---|---|
scripts/openai-image.py OUT.png "提示詞" [--edit IN.png --mask M.png --fidelity high] | 生成或編輯一張圖片,並記錄 token 與估計成本 |
scripts/blend-edit.py crop / blend | 準備一個區域的遮罩編輯,然後註冊結果並只取遮罩內的內容 |
scripts/elevenlabs.py spec.json OUTDIR | 根據規格生成音樂背景與效果,快取它們並記錄花費的點數 |
scripts/beats.py bed.mp3 | 找出音樂背景的節奏、節拍網格及第一個強拍 |
scripts/sync-sheet.py VIDEO --audio sfx.wav 或 --cues cues.json | 在一個版面上顯示每個音效撞擊點前後共五幀 |
bash scripts/check-final.sh VIDEO [WxH] | 檢查尺寸、fps、時長、響度與真實峰值 |
每個腳本以 --help 執行可查看選項。example/README.md 對應參考建構。