五片實作脈絡
1任務與交付
你出門前交辦三件事,下午七點前備齊:(1) 五支影片的腳本,用網頁+分鏡圖呈現;(2) 五支影片各自製作完成並驗證;(3) 實作脈絡,同樣用網站呈現。
素材=一台固定運動攝影機在生科木作課跨 8 天整日連拍(72 段 .mov)。先前已做過水族館 vlog、水庫紀錄片、生科老師期末週、一週年晚餐四支,這次刻意做成完全不同的五種電影語言。
2為何用 ffmpeg 而非 Palmier
你的既有工作流是 Palmier+MCP。但這次實際偵察後改走 ffmpeg 主力,原因如實記錄:
| 限制(手冊§6/§8 與現場) | 對自動化的衝擊 |
|---|---|
你外出,Palmier app 未開 → MCP 回 Editor not available | 無法用 MCP 建時間軸 |
| 一專案一時間軸;切換需 GUI File→Open | 五支=五專案,無人操作 GUI 無法切換 |
| 匯出需在 GUI 右上 Export 手動點 | 無人可按匯出 → 產不出成片檔 |
| deface 去識別、縮時預壓、配樂合成 | 本來就是 ffmpeg 原生工作 |
3流水線架構
每支影片走同一條多趟流水線,每趟產出中間檔、可單獨抽格驗證,最穩健:
選鏡靠先做的縮圖接觸表(每拍攝日一張 5×5,橫跨 34 分鐘)快速編目「空景/講授/動手/機具/剪影」等鏡頭原型,再指派給五支。
4自製工具(三支可重用)
mktext.py — 透明文字卡產生器
這台 ffmpeg 沒有編入 drawtext(先前字幕都靠 Palmier,所以從沒踩到)。改用 Python PIL 把文字渲染成含 alpha 的 PNG,再用 ffmpeg overlay 疊上——反而能完整控制字型、字距、描邊。JSON 驅動,五片所有字卡共用。
xconcat.py — xfade 交叉淡接串接
把多段同尺寸影片以 xfade 串接,offset 逐段累加;並強制每段正規化到 1920×1080(因 deface 會把畫面墊高到 1088)。
# xfade offset 累加核心 acc = d[0] for i in 1..n-1: offset = acc - D # D = 交叉淡接秒數 [prev][n_i] xfade=duration=D:offset=offset acc += d[i] - D
build_{C,E,B,D}.sh — 各片段落渲染
每支一個腳本,封裝該片的「選鏡清單+風格濾鏡+deface 旗標+縮時倍速」,背景平行渲染。
5各片風格配方
| 片 | 核心 ffmpeg 配方 | 配樂 |
|---|---|---|
| A 縮時 | setpts=PTS/N 縮時 + tmix=8 殘影 + 暈影;空↔滿循環 | Long Note Two |
| C 懷舊 | 褪色 curves(提黑)+ 低飽和 + 暖陰影/冷高光 colorbalance + noise 顆粒 + 暈影 + 慢推 | Beauty Flow |
| E 監視器 | 冷調低飽和 + 重暈影 + 掃描線 PNG + 綠色 HUD/時間碼 + deface 模糊=遮蔽 | Echoes of Time v2 |
| B 魏斯 | 置中裁切(對稱)+ 粉彩(提亮、低對比、暖)+ 粉彩章節卡 + 硬切 | Fig Leaf Times Two |
| D 偽紀錄 | 自然調 + 局部 zoompan 推近 + deface + 下三分標喜劇字幕 + 假 UI | Wallpaper |
# C 懷舊調色(節錄)
curves=master='0/0.06 0.5/0.5 1/0.95',eq=saturation=0.8,
colorbalance=rs=0.04:bs=-0.05:rh=0.05:bh=-0.04,noise=alls=9:allf=t,vignette
6未成年保護(你的鐵則)
素材全是戴口罩的國中生。依你既有規範「未成年必做 deface」,採三層防護+選鏡迴避:
| 手段 | 用在哪 |
|---|---|
deface 1.5.0 偵測臉並模糊(--thresh 0.2 --mask-scale 1.3) | 所有出現人物的段落 |
| tmix 多幀平均:移動者化為殘影 | A 縮時人流 |
| 選鏡迴避:剪影/背影/物件/空景 | C 懷舊、B/E 物件章 |
| 風格即遮蔽:E 的模糊=監視器遮蔽美學 | E 監視器 |
tmix=5 對靜坐者不夠 → 加到 tmix=8 並加跑 deface;也發現一段誤選到坐滿學生卻沒 deface 的鏡頭 → 立即換鏡。7實戰除錯紀錄(9 個雷)
自動化過程中實際踩到並修掉的坑,供日後剪片參考:
for n in $list 把整串當一個詞。解:改用 zsh 陣列 list=(a b c)。-loop 1 只存在 t≈0 一格,st=49.5 的 alpha 淡入永遠觸發不到。解:每張字卡輸入加 -loop 1 -framerate 30。xfade 因尺寸不符整支失敗。解:xconcat 內每段先 scale=1920:1080 正規化。Songti.ttc index 0 是簡體,缺繁體專屬字形。解:用 index 3=Songti TC(繁體襯線)。STHeiti 兩款也驗證為繁體齊全。stroke_w 3、深色 alpha 190)。8驗證方法
每支成片都做:ffprobe 確認時長/編碼/音軌存在,再用 ffmpeg -ss 抽多張關鍵時刻靜格實際看過(字卡是否顯示、臉是否匿名、調色是否到位)。本頁的除錯紀錄全部來自這個「抽格→看→修」的迴圈。
9Onshape 三支與發佈上線
第二批素材是 2019 Onshape CAD 研習實錄(26 段、約 21GB)——趙珩宇老師本人入鏡講解與操作 Onshape,畫面中無學生。因此這批不需要 deface(主角是本人、同意入鏡),剪成三支:
| 片 | 做法 |
|---|---|
| 教師特色宣傳片 0:35 | 22 個動態短鏡(講解手勢 ↔ CAD B-roll ↔ 完成作品)快接 + 開場品牌卡 / tagline 下三分標 / 聯絡卡 + Inspired 配樂 |
| 建模 Speed-run 0:55 | setpts=PTS/8 把 CAD 螢幕加速 + 步驟字幕(草圖→3D→列印)+ Itty Bitty 8 Bit |
| 精華導覽(章節) 0:44 | 四章主題卡 + 各章 2× 加速段落 + Inspired |
發佈上線(GitHub Pages)
全部成片(5 片 + 快切 + Onshape 3 支)以 <video> 嵌入 storyboard.html 的「看片」區,發佈到公開 repo henrychao521/livingtech-films → henrychao521.github.io/livingtech-films/,並接進主站導覽。
延伸:遮罩特效(MediaPipe 人像分割)
用 MediaPipe Selfie Segmentation(model_selection=1)對影片逐幀產生「人」遮罩(時間平滑降閃爍;工具 work/segmask.py),再以 ffmpeg maskedmerge/alphamerge 選擇性調色,輸出五種放上「看片」頁:主體聚光、人像模式(背景模糊)、選擇性彩色、背景抽換(漸層棚景)、主體光暈。同一套遮罩反過來也能做「比方塊更自然的去識別」。
git fetch+同步再改再推。10成果與交付
| 片 | 標題 | 長度 | 狀態 |
|---|---|---|---|
| A | 一格之內,一個學期(縮時交響曲) | 0:56 | ✅ 已驗證 |
| C | 那年秋天,我們做了一個東西(A24 懷舊) | 0:35 | ✅ 已驗證 |
| E | 受試者編號 4471(監視器科幻) | 0:32 | ✅ 已驗證 |
| B | 林海工藝研究所(魏斯安德森) | 0:42 | ✅ 已驗證 |
| D | 生科教室觀察日記(偽紀錄喜劇) | 0:32 | ✅ 已驗證 |
| SZ | 快切混剪(跨五風格高速硬切) | 0:51 | ✅ 已驗證 |
| — | Onshape · 教師特色宣傳片 | 0:35 | ✅ 已驗證 |
| — | Onshape · 建模 Speed-run | 0:55 | ✅ 已驗證 |
| — | Onshape · 精華導覽(章節) | 0:44 | ✅ 已驗證 |
/Volumes/128G/livingtech-films/renders/;本頁與 storyboard.html 在 livingtech-films/ 根目錄;可重用工具與中間檔在 work/。所有 MP4 皆 1080p / H.264 / AAC,可直接播放或再匯入 Palmier 微調。