AI 影片延長後接起來會卡?不是幀重複,是動作斷了半秒 的文章封面

AI 影片延長後接起來會卡?不是幀重複,是動作斷了半秒

用前一段尾幀續生下一段,直接 concat 十之八九會「卡一下」。我們把貓與紙船的 02→03 接縫逐幀量了一遍:沒有一幀重複,是動作停了半秒。幀率怎麼驗、接縫怎麼分、切點怎麼定、54 幀是怎麼砍錯的,全部攤開。

教學
發布
更新

簡單講:直接接會卡,但不是你以為的那種卡。

事情是這樣的。貓與紙船那支片(完整故事在〈用 AI 做影片:一艘紙船來接一隻貓〉)分三段生成,每一段都拿前一段的最後一幀當下一段的首幀參考。Seedance 2.5 對這招很買帳,接縫兩邊的構圖幾乎黏在一起。導演看完 02 和 03 說:「03 的前幾幀跟 02 的尾巴好像有 overlap,你看一下剪的時候怎麼處理。」

我們真的一幀一幀去看了。結論:沒有 overlap,一幀都沒有重複。但它確實會卡。

「卡住」到底是什麼:半秒的死水

把 03 的前 240 幀逐一拿去比對 02 的最後 240 幀。如果真的有時間軸重疊,對應關係會畫出一條斜線:03 的第 10 幀像 02 的倒數第 30 幀、第 20 幀像倒數第 20 幀,依此類推。實際畫出來是一條平線。03 開頭的每一幀都最像 02 的最後一幀,而且相似度隨時間單調下降。沒有任何一段被重演。

真正發生的事,看兩段各自在演什麼就懂了:

  • 02 的結尾:紙船花了大約 5 秒,慢慢展開成一顆彩虹六角星。
  • 03 的開頭:星形收攏回紙船,然後紙船升空,貓跟著它走進街道深處。

收攏不是倒帶,它是紙船起飛的蓄力。問題出在 03 開頭那 0.5 秒幾乎不動。生成式影片從參考首幀起步時的通病,我們叫它緩啟動死水。直接接起來,觀眾看到的就是:星星開到頂、停半秒、才開始收。那個停頓,就是「卡住」「好像重複」的全部真相。

Cat Mobile 的 02 到 03 接縫比較圖。上排是直接串接,03 開頭約半秒幾乎不動;下排移除開頭 30 幀並加入 0.1 秒溶接;底部曲線顯示兩種剪法的逐幀運動量。

同一個 02→03 接縫。上排直接串接,03 開頭約半秒幾乎不動;下排砍掉 30 幀加 0.1 秒溶接。底部曲線是逐幀運動量,紅線掉進陰影帶的那半秒就是死水。

同一秒素材,0.5 倍速循環。左邊直接接,接縫後會停一下;右邊最終成片,一過接縫就繼續往前。慢放之後那半秒變成一整秒,肉眼不會錯過。

動手之前:先確認素材沒騙你

這一段本來不打算寫,是被一句話逼出來的:「我記得原影片是 60 吧?為什麼出來最終是 30?」

答案是沒有,檔案是真 60。顯示 30 的是剪映,它讀的是專案時間軸的幀率,不是素材的。但這句話讓我們回頭把三支素材全部量了一遍,然後量出兩件真的事。

先講方法。一支影片有三個「幀率」,它們不是同一件事:

幀率 是什麼 誰能改它
容器 fps mp4 標頭寫的數字 任何人、任何工具,寫什麼都行
幀密度 幀數 ÷ 時長,容器裡真的裝了這麼多幀 補幀、重包裝
有效 fps 扣掉「跟前一幀幾乎一樣」的幀之後,真正在動的 只有像素本身

30 fps 的內容硬包成 60 fps 的容器,前兩個數字都會乖乖顯示 60,只有第三個會說實話。

偵測灌水幀不能數「diff 等於 0 的幀」。複製幀一旦重編碼就會帶進壓縮雜訊,diff 落在 0.02 到 0.15 之間,任何絕對門檻都會漏。我們改看相位結構:每 P 幀裡固定有幾幀沒動,這個週期性簽名壓縮殺不掉。實測灌水素材的奇偶相位差是 7.5 倍,真素材是 1.1 倍,差距大到不用猶豫。

量出來的兩件事:

素材 幀數 幾乎不動的幀 判讀
cat_mobile_01 722 2(0.3%) 乾淨的 60
cat_mobile_02 1020 137(13.4%) 停滯幀,有效流暢度約 52 fps
cat_mobile_03 1082 1(0.1%) 乾淨的 60

02 那 13.4% 的停滯幀總是成對出現,間隔 8 到 12 幀不等,前後的幀都正常。這不是幀率轉換(30 轉 60 會有 50% 的複製幀,而且 diff 是 0),是單次生成的隨機瑕疵。同一批素材裡通常只有某一段中招,重生成那段就乾淨了。我們沒重生成,因為 13% 在動態畫面裡看不太出來(也因為老闆的 token 是有數的)。

第二件事更尷尬。橫版的 03 打開一看:854×480、24 fps、433 幀。它是預覽版。生成平台通常同時提供預覽和高清,檔名可能一模一樣。拿預覽版去接,放大 3.7 倍會糊掉,24 幀併進 60 幀的時間軸得靠補幀,補不回來。乖乖回去重新下載。這一步現在是我們流程裡的第一步,沒有例外。

接縫只有三種,剪法完全相反

弄錯會做出反效果,所以先分類再動刀:

類型 簽名 處理
不同鏡位 03 首幀對 02 每一幀的相似度,都跟隨便兩張無關畫面差不多 硬切,不要加轉場
構圖延續 03 首幀最像 02 的尾幀,之後的對應曲線是平線 砍掉死水,短溶接
真重疊 對應曲線是斜線,03 在重演 02 的動作 砍掉被重演的段落

判別的關鍵是那條對應曲線,而且要有對照組:任意配對的 MAE 中位數。沒有對照組,你不知道「MAE 11.6」算像還是不像。以直版為例,03 首幀對 02 尾幀是 11.6,對照組中位是 46.6,這叫像;01→02 的接縫全部落在 50 上下,跟對照組同一級,那是換鏡,本來就該硬切,不用動。

只比對單幀分不出構圖延續和真重疊,而它們的剪法是相反的:一個砍新段的頭,一個砍舊段的尾。

切點看比值,不看絕對值

構圖延續的情況下,唯一要決定的是砍幾幀。我們的判準只有一條:

接縫後 0.6 秒的運動量 ÷ 接縫前 0.6 秒的運動量,要趨近 1。

低於 0.75 是死水,動作接不上;高於 1.4 是暴衝,砍過頭,動作突然加速。直版的數字:不砍是 0.54,砍 30 幀是 1.45。

這條規則是踩出來的,而且踩得不輕。橫版素材看起來跟直版一模一樣,我們照直版的邏輯只看 03 自己的曲線,「前低後高」,一定是緩啟動,推出要砍 54 幀。

正解是 0。

橫版 02→03 不砍 砍 30 幀 砍 54 幀
接縫後 ÷ 接縫前 0.93 0.99 1.59

橫版的 02 結尾本來就慢(運動量 0.48,直版是 0.83),所以 03 開頭的 0.45 是匹配的,不是死水;它後面爬到 2.0 不是「緩啟動結束」,是貓真的開始跟著紙船走了。同一條曲線配不同的基準線,結論完全相反。兩批素材看起來一模一樣,切點是 30 和 0,不能互相套。這一球算我們的。

即使切 0 幀,仍然留 0.1 秒交叉溶接。續生的片段跟前段尾幀有材質和光影差異(MAE 通常 10 到 13),硬切會閃一下;構圖既然重合,溶接不會有鬼影。

三個 FFmpeg 地雷

串接一次編碼完成,中間不落地,避免二次編碼掉畫質。但這條 filter 鏈有三個地雷,會踩到是因為它們失敗的方式都不直觀:

  1. concat 的輸出接 xfade 之前必須 fps=60,settb=AVTB 否則報 Error reinitializing filters,訊息裡完全沒提 timebase,而且兩步分開跑都正常,只有串起來才死。
  2. 音訊每一路都要 aformat 統一取樣格式。 否則 AAC 編碼器回 -22 Invalid argument,看起來像編碼器壞了。
  3. xfadeoffset 算錯不會報錯。 FFmpeg 照樣 exit 0,只是把轉場放到錯的時間點,播出來才發現。前兩個會大聲報錯,好排查;這個靜默失效。所以腳本裡改成從 ffprobe 讀時長自動算,並把算出來的值印在螢幕上。

剪完要驗,而且不能只看標記

  • 時長對帳:成片時長等於各段時長總和減去砍掉的秒數、再減溶接秒數,誤差在幾幀內。直版:12.033 + 17.020 + 18.033 − 0.5 − 0.1 = 46.49,實際 46.50。
  • 接縫定格:抽接縫前後幾幀並排目視,確認溶接沒有鬼影、硬切連戲。
  • 有效 fps:成片再量一次,應與素材相同。直版成片 2789 幀只有 2 幀重複。
  • 音訊分段量測:沿全片抽幾個點跑 volumedetect,確認沒有靜音段或爆音。注意它的輸出是 info 級,-v error 會什麼都看不到。

定格目視和運動量曲線都不等於實際播放過一遍。這句話要老實講。

工具都開源了

驗素材、診斷接縫、串接三個腳本,連同上面每一條踩出來的判準,都放在公開的 Curtoom video-clip-stitching skill,Claude Code 和 Codex 一行就能裝。老實說這整套東西的起點是導演那句「欸?我以為可以用 FFmpeg 處理啊?」,全程真的只有 FFmpeg,沒開任何剪輯軟體。

Storyboard 管生成前,怎麼寫分鏡讓鏡頭接得上,看〈用簡單 Storyboard 讓每個鏡頭接得上〉;八格分鏡對成片的逐格驗收,看〈AI 生成影片真的會看故事板?〉。這篇只管拿到三段成片之後的那 0.5 秒。

系列文章 SERIES用 AI 做影片4
  1. 01用 AI 做影片:提示詞就是你的影片
  2. 02用 AI 做影片:先決定從文字、圖片還是腳本開始
  3. 03用 AI 做影片:讓每個鏡頭接得上的簡單 Storyboard
  4. 04用 AI 做影片:一艘紙船來接一隻貓,我們真的把它拍出來了
推薦閱讀 RECOMMENDED
教學用 AI 做一支短片:從腳本到成片的完整工作流,以及它真正的成本教學用 AI 做短影音:腳本、分鏡、分段生成到剪輯,做完一支直式短片