Communitygithub.com

amrodwaire/phone-reel-edit

將手機橫拍素材轉為直式 Reels、Shorts 或 TikTok 的剪輯手冊,支援阿拉伯文螢幕文字。涵蓋素材檢查、裁剪、穩定化、慢動作(ffmpeg)、依測量數值進行色彩校正(ffmpeg LUT 或免費 DaVinci Resolve)、Remotion 阿拉伯文字(含自動重疊、安全區與對比檢查)、音樂剪輯對齊、手機喇叭響度母帶,以及發布前檢查。適用於任何需要裁剪、重新裁剪、調色的直式影片專案。

phone-reel-edit 是什麼?

此技能提供一套完整的直式影片(Reels、Shorts、TikTok)剪輯工作流程,特別針對阿拉伯文字幕需求設計。它採用嚴謹的實證方法:每個步驟規則均源自實際發布失敗的案例,且附有研究文獻(references/research.md)說明原因。核心流程為:手機原始素材 → ffmpeg 裁剪與穩定 → 色彩校正(可選 DaVinci Resolve 或 grade.py 腳本進行全畫格調整)→ Remotion 阿拉伯文字合成 → ffmpeg 音訊處理與母帶。 技能強調可重複性與量化檢查:色彩校正以測量數值(中性色、膚色、飽和度)為目標,而非憑感覺;文字檢查腳本會自動檢測文字重疊、安全區越界及對比度不足;響度母帶則針對手機喇叭特性,特別監控低頻(300 Hz 以下)能量。支援平台包括 Instagram Reels、TikTok 與 YouTube Shorts(含各自的安全框)。 技能特別適合以下場景:需要大量產出阿拉伯文直式影片的內容創作者或代理商;追求一致色彩與文字品質的專業剪輯師;希望透過自動化檢查減少人為失誤的團隊。其設計同時考慮了與 AI 審查模型的協作,明確指出哪些檢查(如音訊聆聽、實際手機檢視)無法自動化,必須由人類確認。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/amrodwaire/phone-reel-edit/tree/HEAD

在你喜歡的 AI 中提問

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

說明文件

手機直式影片剪輯

此處的大部分規則來自實際失敗的 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 音訊與母帶。

裁剪前

  1. 閱讀客戶的品牌規則(如果有的話):禁用詞彙、聯絡資訊、AI 標註,以及需要發布前批准的項目。
  2. 檢查每個原始素材片段:python -I scripts/probe_source.py clip.mp4。它會報告旋轉方向、幀率及其是否變動、SDR 或 HDR、色彩標籤與音訊,然後列出該片段在裁剪前需要的處理。典型的手機片段是 SDR bt709,約 30 或 60 fps。HDR、可變幀率與 30 fps 素材各需要一個額外步驟,詳見 references/other-cases.md。背景說話聲表示原始聲音保持靜音。如果鏡頭前的人在對觀眾說話,請參閱同一檔案中的「說話」章節。
  3. 如果你使用第二個 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 波形示波器。

依此順序進行作業,因為每個步驟都依賴前一步驟:

  1. 平衡節點。 使用 Gain 調整白色亮度等級,Temp 調整色偏。正值 Temp 會讓畫面變暖。兩個鏡頭中的相同表面必須匹配。
  2. 對比節點。 調整對比與 Pivot,使用 Lift 加深暗部,以及輕微的飽和度調整(5 或更少)。
  3. 主體節點,僅在全局調整會影響其他部分時使用。 使用柔和的 Power Window。在測試 Reel 中,一個 Window 修正了手部的膚色,同時不影響產品顏色。
  4. 渲染、測量、調整、重複。兩次足夠。
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 代理人無法聽到音訊或親眼在手機上看到檔案。
  • 替換已上傳到某處的檔案後,重新上傳,從公開連結進行驗證,並更新任何指向舊檔案的排程內容。

發布前需要客戶的批准。

相關技能