手機直式影片剪輯
此處的大部分規則來自實際失敗的 Reel 經驗。references/research.md 保存了原因與來源。references/resolve-ui.md 繪製了 DaVinci Resolve 控制介面的對應關係,以便透過電腦操作來驅動。
部分情況尚未經過實際發布的 Reel 驗證:HDR 素材、30 fps 慢動作、相機前說話、TikTok 與 Shorts 安全框,以及封面圖。這些情況的命令僅在測試片段上執行過。references/other-cases.md 保存了這些情況並說明如何檢查。當剪輯依賴於其中任一情況時,請告知使用者。
流程:手機原始素材 → ffmpeg 裁剪與穩定 → 色彩校正(DaVinci Resolve,或使用 scripts/grade.py 進行全畫格調整)→ Remotion 文字 → ffmpeg 音訊與母帶。
裁剪前
- 閱讀客戶的品牌規則(如果有的話):禁用詞彙、聯絡資訊、AI 標註,以及需要發布前批准的項目。
- 檢查每個原始素材片段:
python -I scripts/probe_source.py clip.mp4。它會報告旋轉方向、幀率及其是否變動、SDR 或 HDR、色彩標籤與音訊,然後列出該片段在裁剪前需要的處理。典型的手機片段是 SDR bt709,約 30 或 60 fps。HDR、可變幀率與 30 fps 素材各需要一個額外步驟,詳見references/other-cases.md。背景說話聲表示原始聲音保持靜音。如果鏡頭前的人在對觀眾說話,請參閱同一檔案中的「說話」章節。 - 如果你使用第二個 AI 模型作為審查者,請先與它討論構想再做決定,然後驗證它說的內容。
references/research.md列出了審查模型曾犯下的錯誤類型。
節奏
- 一個 Reel 一個想法。文字決定長度,而非目標數字。一個測試 Reel 需要 18.6 秒,因為客戶無法在 10.5 秒或 13.5 秒內讀完。
- 預估每秒 10 個阿拉伯字元,從一行文字出現時開始計算。刻意放慢:觀眾同時也在手機上觀看畫面。
- 每個鏡頭盡可能安排兩個文字揭示,且之間至少間隔 1.5 秒。同時出現的多行文字視為一個揭示。
- 母語讀者對節奏的判斷優於任何模型的判斷。
- 最強的畫面和鉤子文字在第 0 幀就要出現,不要從黑色淡入。
- 避免突然的 3 倍加速。應透過平緩的曲線度過糟糕的時刻。
60 fps 以 0.5 倍速播放可得到 30 fps 的真實幀,因此無需插值。30 fps 素材沒有多餘幀,因此在進行慢動作前,請閱讀 references/other-cases.md 的慢動作章節。先穩定至 60 fps 的中間格式,再重新調整時間:
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabdetect=shakiness=6:accuracy=15:result=x.trf" -f null -
ffmpeg -ss S -t D -i raw.mp4 -vf "vidstabtransform=input=x.trf:smoothing=14:zoom=2:optzoom=0:interpol=bicubic,crop=W:H:X:Y,scale=1080:1920:flags=lanczos,fps=60" -an -c:v libx264 -preset veryfast -crf 10 -pix_fmt yuv420p im.mp4
python -I scripts/retime.py im.mp4 c1.mp4 --start 0.4 --frames 99 --keys 0:.5
從此技能的文件夾執行 scripts/ 路徑。ffmpeg 需要 vidstab 濾鏡。每個片段必須從時間零點開始,因為非零起點會在 Resolve 中顯示為頭部的黑幀。使用帶時間濾鏡的 -ss 時,加上 setpts=PTS-STARTPTS,並用 ffprobe 檢查 start_time。
如果靜態鏡頭的最後幾幀出現一隻手,可以透過保留較早的幀來隱藏:trim=end_frame=N,setpts=PTS-STARTPTS,tpad=stop_mode=clone:stop_duration=0.6。
色彩
此處的色彩意指校正:中性白的還原、自然的膚色、真實的產品顏色、鏡頭間的匹配。創意風格放在最後且影響範圍要小,且產品顏色在風格化後仍需測量準確。
根據片段需求選擇路線:
- 僅全畫格調整(色調、曝光、對比、飽和度):使用
scripts/grade.py。它更快、可重複,且數值保留在可重新執行的命令中。 - 需要針對畫面某部分進行修正(不同光源下的膚色、單一物體):使用 DaVinci Resolve 的 Power Windows。
兩種路線都使用相同的「測量、調整、再測量」循環以及下列相同的目標值。
使用 grade.py
python -I scripts/grade.py still c1.mp4 1.5 before.png
python -I scripts/measure_grade.py before.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
python -I scripts/grade.py make c1.cube --frame before.png --neutral 40,60,200,220 --white 205 --contrast 1.06 --pivot 0.4 --lift -0.02
python -I scripts/grade.py still c1.mp4 1.5 check.png --lut c1.cube --compare
python -I scripts/grade.py apply c1.mp4 c1g.mp4 --lut c1.cube
--neutral 是一個應為灰色或白色的區域:例如檯面、牆壁、紙張、白色蓋子。make 會將其 R、G、B 通道平衡,而 --white 設定平衡後的最終亮度等級。選擇一個光線均勻且沒有過曝的區域。在應用前,以全尺寸查看 --compare 幀,並測量已調色的半側。每個鏡頭一個 LUT,因為每個鏡頭有各自的色偏。
當增益將亮部推至 250 以上時,加上 --knee 0.85。僅在肉眼可見的噪點低光源片段使用 --denoise light,並謹慎使用 --sharpen:手機已經有銳化效果,過度銳化會在邊緣和文字周圍產生光暈。
在 Resolve 中製作的調色可以匯出為 LUT:在「色彩」頁面右鍵點擊片段的縮圖,選擇「生成 LUT」,33 點 Cube。然後 grade.py apply --lut 可將其應用於任何片段。LUT 僅包含全畫格調整,因此 Power Window 的效果不會包含在內。
在免費版 DaVinci Resolve 中
將片段複製到 Resolve 可存取的普通資料夾(它無法開啟某些應用程式資料夾並顯示「路徑不存在」)。將它們放入新的時間軸,並開啟 Parade 波形示波器。
依此順序進行作業,因為每個步驟都依賴前一步驟:
- 平衡節點。 使用 Gain 調整白色亮度等級,Temp 調整色偏。正值 Temp 會讓畫面變暖。兩個鏡頭中的相同表面必須匹配。
- 對比節點。 調整對比與 Pivot,使用 Lift 加深暗部,以及輕微的飽和度調整(5 或更少)。
- 主體節點,僅在全局調整會影響其他部分時使用。 使用柔和的 Power Window。在測試 Reel 中,一個 Window 修正了手部的膚色,同時不影響產品顏色。
- 渲染、測量、調整、重複。兩次足夠。
python -I scripts/measure_grade.py frame.png --patch counter:40,60,200,220 --skin 100,1450,1000,1920
目標值
- 中性表面:R、G、B 之間的差異約在 3 到 5 以內。白色約在 195 到 215 之間,呈現明亮風格。
- 膚色色調接近 123 度。保持自然,因為向量示波器的線條是參考而非目標。
- 膚色亮度:指南建議根據膚色和場景在 40% 到 70% 之間。將此範圍作為檢查錯誤的依據,而非必須達到的數值。
- 亮部:約低於 2% 的畫素在 250 以上。
- 飽和度:比較調色前後的
chroma數值。校正應使 p95 接近原始值。大幅跳躍表示調色增加了場景中原本沒有的顏色。 - 當影片銷售產品時,產品顏色必須保持真實。
- 兩個拍攝相同表面的鏡頭,測量結果應一致。
什麼調整影響什麼:
- Tint 幾乎無法修正紅色的手掌。每個通道的 Gamma 解決了問題:提高 G,稍微降低 R 和 B。
- Temp +300 過度校正了藍色色偏,而 +130 剛好。從小的調整開始。
在 Remotion 中的阿拉伯文字
assets/reelTemplate.tsx 是一個可運作的模板。它將每個文字區塊保持為資料,並為文字檢查提供一個探測合成。references/remotion-setup.md 涵蓋了從頭開始建立專案以及註冊合成的方法。
規則:
- 使用粗體阿拉伯字體(模板使用 Alexandria 800),白色加上一個強調色,無框線,加上柔和陰影。
- 在 1080x1920 的畫面上使用 62 到 124 px 的字級。手機需要那麼大的字。
- 阿拉伯文的行高為 1.5。在 1.22 時,字母的尾巴會碰到下一行。
- 每個字母位於 x 110-950 和 y 220-1475 的範圍內,這樣 Instagram 的右側欄和底部欄就不會遮蓋到。
- 使用
whiteSpace: nowrap,確保一行文字不會意外換行。 - 鉤子文字在第 0 幀出現。後續行之間約間隔 1 秒,帶有 6 幀的淡入淡出效果。
- 文字後方放置一個柔和的深色條帶,確保主體在文字下方仍然可見。
- 客戶引述必須逐字保留,除非客戶同意,否則不得包含姓名或照片。
- 說明觀眾正在看到的內容。不要讓標籤暗示它是唯一的選擇。
在文字變更後,渲染探測影格並檢查:
npx remotion still ReelProbe out/p0.png --frame=0
python -I scripts/check_text.py out/p0.png out/p1.png out/p2.png out/p3.png
當兩行文字的墨水間距小於 14 px,或字母超出安全框時,檢查會失敗。一個區塊最多容納七行文字。
然後將文字與實際畫面進行比對。渲染每個鏡頭的最後一幀(此時所有文字行都顯示在畫面上),並按相同順序傳入這些影格:
npx remotion still Reel out/r0.png --frame=119
python -I scripts/check_text.py out/p0.png out/p1.png --real out/r0.png out/r1.png
每行文字會根據其字母周圍畫面最亮部分的對比度獲得一個數值,低於 3.0 則失敗。在測試 Reel 中,強調色文字的分數為 3.2 到 4.6,白色文字則為 5 或更高。分數低表示需要在文字後方使用更強的條帶,或移動文字區塊。
預設安全框是 Instagram 的。如果 Reel 也會發布到 TikTok 或 Shorts,請加上 --platform all。這兩個安全框來自第三方指南,因此請在各個應用程式中預覽上傳效果。
然後檢視每個鏡頭結尾處的全尺寸影格。縮圖表會隱藏碰撞,而文字後方移動的物體只有在全尺寸下才會顯現。在測試 Reel 中,一支湯匙越過了一行文字。透過從角落進行小幅縮放,不僅移除了湯匙,還裁掉了一根多餘的手指。
渲染與音訊
npx remotion render Reel out/reel.mp4 --codec=h264 --crf=15 --muted --color-space=bt709
python -I scripts/beat_offset.py music.ogg --cuts 3.3,6.5,10.3 --length 13.5 --from 0 --to 40
--color-space=bt709 很重要。少了它,Remotion 會寫入全範圍 bt470bg 且未知的原始色彩。
從最佳偏移位置剪輯音樂,淡出最後 1.2 秒,用 -c:v copy 合併,然後進行母帶處理:
sh scripts/master.sh in.mov out.mp4 -14 0.4 0.75
最後一個數字是限制器的上限。AAC 會在其上方產生 overshoot,其程度取決於音軌,因此腳本會測量它寫入的檔案,並列印其響度與真實峰值。如果列印出 TOO HOT(真實峰值高於 -1 dBTP),則使用 0.7 重新執行。
手機喇叭會損失大部分低於 300 Hz 的聲音,因此請檢查該頻段:
ffmpeg -hide_banner -nostats -i out.mp4 -vn -af "highpass=f=300:poles=2,highpass=f=300:poles=2,lowpass=f=12000,ebur128" -f null - 2>&1 | tail -12
目標是在 -14 LUFS 的母帶下,該頻段的響度達到 -20 LUFS 或更大。一個重低音的音軌量測到 -23.9,在手機上聽起來很沉悶。也繪製波形和頻譜,因為審查模型的時間戳並不一定與它們匹配。
AI 生成的音樂或語音需要平台的 AI 標籤。生成的音樂應比 Reel 稍長,因為截短的音軌無法乾淨地延長。
完成前的檢查
- ffprobe 顯示
yuv420p, tv, bt709, bt709, bt709,以及正確的時長和幀數。 check_text.py列印 PASS,且包含--real影格。master.sh列印的真實峰值在 -1 dBTP 或以下。- 如果 Reel 會顯示在個人檔案網格上,則需存在封面影格(
references/other-cases.md)。 - 親自檢視全尺寸影格,包含第一幀、最後一幀以及每個剪輯點的前一幀。
- 如果審查模型觀看了最終的 mp4,請將已做出的決定告知它,以免它重新開啟討論。
- 說明哪些內容未被檢查。AI 代理人無法聽到音訊或親眼在手機上看到檔案。
- 替換已上傳到某處的檔案後,重新上傳,從公開連結進行驗證,並更新任何指向舊檔案的排程內容。
發布前需要客戶的批准。