reframe 是做什麼的?
將他人的橫式素材重新構圖為直式或方形影片,看起來就像原本就是為那個形狀拍攝的:在每一刻,觀眾看到的都是鏡頭的重點,而不是旁邊的牆壁,也不是半張臉。
它的定義
每個鏡頭根據自己的內容來構圖。一個從頭到尾統一的中央裁切,無論多麼整潔,都不算數;將整個橫式畫面縮小放在模糊的黑色條紋之間,也不算數。
必須符合的條件
- 先測量,再審視。 每個裁切視窗都來自測量結果,以及你親眼觀察這些畫面的判斷。測量可能出錯;畫面說了才算。
- 主體保持完整。 臉部、說話者、移動中的物體以及重要的文字,都必須留在畫面內,並且周圍留有空間。當兩樣東西都很重要且無法同時容納時,畫面會留給當下最重要的那個(誰在說話、什麼在移動、旁白提到了什麼),而觀看者會聽到被省略的部分。
- 平穩構圖。 靜止的主體在該鏡頭中只會有一個固定的裁切視窗。只有當主體移動時,視窗才會移動:在上次移動至少一秒後進行一次乾脆的重新定位,或者進行流暢的跟隨;絕不允許漂移或抖動的裁切。
- 保持原始素材原樣。 使用
#t=修剪同一檔案,並透過剪輯自身的 CSS(object-fit: cover搭配object-position,或使用translate移動的素材形狀盒子)進行裁切;絕不重新編碼、不裁切為新檔案,也不改變速度。同一鏡頭的片段彼此首尾相接,因此鏡頭的聲音可以連續不中斷地播放。
你擁有的工具
node <此技能資料夾>/scripts/reframe.mjs <影片> --aspect 9:16 --src assets/<檔案>(在影片資料夾中執行)會寫入 reframe/<名稱>.json、一個審核頁面以及 reframe/<名稱>-sheet.jpg。它會找出各個鏡頭,每秒十次評估動態(已扣除攝影機本身的移動)、細節、色彩對比和膚色,並為每個鏡頭指定一個 fixed(一個片段)、split(同一檔案的多個片段,每個至少一秒,各有自己的位置)或 whole(素材本身的形狀),同時準備好附帶各自來源秒數的 <video> 行。
閱讀它列印的每一張檢視表(look: … (Read it))。 每張圖片都是一個時間點(每個片段的開始、標記為 WEAKEST 的最弱時刻,每隔 1.5 秒一張):畫面中標示出裁切視窗的輪廓,外部區域變暗,顯示畫面尺寸的百分比標尺,以及影片最終呈現的裁切結果。如果主體位於視窗外部或被視窗切割,請自行設定 object-position;輸出會提供計算公式。held 表示視窗與測量結果一致的程度,並非主體確實在視窗內的證明。標記為 ! 的行表示需要特別留意的地方。
流暢跟隨 (--follow): 使用 @keyframes follow-N 表示分割鏡頭路徑的 translate,以及套用該動畫的一個 <video> 片段,這些也會寫入 reframe/<名稱>-follow.css。將這些關鍵幀放入 film.html 的 <style> 中。動畫會根據片段自身的 at 時間來運行:一個從鏡頭開始後 a 秒處開始修剪的片段,其 animation-delay 會設為 -a s。該片段保留自身的聲音。
修剪一個鏡頭 只保留新的 #t= 範圍內的片段,外側的兩個片段會被裁切到該範圍,位置保持不變。
影片寫好後進行檢查: 在影片資料夾中執行 node <此技能資料夾>/scripts/reframe.mjs check,它會讀取 film.html 自身的裁切設定,並列印出每個視窗、移動時間、每次重新定位、視窗保留最少測量內容的時刻,並將它們繪製在一張檢視表中。它會列出違反上述規則的項目,並標記 !。修正每個 ! 標記的項目,然後再次執行。
影片的形狀由其 viewport 決定(<meta name="viewport" content="width=1080, height=1920">)。執行 npx openfilm look 來預覽裁切後的影片。
與使用者合作
以使用者的需求為優先:他們想要的形狀(當他們說直式時就是 9:16)、必須包含在內的鏡頭、任何必須保留在畫面中的元素(產品、標誌、第二位說話者)。在不耽誤工作的前提下提問。完成後,針對每個鏡頭說明:held 值、每個 ! 行、每個你移動過的視窗及其原因,以及裁切後遺漏了什麼內容。