ffmpeg 自動拼接成片 · Auto-assemble with ffmpeg
storyboard.json → 配音(edge-tts)→ 每鏡 Ken Burns / 影片裁切 → xfade 轉場 → ASS 字幕花字 → BGM 閃避混音 → 兩遍 loudnorm(-14 LUFS)→ out/video.mp4 + .srt。
屬於 ecommerce-video-skills 一部分 · 腳本都在本目錄
scripts/:assemble.py(主程式)·tts_edge.py·make_subs.py·make_bgm.py(免版權合成 BGM)·make_cards.py(PIL 商品卡/結尾卡)
輸入 Inputs
storyboard.json(可由selling-point-storyboard生成),素材路徑相對於該檔案- 環境:Python 3.9+,
pip install pillow numpy edge-tts,ffmpeg(含 libass),CJK 字型
快速開始 Quick start
pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4 # 倉庫自帶範例,約 30 秒渲染完
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4 # 離線預覽(無配音,按字數估時)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4 # 主圖影片 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3 # 用你有版權的音樂
storyboard 欄位 Fields
| 欄位 | 說明 |
|---|---|
頂層 voice / rate / pitch | edge-tts 音色、語速(如 +10%)、音調 |
頂層 bgm | "auto"(內建合成,免版權)/ 音樂檔案路徑 / null |
頂層 tag | 全程左上角貼紙(品牌/型號/「演示」) |
image 或 video (+start) | 素材;影片從 start 秒截取本鏡時長 |
line | 配音文本;鏡頭時長 = 配音 + 0.15s 前導 + pad |
sub | 字幕(預設同 line);"" 表示本鏡不出字幕;**高亮**、` |
title / cta | 花字 / 行動呼籲按鈕 |
motion | zoom_in zoom_out pan_left pan_right pan_up pan_down punch static |
fit | auto(比例接近則裁滿,否則模糊填充)/ cover / blur |
transition | 進入下一鏡的 xfade 名:fade slideleft slideup smoothleft circleopen wipeleft … |
min / duration / pad | 最短時長 / 固定時長 / 句後留白(秒) |
步驟 Steps
- 檢查素材都存在、比例合適(商品圖 ≥ 1000px);缺結尾卡就用
make_cards.py產生:python scripts/make_cards.py --image main.png --name "商品名" --points "賣點一|賣點二|賣點三" -o assets/end-card.png - 先
--tts none跑一遍看畫面節奏,再正式渲染。 - 渲染後抽幀檢查:
ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png - 交給
platform-spec-export導出各平台版本;用cover-title-ab做封面。
流水線細節 How it works
- Ken Burns:逐幀
scale(eval=frame)+crop,比zoompan抖動小;punch= 0.35 秒快速推近(鉤子專用)。 - 轉場:每鏡多渲染半個轉場長度,xfade 居中在鏡頭分界,配音起點不被轉場吃掉。
- 混音:配音按鏡頭起點放置;BGM 預設 -20 dB,有人聲時再壓 10 dB(平滑閃避);先壓縮/限幅再兩遍 loudnorm 到約 -14 LUFS、TP -1.5 dB。
- 字幕:用真實配音時長產生
build/timing.json→make_subs.py→ libass 燒錄,同時導出.srt。
檢查清單 Checklist
- 成片時長、解析度、幀率正確(
ffprobe out/video.mp4) - 抽 3 幀:字幕不壓商品、不進底部 UI 區
- 聽一遍:配音清楚、BGM 不搶、開頭無爆音
- BGM 有商用授權(
auto合成音樂可放心用) - 素材(圖片/影片/字型)有使用授權
常見問題與修復 Failure fixes
| 問題 | 修復 |
|---|---|
ffmpeg failed | 看腳本印出的 stderr 末尾;常見是路徑錯誤或 ffmpeg 缺 libass/libx264 |
| 畫面邊緣糊 | 素材解析度太低;換 ≥1080px 圖片或減小 motion 幅度(改 static) |
| 商品被裁掉 | 該鏡設 "fit": "blur" |
| 轉場處聲音被切 | 不會發生(配音按鏡頭起點對齊);若自訂了 duration 過短,加長即可 |
| 渲染慢 | 預設已用 veryfast 中間檔案;最終編碼可把 -preset medium 改為 fast |
| 想要 1:1 / 16:9 | --size 1080x1080 / --size 1920x1080,字幕字型大小自動按比例 |
參考與致謝:思路受 MoneyPrinterTurbo(MIT)「腳本→配音→字幕→合成」流水線啟發,本實作為獨立編寫的純 ffmpeg 版本,未複製其程式碼。