Communitygithub.com

kaustubhupadhyaya/video-tool-router

在執行任何影片任務前,自動將任務路由到最合適的工具,包括剪裁、轉碼、去靜音、程式化組裝、調色、AI 編輯等,並支援 FFmpeg、auto-editor、MoviePy、DaVinci Resolve、Blender 及 Descript MCP 等多種平台。

video-tool-router 是什麼?

此技能的核心功能是作為一個智慧型影片任務路由器,在 Windows 筆電環境中,根據任務的本質(如純壓縮、校正性、創造性編輯)自動選擇成本最低且功能最匹配的影片處理工具。它支援的範圍極廣,從無損的串流複製(cut/trim/join/concat/remux 等)到借助 FFmpeg 的轉碼/縮放,再到使用 auto-editor 去除靜音、MoviePy 進行程式化組裝、DaVinci Resolve 進行高階調色/降噪/穩定/超分、Blender 製作 3D 標題/動態圖形,以及 Descript MCP 進行 AI 文字導向編輯。該技能特別針對 iPhone 的 HEVC 10-bit HLG HDR 素材進行了優化,包含一個 HLG 保護機制(HLG guard),避免在未經色調映射(tone-map)的情況下直接導出 SDR H.264 導致的色彩灰濛或顏色流失。其決策邏輯基於詳盡的性能基準測試(例如 VMAF 評分和處理時間),明確指出在純轉碼場景下,各工具品質差異極小(VMAF 均達 98.4-99.8),因此不應基於「品質更高」而選擇昂貴工具;唯有在需要色彩校正、創意調色、降噪、穩定或超分時,才值得調用 DaVinci Resolve(其成本約為 FFmpeg 的 15 倍)。技能提供了針對每個工具的、可直接複製貼上的精確命令和 Python 程式碼片段(如 FFmpeg、auto-editor、MoviePy、Blender 和 DaVinci Resolve API),並詳細說明了關鍵的注意事項(如 DaVinci Resolve 必須使用 Python 3.11、Blender 5.1 無法直接輸出影片、串流複製的關鍵幀精度限制等),確保開發者或 AI 代理能可靠地執行任務。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/kaustubhupadhyaya/editor-pack/tree/HEAD/skills/video-tool-router

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

影片工具路由器 (Video Tool Router)

選擇最能滿足任務需求的最便宜工具。在此機器上,轉碼品質受原始素材限制,且無顯著差異(所有工具的 VMAF 分數均在 98.4-99.8 之間),因此切勿僅因「品質較高」而為普通的轉碼任務選擇某個工具。僅在任務涉及校正或創作(如調色、色調映射、降噪、穩定、超解析度、多片段後期加工)時,才選擇 DaVinci Resolve — 這才是它發揮真正價值的唯一領域。使用它的成本是 FFmpeg 的約 15 倍(時間 + 更繁瑣的設定),而且它在調色、降噪、穩定、超分上的優勢是業界標準,並非下方基準測試所能涵蓋的(該測試僅涵蓋普通轉碼)。

決策樹(匹配第一個適用的規則)

  1. 無像素變化 — 剪裁 / 修剪 / 拼接 / 連接 / 封裝格式轉換 / 提取音訊 -> FFmpeg 串流複製 (-c copy)。約 1.2 秒,無損。最快的真正編輯操作 — 當像素無需改變時,始終優先使用。但有兩個注意事項:(a) 剪裁是關鍵幀精確,而非幀精確 — 起始點會對齊到最近的關鍵幀;若需要精確的幀邊界,則需重新編碼。(b) 輸出保留原始編碼格式 (HEVC) — 如果你需要 H.264 交付檔,此規則不適用;請轉至規則 2。

  2. 轉碼 / 縮放 / 壓縮(像素發生變化,無需校正)-> FFmpeg libx264。 預設參數 -preset medium -crf 20。當速度重要時使用 veryfast/ultrafast — 品質差異極小(ultrafast 的 VMAF 仍為 99.66)。僅在儲存空間或頻寬受限時才考慮 veryslow — 其計算時間是 ultrafast 的 40 倍,僅換來 +0.12 VMAF(肉眼不可見),但檔案大小幾乎減半。即便如此,medium 已能實現幾乎全部的壓縮效果(13.3 MB 對比 veryslow 的 12.6 MB),因此 veryslow 很少值得花費約 6 倍於 medium 的時間。

  3. 靜音 / 無聲片段移除(針對講話或教學音訊)-> auto-editor。 警告:在 HEVC 素材上非常慢(軟體解碼),且僅當音訊中確實存在空白間隙時才有幫助。對於連續音訊的素材(如騎行、道路、音樂片段)完全無用 — 它會耗時約 30 分鐘以上,最終剪掉 0 秒。

  4. 程式化組裝 — 透過 Python 進行腳本化剪輯 + 文字/疊加/轉場 -> MoviePy 2.x。 預計速度約為 FFmpeg 加上 Python 開銷。當合成邏輯用程式碼實作比用冗長的 ffmpeg filter_complex 更容易時使用此選項。

  5. 調色 / HLG->SDR 色調映射 / 降噪 / 穩定 / 超解析度 (SuperScale) / 多片段創意後期加工 -> DaVinci Resolve (透過 Python API)。 這是唯一「在 Resolve 中處理」是正確選擇的領域。時間約為 FFmpeg 的 15 倍,且輸出經色彩管理(非透明傳遞)。其在此領域的品質優勢是業界標準,下方基準測試未涵蓋。設定請參閱其專屬章節。

  6. 3D 標題 / 動態圖形 -> Blender 無頭模式 -> PNG 幀序列 -> ffmpeg 封裝。 注意:Blender 5.1 的渲染 image_settings.file_format 枚舉中沒有 FFMPEG/影片選項。請勿嘗試 image_settings.file_format='FFMPEG' 或腳本化 VSE 影片匯出 — 此版本無法使用。請渲染圖像幀,然後使用 ffmpeg 封裝。

  7. AI / 文字導向編輯(根據轉錄稿編輯、移除填充詞、"讓它更短")-> Descript MCP。

精確命令(可直接複製貼上)

1. 串流複製(無需重新編碼)

# 修剪:-t 為持續時間(秒,無歧義)。剪裁為關鍵幀精確,輸出保留 HEVC。
ffmpeg -ss 10 -i in.mov -t 15 -c copy out.mov
# 連接(list.txt 內容:file 'clip1.mov')
ffmpeg -f concat -safe 0 -i list.txt -c copy out.mov
# 封裝格式轉換 / 提取音訊(無重新編碼)
ffmpeg -i in.mov -c copy out.mp4
ffmpeg -i in.mov -vn -c:a copy out.m4a

(使用 -t <秒> 指定持續時間。避免在 -c copy 時使用 -ss ... -to ...:-to 的參考點在與輸入端搜尋搭配時可能產生歧義,導致長度錯誤。若需要精確的幀邊界,請移除 -c copy 並重新編碼 — 這將重新引入 HEVC 解碼的成本。)

2. 轉碼 HEVC -> H.264

# 預設平衡
ffmpeg -i in.mov -c:v libx264 -preset medium -crf 20 -c:a aac -b:a 192k out.mp4
# 速度優先(品質差異極小)
ffmpeg -i in.mov -c:v libx264 -preset veryfast -crf 20 -c:a aac -b:a 192k out.mp4
# 轉碼同時縮放至 720p
ffmpeg -i in.mov -vf scale=-2:720 -c:v libx264 -preset medium -crf 20 -c:a aac out.mp4

3. 靜音移除

auto-editor in.mp4 --edit audio:threshold=4% -o out.mp4
# 若不確定音訊是否有空白間隙,可先預覽:
auto-editor in.mp4 --edit audio:threshold=4% --preview

4. MoviePy 2.x(已更名的 API:subclipped / with_position / with_duration)

from moviepy import VideoFileClip, TextClip, CompositeVideoClip
clip = VideoFileClip("in.mov").subclipped(10, 25)
# 注意:MoviePy 2.x 的 TextClip 需要字型檔案路徑,而非字型系列名稱(如 "Arial")。
txt = (TextClip(text="Hello", font=r"C:\Windows\Fonts\arial.ttf", font_size=48, color="white")
       .with_duration(5).with_position("center"))
final = CompositeVideoClip([clip, txt])
final.write_videofile("out.mp4", codec="libx264", preset="medium",
                      ffmpeg_params=["-crf", "20"])

6. Blender 3D/動態圖形 -> 幀序列 -> 封裝

# 渲染動畫為 PNG 幀序列(不要在 5.1 版本設定 file_format='FFMPEG')
blender -b scene.blend -o "//frames/f_####" -F PNG -a
# 將幀序列封裝為 H.264(-framerate 需與場景影格率匹配)
ffmpeg -framerate 30 -i frames/f_%04d.png -c:v libx264 -preset medium -crf 20 -pix_fmt yuv420p out.mp4

HLG 保護機制(在任何 SDR H.264 導出前執行此檢查)

某些 iPhone 素材為 10-bit HLG。若未經色調映射,直接使用 libx264 導出為 SDR 會導致色彩灰濛 / 顏色流失。

# 1. 探測傳輸特性
ffprobe -v error -select_streams v:0 -show_entries stream=color_transfer -of default=nk=1:nw=1 in.mov
  • 輸出為 arib-std-b67 (HLG) 或 smpte2084 (PQ) -> 素材為 HDR:在編碼前/同時進行色調映射。
  • 其他值 (bt709, 未知) -> 已是 SDR:使用正常轉碼命令。
# 2. HLG/PQ -> SDR BT.709 色調映射 + H.264 一次完成(並標記輸出為 bt709)
ffmpeg -i in.mov -vf \
"zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p" \
-c:v libx264 -preset medium -crf 20 -color_primaries bt709 -color_trc bt709 -colorspace bt709 \
-c:a aac -b:a 192k out_sdr.mp4

npl=100 是用於線性化的標稱峰值亮度;若亮部高光出現裁切,可提高此值。替代方案:讓 DaVinci Resolve 的色彩管理進行 Rec.2020-HLG -> Rec.709 轉換(若你無論如何都要進行調色,請路由至 Resolve — 它比 ffmpeg 的 tonemap 更精確)。

DaVinci Resolve Python API 設定(校正/創作路徑)

以下已內建注意事項:必須在 Python 3.11 上執行(py -3.11)— 預設的 3.14 無法初始化 fusionscript.dll。RESOLVE_SCRIPT_API / RESOLVE_SCRIPT_LIB 是持久化的環境變數。Resolve 必須正在執行(或使用 -nogui 啟動)。使用一個臨時的專案,明確設定格式和編碼器,然後渲染並輪詢。

# 使用以下命令執行:  py -3.11 resolve_render.py
import os, sys, time
sys.path.append(os.path.join(os.environ["RESOLVE_SCRIPT_API"], "Modules"))  # 必需的標頭
import DaVinciResolveScript as dvr

resolve = dvr.scriptapp("Resolve")          # Resolve 必須正在執行(或先啟動 -nogui)
pm      = resolve.GetProjectManager()

proj_name = "temp_render_" + str(int(time.time()))   # 保留此名稱以便清理時匹配
proj    = pm.CreateProject(proj_name)
pool    = proj.GetMediaPool()
items   = resolve.GetMediaStorage().AddItemListToMediaPool([r"C:\in\clip.mov"])
tl      = pool.CreateTimelineFromClips("temp_timeline", items)   # 同時設為當前時間軸

# ---- 在此應用證明值得使用 Resolve 的精細處理 ----
# (調色 / HLG->SDR 的專案色彩管理 / SuperScale 超解析度 / 降噪 / 穩定)

proj.SetCurrentRenderFormatAndCodec("mp4", "H264")   # 明確指定格式 + 編碼器
proj.SetRenderSettings({
    "TargetDir": r"C:\out",
    "CustomName": "out",
    "SelectAllFrames": True,
})
pid = proj.AddRenderJob()
proj.StartRendering(pid)

while proj.IsRenderingInProgress():                   # 渲染 + 等待循環
    time.sleep(1)
print("render:", proj.GetRenderJobStatus(pid))

# 清理:在刪除臨時專案前,先關閉當前專案
pm.CloseProject(proj)
pm.DeleteProject(proj_name)                           # 匹配我們上面產生的名稱

環境變數(供參考 / 重新持久化):

RESOLVE_SCRIPT_API = C:\ProgramData\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting
RESOLVE_SCRIPT_LIB = C:\Program Files\Blackmagic Design\DaVinci Resolve\fusionscript.dll

在此機器上的實際效能

  • HEVC 軟體解碼是真正的瓶頸。 對 iPhone 素材的任何轉碼,無論使用何種工具都很慢;veryslow 處理 15 秒的 720p 片段耗時約 5 分鐘。每個工具都需支付相同的解碼成本 — 唯一的區別在於解碼後的操作。
  • 盡可能優先使用串流複製(約 1.2 秒),當無需像素變化(且 HEVC 輸出可接受)時。若必須重新編碼且速度重要,請使用 FFmpeg 的 ultrafast/veryfast(約 7 秒)。
  • DaVinci Resolve 的速度約比 FFmpeg 慢 15 倍,且輸出經過色彩管理(檔案更大,輸出與原始素材有意不同)。僅在需要調色/色調映射/降噪/穩定/超解析度/創意後期加工時值得使用。
  • auto-editor 在長 HEVC 片段上可能耗時超過 30 分鐘,且可能什麼都沒剪掉 — 僅在真正有停頓的對口型/教學音訊上執行。

經驗基礎(相信路由決策,而非小數點後第二位)

任務:修剪第 10-25 秒(15 秒),然後轉碼 HEVC->H.264 720p,序列執行以獲得公平的 CPU 計時,VMAF 對比未修改的原始素材。素材:iPhone HEVC 720p30(來自 9 個片段集合的一個代表性片段)。數字為單次執行(n=1),無重複 — 較大的差距(路由決策)是可靠的;較小的差距(例如 MoviePy 與 ffmpeg medium)在單次運行的噪音範圍內。

工具 / 設定時間大小VMAF結論
FFmpeg 串流複製 (-c copy, 保留 HEVC)1.2s11.0 MB無損最快;僅適用於剪裁/拼接/封裝轉換,無像素變化,輸出保留 HEVC
FFmpeg libx264 ultrafast crf207.4s22.3 MB99.66最快的真正轉碼;品質已達原始素材的上限
FFmpeg libx264 medium crf2047.9s13.3 MB99.71預設平衡;幾乎捕獲了所有大小優勢
FFmpeg libx264 veryslow crf20297s (~5 min)12.6 MB99.78+0.12 VMAF(肉眼不可見),比 medium 小約 0.7 MB — 僅在大小受限時有用
MoviePy (x264 medium crf20)53.5s13.4 MB99.44*約等於 ffmpeg 速度 + Python 開銷(差距在噪音範圍內);用於腳本化合成
Blender VSE 影片匯出失敗——5.1 版本無影片枚舉;需渲染幀序列 + ffmpeg 封裝
DaVinci Resolve (API, 預設 H264)109s48.2 MB98.40*約慢 15 倍,色彩管理;僅用於校正/創作
auto-editor (完整 81s 片段)2021s (~34 min)——剪掉 0 秒:音訊連續 — 工具選錯

* MoviePy 和 Resolve 的 VMAF 是在匹配的無修剪傳遞中重新測量的,因此它們與修剪後的 ffmpeg 行的比較並非完全對等。Resolve 的 48.2 MB 和 98.40 來自不同的傳遞(無修剪的重新測量產生 15.24 MB):Resolve 讀取的分數低於未修改的原始素材,因為它經過色彩管理,並非透明傳遞,且其較大的檔案是品質優先的預設位元率產物。CQ/大小匹配的 Resolve 渲染會改變這兩項比較 — 3.75 倍的大小是預設值依賴性的,而非固有的。

路由決策所基於的要點: (1) 普通轉碼品質無差異 — 不要追求它。(2) FFmpeg 預設的掃描是一個速度與位元率效率的權衡,而非品質的權衡。(3) 「最精細」僅在校正/創作工作中才有意義;在那個領域,DaVinci Resolve 是正確的工具(業界標準期望,此處未測量)— 其他情況則不然。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能