launch-video-kit 是做什麼的?
六個用來處理影片中非設計部分的元件:音訊、字幕與 攝影機。README 是參考文件(解釋每個決策背後的原因及其支援數據)。 以下為工作順序以及容易忽略的規則。
順序很重要
- 先處理語音,再進行剪輯。
gen-voice.mjs會以影格為單位輸出每句臺詞的實際持續時間。這些數字決定了場景的時長。如果您先剪輯,每個實際的鏡頭都會使您的剪輯失準,必須重做。 - 接著處理音樂,根據其能量曲線選擇片段(
analyze-music.mjs),必要時加以延長(loop-music.mjs)。 - 然後進行剪輯,並對齊分析結果所輸出的小節網格。
- 最後才處理字幕,因為此時您才知道哪些句子有螢幕上的標題,哪些沒有。
容易被忽略的規則
- 每個檔案只包含一句臺詞。 絕不要使用一個長鏡頭。
- 只為未顯示在螢幕上的文字加上字幕。 如果句子已經出現在標題中,加上字幕會在相同位置重複顯示文字。
- 字幕的
dur是閱讀時間,而非語音的持續時間。請手動調整範圍,確保前一個字幕不會壓到後一個,也不會壓到後續的標題。 DUCK.base不超過約 0.85。 素材庫的音軌通常為 0 dB,任何額外的效果都會導致削波。- 攝影機:保持靜止,僅短暫移動。 避免持續漂移(會分散注意力)或生硬的剪輯(會造成跳動)。每個場景的起始構圖應與前一個場景的結束構圖相同。
- 接縫兩側使用相同的介面與元件。 如果某個場景是手動繪製的,它會在細節上產生差異,而這個差異在切換區塊時會突然出現。
- 對時間進行迭代,而非對內容。 如果對內容陣列進行迴圈,並索引一個較短的時間陣列,只要移除一個節拍就會導致渲染失敗。
用驗證取代猜測
代理人無法觀看或聆聽影片。所有看似主觀的判斷都有對應的數值:
# 分段檢查混音:語音與音樂混合時,應該與僅有語音時測量結果相同
ffmpeg -hide_banner -ss 27 -t 4 -i out.mp4 -af volumedetect -f null /dev/null
# 全域峰值必須低於 -1 dB
ffmpeg -hide_banner -i out.mp4 -af volumedetect -f null /dev/null
# 使用 contact sheet 而非逐格檢查
ffmpeg -v error -i f_%d.png -vf "scale=560:-1,tile=5x4" -frames:v 1 sheet.png
loop-music.mjs 會自動驗證其自身的接縫:如果任何接縫未落在靜音處,它會發出警告,必須選擇另外兩個間隙重新進行。
環境
- 需要在 PATH 中安裝
ffmpeg與ffprobe,並且 Node 版本為 20 或以上。 - 在 Windows 上的 Git Bash 中:
ffmpeg不支援glob模式,且drawtext會因缺少 fontconfig 而失敗。請使用編號序列。此外,bc也不可用。 - Remotion 的
staticFile()無法妥善處理空格與重音符號:請將素材重新命名為 ASCII 字元。 - 在
<Sequence>內部,useVideoConfig().durationInFrames回傳的是該序列的持續時間,而非整個影片的持續時間。請勿將其與絕對影格數混淆。
無法做到的事
TTS 只能產生語音,無法產生呼吸聲。嘆息、笑聲與音效必須另外錄製。合成音效(blips)可以用 ffmpeg 產生,README 中有相關範例。