活動回顧影片
已在包含 780 個項目的活動庫中進行了端到端測試。需要在 PATH 上具有 ffmpeg/ffprobe,以及 Python 3.10+ 並安裝 pip install pillow pillow-heif numpy。
腳本位於此檔案旁。將其複製到專案中:
scripts/analyze.py、build.py、reel.py、motion.py、fonts.py→ 專案根目錄scripts/work/*.py→<project>/work/examples/*.json→ 專案根目錄,然後編輯它們
專案佈局:raw/(未修改的原始檔案)、music/、work/(快取)、output/、edit.json(完整的剪輯設定)。
字型會在 Windows/macOS/Linux 上自動找到;可使用 FONT_SERIF、FONT_SERIF_BOLD、FONT_SANS_BOLD、FONT_BLACK、FONT_EMOJI 覆蓋。
1. 獲取媒體
- 將每個匯出/壓縮檔放在
raw/下自己的資料夾中。切勿修改原始檔案。 - Google Photos 沒有針對現有庫的 API:透過 CDP 驅動使用者已登入的瀏覽器(請參閱此儲存庫中的
brave-cdp技能)。網格項目是a[href*="/photo/"];日期標題是[role=checkbox][aria-label^="Select all photos from"]。 - 使用真實的滑鼠事件(
Input.dispatchMouseEvent)選取日期標題,驗證"N selected"文字,按下 Shift+D。標籤頁必須在前景(Page.bringToFront),否則網格會保持灰色。 - Google 在下載後會清除選取狀態,且標題的
aria-checked可能會過期;在重新選取前請重新載入。 - 使用
allowAndName的Browser.setDownloadBehavior會將壓縮檔以其 GUID 儲存而不帶副檔名;請監控Browser.downloadProgress以取得completed狀態。
2. 分析與挑選
python analyze.py→work/media.json(從 EXIF / 影片creation_time以當地時區取得拍攝時間、模糊度、亮度、重複項、音量)+ 在work/sheets/中生成每日的聯絡表。python work/vsheets.py→ 每個影片生成三幀條狀圖。請查看每一張表。跳過那些在錄製中旋轉的片段、口袋拍攝的片段以及黑暗的夜間片段。python work/loudest.py ID:seconds ...找出音量最大的時間視窗(唱歌、說話、歡呼)。在修剪之前,請用 1 fps 的幀條狀圖進行驗證。- 共享/轉發的檔案沒有拍攝日期(會退回使用檔案修改時間)— 請透過目視放置它們。
3. 剪輯(觀眾喜歡的)
- 以影片為主(約 90% 的片段);僅在強烈的團體照時使用照片。照片過多的剪輯會感覺節奏緩慢。
- 冷開場鉤子:8–10 個 1.2–1.8 秒的片段,使用
hook_xf0.1 的近硬切,然後是標題卡。接著按日期順序排列,在每天的第一個片段上加上一個小的"label": "Day N · date",使用 3–4 秒的片段,以及幾個標記為"speech": true的 9–12 秒精彩時刻(音樂在這些時刻會降低音量)。 - 音樂決定鉤子的成敗。將兩個節奏相似的曲目串聯起來(
"music": [a, b],3 秒交叉淡入淡出),而不是循環播放一個。python work/bpm.py file.mp3可估計節奏。 edit.json的鍵:title, subtitle, closing, closing_sub, title_bg / closing_bg(+ 用於影片 ID 的_bg_at)music/vertical_music、music_volume, duck_volume, ambient_volume, photo_seconds, hook_xf, closing_seconds, horizontal_hook, horizontal, vertical_hook, vertical。片段:{"id", "at" (0–1 中心) | "start", "dur", "speech", "label", "xf"}。python work/shortlist.py→output/shortlist.jpg(每個剪輯點的一幀)。在渲染之前將其展示給使用者。
4. 渲染與品質控制
python build.py [horizontal|vertical|vertical-full]— 在work/seg中的每片段快取、xfade 鏈、loudnorm −14 LUFS、x264。EDIT=other.json OUT_SUFFIX=-v2 python build.py渲染一個替代剪輯,而不會影響主剪輯。- 對每個渲染進行品質控制:
nb_frames == duration*30(xfade 鏈可能會丟失幀)、blackdetect計數為 0、ebur128 ≈ −14 LUFS,以及一個幀的平鋪表(fps=1/5,tile=8x6)以目視檢查旋轉和截斷的標題。 - ffmpeg 7+ 偏好使用
-/filter_complex file而不是已棄用的-filter_complex_script。
5. 節拍同步 Reels(IG / TikTok / FB)— reel.py + reel.json
python reel.py→output/reel.mp4(約 45 秒),基於 build.py 的片段渲染器構建。- 剪輯點正好落在節拍網格上(
bpm提示、自動相位、四捨五入到幀的剪輯時間)。仔細檢查節奏:粗略估計器常常會回報一半/兩倍的數值(85 對 154)。 - 第一秒 = 最令人驚喜的時刻,並帶有一行 "POV: …" 文字。4 拍的片段,英雄時刻使用 6–8 拍,每個片段上緩慢推近,章節開始時使用白色閃爍。
- 文字:粗體無襯線字體、白色並帶有粗黑色外框,距離頂部約 24%(避開 TikTok/IG 按鈕),向上滑入淡出。總共 5–7 行簡短文字;最後一行是活動名稱。
6. 迷因/動態剪輯 — motion.py + motion.json(僅在使用者要求迷因/貼圖時使用)
- 很多人認為這種風格對真摯的活動來說太過頭了。預設使用第 3–5 節。
- 使用一個長、穩定的曲目(約 3 分鐘)而不是串聯;透過梳狀濾波器搜尋來確定節拍網格。
- 每個片段:
beats、speed(0.5 慢動作 / 2 快轉)、freeze(拍數;磁帶停止 + 靜音 + 去飽和)、cap貼圖(圓角框、傾斜、彈性彈出、彩色表情符號)、day強力標題 + 嗖嗖聲、title、verse、shake、punch、flash、zoom。 - 如果渲染被終止,請在重新執行前刪除那些無法通過 ffprobe 的片段檔案(快取會重複使用它們)。
7. 直立與社群媒體交付
- 當有人批准 16:9 剪輯並要求 9:16 時,提供他們相同的剪輯直立版本(
python build.py vertical-full)。不要重新設計已批准的剪輯;「讓它更具吸引力」僅意味著進行打磨。 - 平台(尤其是 Facebook)會將帶有未經授權音樂的貼文靜音。提供一個原始聲音的版本(一個
"music": null的剪輯)和/或一個無聲副本(ffmpeg -i in.mp4 -an -c copy out.mp4),以便可以從平台的授權庫中添加音樂。 - 最終打磨:
eq=contrast=1.07:saturation=1.2:gamma=0.97,colorbalance=rm=0.03:bm=-0.03:rh=0.02:bh=-0.02,unsharp=5:5:0.45,vignette=angle=PI/5.5+ 音訊highpass=80,dynaudnorm,acompressor,loudnorm=I=-14。