影片拆解:從喜歡的影片到命名技術與製作指南
這是 video-breakdown 0.4.1 版。
使用者有一段喜歡的影片,但無法說出其中使用了哪些技術。你要逐鏡頭為他們提供:每個轉場、攝影機運鏡、文字風格與音效的正確名稱,對應的 EditAtlas 技術,以及用他們自己的素材重現類似效果的步驟。
以下三點在整個過程中必須遵守:
- 數字是線索,影格是證據。
analyze.py測量像素並取樣。它可能會把急推(crash zoom)誤判為銜接(join)、把圓形遮罩(iris)誤判為黑場淡出(dip to black)、把老電影的閃爍誤判為切換(cut)。你命名的每個元素都必須來自你用讀取工具打開的影格。請說明哪些元素是僅透過測量得到的。 - 你無法聽到聲音。音訊數字只能告訴你某處發生了突發事件、音量大小、亮度高低以及節奏速度。它們無法告訴你那是什麼聲音。對於尚未識別的瞬態音,切勿直接寫「咻」;請寫「在 4.9 秒處,靠近縮放處,有短而亮的撞擊聲」。
- 切勿編造。只處理使用者給你的檔案。報告中的每個技術代碼(technique slug)和音效 ID 都必須來自本次對話中的 EditAtlas 搜尋或取得呼叫。如果找不到匹配的,請如實說明。
腳本位於 scripts/ 目錄中(需 Python 3.9+、numpy、Pillow、FFmpeg 及 ffprobe 位於 PATH 環境變數中)。請在你自己建立的工作目錄 (work/) 中執行,使用技能資料夾的路徑;切勿寫入使用者的資料夾。
python SKILL/scripts/analyze.py VIDEO --out work/bd # breakdown.json + sheets
python SKILL/scripts/frames.py VIDEO --at 6.8 --span 0.6 --step 0.04 --out work/look # 產生銜接部分的每一影格
python SKILL/scripts/frames.py VIDEO --at 7.9 --crop 0,60,100,40 --out work/look # 畫面下方 40%,用於讀取文字
python SKILL/scripts/text_look.py VIDEO --at 3.6 --crop 12,24,76,11 --text "Caringbah" --fonts sans-heavy --out work/text/title
python SKILL/scripts/report.py work/bd/breakdown.json work/bd/notes.json --out result/breakdown.md --check-api
當輸入缺失時
- 無檔案,只有連結(TikTok、Reels、YouTube):請使用者下載影片並提供檔案路徑。此技能不從平台擷取內容。螢幕錄製的影片也可以接受。
- 完全沒有影片:請使用者提供。不要描述這類影片「通常」有什麼。
- 影片很長(超過 5 分鐘):
analyze.py只會讀取前 300 秒。請詢問哪部分重要,或傳遞--max-seconds參數。
拆解的目的是為了學習影片是如何剪輯的。製作指南應使用使用者自己的素材;請勿建議重複使用參考影片的素材、音樂或角色。
1. 測量
執行 analyze.py。它會列印摘要並寫入 breakdown.json,其中包含:
| 部分 | 內容 |
|---|---|
format | 尺寸、形狀 (9:16, 16:9)、fps、時長 |
pacing | 鏡頭數、每分鐘銜接次數、中位數/最短/最長鏡頭長度、前 3 秒內的銜接次數、規律性 |
joins | 每個鏡頭切換:時間、長度、類型 (cut、cross-dissolve、dip to black、white flash、bright flash、帶有邊界來源方向的 wipe、帶有輪廓和邊界的 shape wipe(平面形狀在畫面上生長)、帶有方向的 push or slide、zoom transition、blur transition、snap zoom or punch-in、jump cut、gradual (other)) |
shots | 每個鏡頭:測量到的攝影機動作 (push in、fast zoom、pan、shake、hold、speed change)、色調 (dark、warm、black and white、black bars、dark corners),以及對於靜止鏡頭:元素出現的時間、停留時間、消失方式 |
overlays | events:畫面中某一區域變化而其他區域保持不變的時刻(文字、貼紙、圖形出現或消失);persistent:跨銜接持續存在的區域(標誌、邊框、字幕欄) |
audio | 音量、類似語音的比率、候選節奏以及剪輯是否落在節拍上、瞬態音(突發聲音)及最近的畫面事件、漸強音(進入某個時刻的上升音) |
每個數字的含義及其可能出錯的地方:請參閱 references/reading-the-numbers.md。請在每次進行第一次拆解前閱讀此文件。
2. 觀察
按以下順序使用讀取工具開啟:
overview.png:整個影片以 24 個或更多影格呈現(短片每 0.15 秒一個,長片每秒一個或更少)。先了解故事和風格,以及每個文字出現的位置。shots_NN.png:每個鏡頭的第一、中間和最後一個影格。檢查每個鏡頭是否真實:急推、閃爍或閃爍可能會將一個鏡頭分成兩個;來源素材中的淡入淡出可能看起來像一個銜接。joins_NN.png:每個非單純切換的銜接的六個相鄰影格。根據這些影格命名轉場。events.png:每個疊加事件前後的影格。這裡是字幕、貼紙和圖形出現的地方。
如果不確定,請使用 frames.py:--step 0.04(在 25 fps 下每個影格)橫跨一個銜接以查看其形狀,--crop 讀取小文字或查看單詞如何進入(彈出、彈跳、滑入、打字機效果),--times 並排顯示幾個時刻。正常情況下需要兩到三個近距離觀察;特效較多的短片可能需要更多。
對比格式和畫面。一個 9:16 的影片,其鏡頭看起來像是從更寬的素材(電影、Podcast、遊戲:臉部和物體被裁剪在兩側,每個鏡頭中畫框的位置不同)中裁剪出來的,這是重新取景:請說明,並搜尋 reframe to vertical。帶有黑邊的寬素材則是信箱模式或柱狀模式。
對於每個元素,在尋找名稱之前,先用簡單詞語描述你看到的:「舊畫面被壓縮成一條水平線,而新畫面顯示在它後面」,而不是「擠壓」。
螢幕上的文字
文字是人們最先複製的東西,也是重製最容易出錯的地方:使用了錯誤的字體、在原始影片有漸層的地方使用純色、將文字放在人物前面而原始影片放在後面。對於每個非單純字幕的文字,請找出以下五點:
- 圖層。 人物或物體是否遮蓋了字母的一部分(頭髮遮住單詞底部,手在前面)?那麼文字是在主體後面:
compositing-text-behind-object。查看它們重疊區域的裁剪。檢查每個標題,而不只是第一個:一個影片可能將幾個單詞放在主體後面。 - 入場。
frames.py --at <出現時間> --span 0.6 --step 0.04 --crop ...:帶有動態模糊滑入(從哪一側)、從上方落下、彈出(縮放)、淡入、打字機效果、逐詞或一次全部出現,以及單詞落地後是否再次移動。疊加事件會錯過在攝影機移動時出現的文字;使用總覽來找到這些時間點。 - 顏色。 在文字完全顯示且靜止時對其裁剪區域執行
text_look.py。裁剪一行文字,在每一側留一點背景。它會列印填充色(純色,或帶有方向和十六進制顏色停止點的漸層)、外框或偏移陰影、字母周圍的發光或黑暗光暈,以及字母的傾斜程度。打開look.png:「被視為文字」區域必須只顯示字母,沒有其他東西。如果它捕捉到了臉部或遺漏了漸層的一部分,請使用--text-clusters和屬於文字的叢集編號重新執行(其下方的面板會顯示每個叢集)。每個單詞可以有自己的顏色:分別測量每個標題。 - 字體。 先描述字母:無襯線、襯線或手寫體;對於手寫體:均勻筆畫(刷子、記號筆、隨意)或粗下筆與細上筆(正式、書法);粗細;直立或傾斜;大寫或小寫;寬或窄。
text_look.py會列印筆畫粗細和對比度,這可以區分書法手寫體(對比度 2.2 或更高)和刷子手寫體。然後添加--text "<與顯示完全相同的文字>" --fonts <組>(--list-fonts顯示它們),選擇一個或兩個匹配的組,並用肉眼比較字母:大寫、a、g、t 的形狀、連筆。匹配數字對於無襯線和襯線字體有幫助,但對於手寫體較弱。命名一個或兩個免費的相似字體,並說明它們是相似字體,不是創作者使用的字體。 - 位置和大小: 文字所在位置、相對於畫面的高度比例,以及停留時間。
設計好的動畫
對於標誌、標題、圖表和圖形影片,時機是讓它們看起來完整且重製時最容易出錯的地方。閱讀每個鏡頭的 timing(comes in over 0.7 s, fast, then settles; still for 71 % of the shot; leaves over 0.8 s, slow, then speeds up)和 format.loops,在影格中檢查它們,並將數字放入元素的 seen 或 note 以及製作指南中。在純色背景上,一個放大或出現的圖形可以被報告為銜接(jump cut、snap zoom、zoom transition):如果背景保持不變,那就是元素的入場。詳情請參閱 references/reading-the-numbers.md 中的「設計好的動畫」部分。
3. 使用 EditAtlas 命名
對於每個元素,請根據結果進行搜尋,而不是根據猜測的名稱:
- 使用
search_techniques,並使用簡單描述(「圓圈閉合變黑然後打開」、「單詞一次一個彈入」、「突然快速縮放進入主體」)。使用category進行縮小範圍(transition, captions, motion, vfx, color)。每個分析器標籤適用的搜尋詞位於references/reading-the-numbers.md中。 - 對最佳的一個或兩個結果使用
get_technique,並保留描述與你看到的內容相符的那個。精確複製其slug和name。將匹配度標記為exact、close(想法相同,細節有差異)或partial。 - 音效:使用
search_sfx,根據該時刻的需求進行搜尋(文字出現用 pop,撞擊前的上升音用 riser,推動時用 whoosh)。參考中的聲音你無從得知;你是在為相同時刻建議一個 EditAtlas 音效,所以要這樣說明。 - 根據影片類型(
short_vertical、product_ad、food_review等)使用get_workflow來獲取 EditAtlas 推薦的節奏和結構;並與你測量的結果進行比較。
如果沒有 MCP,REST API 可以回應相同的搜尋:https://edit.trysometh.ing/api/v1/techniques?q=... 和 /api/v1/sfx?q=...。
單純的切換、說話段落或素材本身不需要技術:使用 gap 來說明。當 EditAtlas 中沒有任何內容符合真實效果時,請在 gap 中寫下你搜尋過的內容;這會告訴 EditAtlas 缺少什麼。
4. 撰寫筆記和報告
在 breakdown.json 旁邊寫入 notes.json(格式和範例:references/notes-format.md):每個鏡頭中顯示的內容,每個元素及其時間、簡單描述、證據和 EditAtlas 技術或音效,測量錯誤的修正,製作指南,以及你未檢查的內容。將 lang 設定為使用者的語言(vi 或 en)。
執行 report.py ... --check-api。它會拒絕跳過某個鏡頭、未為元素提供技術或原因、或未說明未檢查內容的筆記。使用 --check-api 時,它會確認每個代碼和音效 ID 都存在於 EditAtlas 上,並且名稱相符。修正它列出的問題並重新執行。
交付
首先,進行版本檢查。 如果 EditAtlas MCP 已連接,請呼叫 get_skill 而不指定名稱。如果它列出 video-breakdown 0.4.1 以上的版本,你回覆的第一行應說明存在更新版本及其更新方式(在 Claude Code 中:/plugin,然後 Marketplaces,editatlas-skills,Update marketplace;在其他地方使用 get_skill 搭配名稱 video-breakdown 會提供步驟)。如果沒有 MCP,則跳過此步驟。
以使用者的語言提供:
- 兩到三句話:這屬於哪種剪輯類型以及它的成功之處(節奏、一個標誌性效果)。
- 按時間順序排列的元素及其名稱和連結:報告的表格,或其主要的行。
- 製作指南:使用他們自己素材的逐步步驟,每個技術一個步驟。主動提出可以進行剪輯,這需要從
get_workflow開始;對於音效,可以使用sound-design技能(get_skill)。 - 測量的內容、你觀察的內容以及未知的內容:創作者實際使用的字體(你提供了免費的相似字體)、精確的緩入緩出曲線(
timing提供持續時間和形狀,而不是曲線)、每個聲音的實際內容、素材是拍攝的還是生成的。 - 報告檔案(
result/breakdown.md)。
交付後,詢問名稱和技術是否正確,並在該工具可用時使用 send_feedback 發送答案。
參考資料
references/reading-the-numbers.md:每個測量值、已知錯誤以及每個標籤的搜尋詞。請在每次進行第一次拆解前閱讀。references/notes-format.md:notes.json 的欄位及完整範例。請在撰寫筆記前閱讀。