Communitygithub.com

kaustubhupadhyaya/video-tool-router

実行前に動画タスクを適切なツールにルーティングし、カット/トリミング/結合/トランスコード/無音除去、プログラムアセンブリ、カラーグレーディング/トーンマッピング/ノイズ除去/手ブレ補正/アップスケール、3Dタイトル/モーショングラフィックス、AIベース編集などを、最適なコストで実現します。

video-tool-router とは?

このスキルは、動画処理タスクを実行する前に、タスクの性質に基づいて最適なツールを自動的に選択するルーターです。FFmpeg、auto-editor、MoviePy、DaVinci Resolve(Python API)、Blender(ヘッドレス)、Descript MCPの中から最も安価かつ適切なツールを選び、無駄なコストと時間を削減します。特に、iPhoneのHEVC/10-bit HLG素材をSDR H.264に変換する際の色味劣化を防ぐためのHLGガードや、DaVinci Resolveの高コスト(FFmpeg比約15倍の時間)が正当化される修正・創造的作業(カラーグレーディング、トーンマッピング、ノイズ除去、手ブレ補正、アップスケール)のみをResolveにルーティングします。Windows環境での使用に最適化されており、各ツールの性能ベンチマーク(VMAF、処理時間、ファイルサイズ)に基づいた明確な決定木を提供します。

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Video Tool Router

タスクを完全に満たす最も安価なツールを選択します。このマシンでは、トランスコードの品質はソースに制限されており、差別化要因ではありません(すべてのツールでVMAF 98.4〜99.8)。したがって、単純なトランスコードでは「品質が高いから」という理由でツールを選ばないでください。DaVinci Resolveを選択するのは、タスクが修正的または創造的(グレーディング、トーンマッピング、ノイズ除去、手ブレ補正、アップスケール、マルチクリップ仕上げ)である場合のみです。これこそが、Resolveが適切なツールとなる唯一の領域です。ResolveはFFmpegの約15倍の時間とより重いセットアップを要し、グレーディング/ノイズ除去/手ブレ補正/アップスケールにおける優位性は業界標準の期待値であり、以下のベンチマークで測定されたものではありません(そのベンチマークは単純なトランスコードのみを対象としています)。

決定木(最初に一致するルールを適用)

  1. ピクセル変更なし — カット/トリミング/結合/連結/コンテナ変更/オーディオ抽出 -> FFmpeg ストリームコピー(-c copy)。約1.2秒、ロスレス。ピクセルを変更する必要がない場合、常に最速の編集方法です。ただし、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 vs veryslowの12.6 MB)。そのため、veryslowはmediumの約6倍の時間をかける価値はほとんどありません。

  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 mux。 注意:Blender 5.1のレンダーimage_settings.file_format列挙型には、FFMPEG/ビデオオプションがありません。image_settings.file_format='FFMPEG'やスクリプト化されたVSEビデオエクスポートを試みないでください。このビルドでは動作しません。画像フレームをレンダリングし、ffmpegでmuxしてください。

  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/モーショングラフィックス -> フレーム -> mux

# アニメーションをPNGフレームにレンダリング(5.1では file_format='FFMPEG' を設定しないでください)
blender -b scene.blend -o "//frames/f_####" -F PNG -a
# フレームをH.264にmux(-framerate をシーンのfpsに合わせる)
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ビット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、unknown)の場合 -> すでにSDR:通常のトランスコードコマンドを使用します。
# 2. HLG/PQ -> SDR BT.709 トーンマッピング + H.264 を1パスで(出力に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は720pの15秒に約5分かかりました。すべてのツールが同じデコードコストを支払います。差別化要因はデコード後に何が起こるかだけです。
  • ピクセル変更が必要ない場合(かつHEVC出力が許容される場合)は、ストリームコピー(約1.2秒)を優先してください。 再エンコードが必要で速度が重要な場合は、FFmpeg ultrafast/veryfast(約7秒)を使用してください。
  • DaVinci ResolveはFFmpegより約15倍遅く、出力をカラーマネージします(ファイルサイズが大きく、出力は意図的にソースと異なります)。グレーディング/トーンマッピング/ノイズ除去/手ブレ補正/アップスケール/創造的仕上げにのみ価値があります。
  • auto-editorは長いHEVCクリップで30分以上かかることがあり、何も削除しない可能性があります。実際に間があるトーキングヘッド/チュートリアル音声でのみ実行してください。

経験的根拠(ルーティングを信頼し、小数点第2位は信頼しない)

タスク:秒数10-25をトリミング(15秒)し、HEVC->H.264 720pにトランスコード。公平なCPUタイミングのためにシリアル実行。未加工のソースに対するVMAF。映像:iPhone HEVC 720p30(9クリップセットからの代表的な1クリップ)。数値は単一実行(n=1)、繰り返しなし — 大きな差(ルーティング)は確実ですが、小さな差(例:MoviePy vs 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 mux
DaVinci Resolve(API、デフォルトH264)109s48.2 MB98.40*約15倍遅い、カラーマネージド;修正/創造的のみ
auto-editor(フル81秒クリップ)2021s (~34分)——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.

関連スキル