2026年11月14日

月更短影音產線:從主題庫到批次腳本

短影音企劃

常見需求:希望每月固定產出多支短影音,內容可能包含情境、冷知識或幕後,目的是維持曝光與互動。這種案子容易卡在「每支都從頭想」,而不是單一支影片的特效。

本篇把工作收成三步:先建主題庫,再批次產出腳本卡,最後用同一套後製規格輸出。影片怎麼拍、能不能用生成畫面,放在後面幾篇分開寫。

這次測試到哪裡

batch_scripts.py 已在本機把 4 個主題循環擴成 8 張腳本卡,並確認鉤子、本體與結尾的秒數加總等於總長度。沒有實拍,也沒有呼叫任何生成影片服務。

三層怎麼分工

層做什麼
企劃準備主題庫:每列一個主題、形式與目標秒數。
腳本用腳本批次產出「鉤子/本體/行動呼籲」卡片。
後製規格統一直式比例與字幕位置,避免每支片重來一次。

主題庫與腳本卡

主題先求具體,不要寫「提升品牌形象」這種無法開拍的句子。形式可以是口播、清單或跟拍,秒數先訂在 15 到 25 秒,之後再依平台調整。

themes.csv
theme,format,seconds
產業冷知識,口播加字幕,20
常見使用迷思,一問一答,18
幕後準備,跟拍,22
客人最常問的三件事,清單,20
batch_scripts.py
#!/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 把素材轉成直式並截取秒數,已在本機用色塊測試片跑過。它不會幫你補足不夠長的素材,也不處理字幕燒錄。

make_vertical.sh
#!/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"

常見錯誤

下載