Communitygithub.com

Kreesten-hsh/video

此技能應在用戶要求「製作動態下三分之一標題」、「加入下三分之一標題」、「建立姓名標籤/姓名下三分之一標題」、「建立廣播標題」、「動畫化標題/姓名/職稱說明」、「製作講者姓名疊加」或「根據姓名列表模板化下三分之一標題」時使用。涵蓋進場/退場動畫(滑入/擦拭/遮罩揭示)、進出時機與停留時間、安全區域與廣播慣例、姓名與職稱的層級關係、品牌風格設定,以及根據多個姓名渲染同一設計。

video 是什麼?

此 Remotion 技能「Lower Thirds」專門用於建立專業、品牌化的下三分之一標題,這是常見的廣播圖形,用於在畫面底部區域顯示姓名和職稱。它重點在於簡潔、客製化的進場與退場動畫(如滑入、擦拭或遮罩揭示),確保文字易於閱讀且不干擾畫面。技能強調正確的排版層級(姓名遠大於職稱)、安全區域規範(適用於 16:9、9:16 及 1:1 畫面比例),並使用品牌元素(字型、強調色)來維持一致性。關鍵功能是支援模板化:將姓名、職稱和主題設定為屬性,讓你可將一個設計套用到整個講者名單上,批次產出多個剪輯。所有動畫狀態皆基於影格驅動,確保在瀏覽器與影片渲染器中的表現一致,並提供詳細的驗證流程(靜態影格檢查與最終 MP4 編碼),以確保品質。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Kreesten-hsh/video/tree/HEAD/.agents/skills/lower-thirds

在你喜歡的 AI 中提問

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

說明文件

下三分之一標題

建立一個乾淨、品牌化的下三分之一標題 — 位於畫面底部區域的姓名/職稱說明 — 它會動畫化進入、停留足夠長的時間以便閱讀,然後在不搶鏡頭的情況下退出。這項工藝的重點在於克制:清晰的揭示、強烈的排版層級、正確的安全區域位置,以及一個能驅動整個講者名單的模板。

使用時機

  • 講者/訪談姓名標籤、座談會名單、談話性人物說明。
  • 廣播風格標題、新聞跑馬燈、播客/網路研討會姓名牌。
  • 將一個設計模板化套用到多個姓名/職稱 → 大量剪輯(這是真正的價值所在)。

結構

一個下三分之一標題包含兩行文字加上一個圖形背景,放置在畫面底部區域:

元素角色字體處理
姓名(主要)誰最大、最粗、字距最緊
職稱/頭銜(次要)做什麼/在哪裡約為名字大小的 45–60%,較輕的字重,通常使用品牌強調色
背景條 / 面板 / 裝飾線讓文字在任何背景上都可讀實心或不透明度 70–85%;裝飾線與品牌連結

維持在兩行以內。一行名字加一行職稱就是全部工作 — 額外的行數會破壞層級並擠壓安全區域。

三個避免標題看起來廉價的規則

  1. 絕對不要讓標題直接硬切進或退出。 直接出現/消失看起來像是錯誤。即使是 12 影格的淡入或滑入,都能讓它感覺像是精心製作的。
  2. 交錯,不要同時出現。 先動畫化背景條,然後是名字,接著是職稱,每個之間間隔 3–6 影格。所有東西同時到達感覺很平淡;短暫的串聯效果看起來經過設計。
  3. 停留時間要夠長到能讀兩次。 大約在畫面上停留 3–5 秒(大聲唸兩次)。太短會錯過,太長則會讓人煩躁。只在片頭片尾做動畫,絕對不要在片段中間做。

進場與退場動畫

選擇一種動態語言並重複使用。最可靠、最具高級感的揭示方式:

揭示方式感覺做法
滑入 + 淡入乾淨、預設平移約 24–40px 同時淡入;進場使用 ease-out
擦拭背景條廣播風格背景條縮放/掃入(scaleX/裁剪),文字在其後淡入
遮罩揭示高級感將文字裁剪到一個移動的矩形內,使字母「擦拭顯現」

使用不對稱緩動:進場使用乾脆的 ease-out (cubic-bezier(.22,1,.36,1)),退場使用更快的 ease-in。退場速度應比進場快(約 ⅔ 的持續時間),讓標題能迅速離開畫面。

/* 遮罩揭示:文字從左→右擦拭顯現,無需外掛 */
.lt-name { clip-path: inset(0 100% 0 0); animation: wipe .5s cubic-bezier(.22,1,.36,1) forwards; }
@keyframes wipe { to { clip-path: inset(0 0 0 0); } }

進出時機與停留時間

考慮三個階段。用影格數來規劃,而不是憑感覺(以 30fps 為例):

階段預算備註
進場12–18f (0.4–0.6s)交錯:背景條 → 名字 → 職稱
停留90–150f (3–5s)可閱讀的停留時間;根據行數調整
退場8–12f (0.27–0.4s)比進場快

在程式碼中,用當前影格(或暫停的時間軸)驅動所有狀態,而不是用牆上時鐘時間 — 影片渲染器需要確定性的影格。將進場/停留/退場表示為單一的進度曲線,這樣同一個元件既能在瀏覽器中即時運行,也能在渲染器中逐格運作。

安全區域與廣播慣例

下三分之一標題必須能在所有螢幕和平台 UI 上正常顯示。在標題安全區域(內部約 90% / 邊距 5%)內構圖,並尊重平台界面元素:

畫面比例錨點避免
16:9 (1920×1080)左邊緣在大約 5% 邊距處;基準線在大約 80–85% 處外部 5%(標題安全區),動作安全區外部 10%
9:16 (1080×1920)相同的左邊距;將背景條上移底部約 18%(字幕/UI),頂部約 12%
1:1 (1080×1080)底部區域,左中外部 5%

靠左錨定,向右延伸,這樣不同長度的名字就能固定位置,永遠不會尷尬地重新置中。讓職稱行與名字使用相同的左邊距。對於 9:16,不要將標題放在最底部 — 平台字幕和按鈕放在那裡。

排版層級與品牌風格設定

層級就是整個設計。讓名字無庸置疑地主導:

  • 大小對比 ≥ 1.6 倍(名字 vs 職稱)。如果不確定,請放大名字,而不是職稱。
  • 字重 + 顏色:名字使用粗體/近白色;職稱使用較輕的字重和品牌強調色(僅一個強調色,一致使用)。
  • 可讀性對比:文字疊加在未知的影片素材上。使用實心/半透明背景條、微妙的遮罩或柔和的文字陰影,以便在明亮和黑暗的畫面上都能閱讀。
  • 品牌鎖定:將字型、強調色、背景條樣式和圓角半徑固定在一個主題物件中,這樣系列中的每個標題都能匹配。

將一個設計模板化套用到多個姓名

用程式碼來做的原因:更改文字/資料,重新匯出 — 無需重新製作動畫。將 name/role/theme 設定為屬性,永遠不要硬編碼,然後將名單映射到實例。

const ROSTER = [
  { name: "Ada Lovelace",  role: "Founder, Analytical Engines" },
  { name: "Grace Hopper",  role: "Rear Admiral, US Navy" },
  { name: "Alan Turing",   role: "Mathematician" },
];
// 一個 <LowerThird> 設計;映射列表 → 多個實例(在渲染器中依序排列)
{ROSTER.map((p, i) => <LowerThird key={p.name} {...p} theme={BRAND} startFrame={i * 150} />)}

在渲染器中,將名單作為輸入屬性,並為每一行渲染一次(--props),以便為每個人產出一個品牌化的剪輯 — 相同的動畫、相同的品牌,只有文字改變。請參閱 references/lower-third-component.md 取得完整的可執行元件和批次指令稿。

輸出檢查清單

  • 僅兩行:主導的名字,次要的職稱(大小對比 ≥ 1.6 倍)。
  • 有進場和退場動畫(無硬切);進場交錯背景條→名字→職稱;退場更快。
  • 停留 3–5 秒(可閱讀兩次);僅在頭尾做動畫,絕對不在片段中間做。
  • 靠左錨定在標題安全區域內;9:16 的背景條需高於底部 18% 的 UI 區域。
  • 文字在任何畫面上都可讀(背景條/遮罩/陰影);全片一致使用一個品牌強調色。
  • 姓名/職稱/主題是屬性 — 一個模板渲染整個名單。

交付與驗證(渲染靜態影格 → MP4)

打包好的輔助工具(scripts/):使用 scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png 拼貼您的靜態影格,然後使用 scripts/probe-mp4.sh out.mp4 [WxH] [fps] 驗證編碼。請參閱 scripts/README.md。

下三分之一標題以 Remotion 組合(<Composition> + zod schema + defaultProps 的形式提供,name/role/theme 作為屬性) — 進場/停留/退場全部由 useCurrentFrame() 驅動,絕對不使用 Date.now() / Math.random() / 計時器。交付物 = out/*.mp4 + 專案(每列名單重新渲染)。預設為 9:16 垂直畫面 (1080×1920)。

驗證循環 — 渲染靜態影格 → 檢查 → 編碼。 取樣三個階段的影格,以便在編碼(或批次處理整個名單)之前發現交錯或安全區域的錯誤。

# 進場 / 停留 / 退場的靜態影格 — 使用實際提供的屬性(真實的名單列,而非預設值)
npx remotion still LowerThird out/f-enter.png --frame=10  --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-dwell.png --frame=75  --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-exit.png  --frame=N   --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'

# 檢查每個 PNG — 專注於停留影格(完全顯示在畫面上):
#  - 層級關係成立:名字主導(>= 1.6 倍於職稱),職稱使用品牌強調色;兩者完全揭示,非擦拭中
#  - 品牌鎖定:字型、強調色、背景條/遮罩正確;在畫面上可讀
#  - 9:16 安全區域:背景條**高於**底部約 20-35% UI 區域,避開頂部約 12% 和右側操作欄;在標題安全區內靠左錨定
#  - 進場/退場影格顯示部分揭示(動畫確實有執行),非硬切

npx remotion render LowerThird out/lower-third.mp4 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion render LowerThird out/demo.gif --codec=gif                # README 展示剪輯

批次名單:在渲染所有名字之前,先透過靜態影格驗證一列 — 一次抓到佈局/溢出錯誤,而不是 N 次。使用 npx remotion compositions 取得 durationInFrames/fps 來選擇停留和退場的影格。

在完成之前:

  1. 靜態影格在進場、停留和退場時渲染清晰 — 沒有缺少字型/品牌素材。
  2. 在停留影格:名字主導職稱,品牌強調色 + 背景條正確,完全(非部分)揭示。
  3. 背景條在每個檢查的影格中都位於 9:16 安全區域內 — 高於底部 UI 區域,避開頂部和右側操作欄。
  4. 僅由影格驅動 — 無 Date.now() / Math.random() / 計時器;進場/退場顯示動畫,非硬切。
  5. 一個真實的名單列(非 defaultProps)能正確渲染;MP4 已編碼,GIF 為選擇性。

參考檔案

  • references/lower-third-component.md — 一個完整可運行的下三分之一標題:一個 Remotion 元件,具有交錯的彈簧進場、可讀的停留,以及完全由影格驅動的更快退場;一個用於品牌鎖定的型別化主題物件;列表到多個實例的序列化模式;一個逐列批次渲染指令稿;以及相同設計的無相依性 CSS/HTML 版本,包含遮罩揭示和擦拭背景條的變體。

Individual skills in this repo

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

相關技能