月更短影音產線:從主題庫到批次腳本
短影音企劃
常見需求:希望每月固定產出多支短影音,內容可能包含情境、冷知識或幕後,目的是維持曝光與互動。這種案子容易卡在「每支都從頭想」,而不是單一支影片的特效。
本篇把工作收成三步:先建主題庫,再批次產出腳本卡,最後用同一套後製規格輸出。影片怎麼拍、能不能用生成畫面,放在後面幾篇分開寫。
這次測試到哪裡
batch_scripts.py 已在本機把 4 個主題循環擴成 8 張腳本卡,並確認鉤子、本體與結尾的秒數加總等於總長度。沒有實拍,也沒有呼叫任何生成影片服務。
三層怎麼分工
| 層 | 做什麼 |
|---|---|
| 企劃 | 準備主題庫:每列一個主題、形式與目標秒數。 |
| 腳本 | 用腳本批次產出「鉤子/本體/行動呼籲」卡片。 |
| 後製規格 | 統一直式比例與字幕位置,避免每支片重來一次。 |
主題庫與腳本卡
主題先求具體,不要寫「提升品牌形象」這種無法開拍的句子。形式可以是口播、清單或跟拍,秒數先訂在 15 到 25 秒,之後再依平台調整。
theme,format,seconds
產業冷知識,口播加字幕,20
常見使用迷思,一問一答,18
幕後準備,跟拍,22
客人最常問的三件事,清單,20#!/usr/bin/env python3
"""把主題表展開成固定結構的短影音腳本卡。"""
from __future__ import annotations
import argparse
import csv
import json
import sys
from pathlib import Path
def split_seconds(total: int) -> tuple[int, int, int]:
hook = max(3, min(5, total // 6))
cta = max(3, min(5, total // 6))
body = total - hook - cta
if body < 6:
body = total - 6
hook, cta = 3, 3
return hook, body, cta
def main() -> int:
parser = argparse.ArgumentParser(description="批次產出腳本卡")
parser.add_argument("input", type=Path)
parser.add_argument("-o", "--output", type=Path, required=True)
parser.add_argument("--count", type=int, default=0, help="若主題不足,循環補到這個數量")
args = parser.parse_args()
with args.input.open(encoding="utf-8-sig", newline="") as handle:
themes = list(csv.DictReader(handle))
if not themes:
print("沒有主題。", file=sys.stderr)
return 1
target = args.count or len(themes)
cards = []
for i in range(target):
src = themes[i % len(themes)]
total = int(src.get("seconds") or 20)
hook, body, cta = split_seconds(total)
cards.append(
{
"index": i + 1,
"theme": src["theme"],
"format": src.get("format", ""),
"total_seconds": total,
"hook_seconds": hook,
"body_seconds": body,
"cta_seconds": cta,
"hook": f"用一句話點出「{src['theme']}」為什麼值得看完。",
"body": f"用 {body} 秒講完重點,只留一個例子。",
"cta": "用一句話告訴觀眾下一步:留言、收藏,或看置頂說明。",
}
)
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(cards, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(f"寫出 {len(cards)} 張腳本卡到 {args.output}")
return 0
if __name__ == "__main__":
sys.exit(main())執行
python batch_scripts.py themes.csv -o scripts.json --count 8後製先定規格,再談特效
常見做法是輸出直式 1080×1920,重點字放在畫面中上,避免被各平台介面擋住。精確的安全框與音訊規範請以你要發布的平台當下說明為準。若要用音樂,請使用你有權使用的曲目或平台提供的音樂庫,並核對該曲是否允許商業使用;不要直接抓來路不明的伴奏。
本站附的 make_vertical.sh 可用 ffmpeg 把素材轉成直式並截取秒數,已在本機用色塊測試片跑過。它不會幫你補足不夠長的素材,也不處理字幕燒錄。
#!/usr/bin/env bash
# 把影片裁成直式 1080x1920,並可選擇截到指定秒數。
# 依賴:ffmpeg(測試環境為 7.1.5)
set -euo pipefail
if [[ $# -lt 2 ]]; then
echo "用法:$0 輸入.mp4 輸出.mp4 [秒數]" >&2
exit 2
fi
IN="$1"
OUT="$2"
SECONDS_LIMIT="${3:-}"
FILTER="scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1"
ARGS=(-y -i "$IN" -vf "$FILTER" -c:v libx264 -pix_fmt yuv420p -c:a aac -movflags +faststart)
if [[ -n "$SECONDS_LIMIT" ]]; then
ARGS+=(-t "$SECONDS_LIMIT")
fi
ARGS+=("$OUT")
ffmpeg -hide_banner -loglevel error "${ARGS[@]}"
echo "已寫出 $OUT"常見錯誤
- 還沒有主題庫,就先討論要用哪一家生成工具。
- 10 支影片其實是同一個鉤子改標題,觀眾很快看出來。
- 每支片的比例、字幕位置與音量都不一樣,後製時間被放大。
- 為了趕進度使用未授權音樂,或把別人的影片當素材。