Communitygithub.com

export-final(最終書き出し)

ユーザーが完成した動画ファイルを要求した場合に使用します。「出力して」「レンダリング完了して」「最終版を作って」「動画をレンダリングして」「最終エクスポートして」「動画を結合して」「YouTube用に仕上げて」「MP4をちょうだい」「export the final」「render the final cut」「make the master」「export for TikTok」「give me the mp4」などの指示に対応します。セグメントレンダリング(キャッシュ利用)、ガード付き連結、ワンパスオーディオ、ラウドネス正規化、シングルマルチプレクサをカバーします。

export-final(最終書き出し) とは?

このスキルは、動画編集プロジェクトの最終的な書き出し(エクスポート)を実行するためのものです。ユーザーが「レンダリングして」「最終版を出力して」などの自然言語指示を出したときに呼び出され、指定されたプロジェクトスラッグとプラットフォーム(YouTube、TikTokなど)に基づいて、完成した動画ファイル(MP4など)を生成します。スキル内部では、セグメントベースのレンダリングとコンテンツアドレス可能なキャッシュを活用して効率化を図っています。変更のないセグメントはキャッシュから再利用されるため、2回目以降のエクスポートは数秒で完了します。また、連結前の互換性チェック、2パスラウドネス正規化、正確なフレーム数や音声サンプル数の検証など、品質を保証するための堅牢な処理パイプラインを実装しています。このスキルは、`businessbaum/vedit` システムの一部であり、`python engine/ve.py` コマンドラインインターフェースと連携して動作します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/export-final

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

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

ドキュメント


name: export-final description: ユーザーが完成した動画ファイルを要求した場合に使用します - "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4" など。セグメントレンダリング(キャッシュ利用)、ガード付き連結、ワンパスオーディオ、ラウドネス正規化、シングルマルチプレクサをカバーします。 argument-hint: [project-slug] [platform] arguments: [project, platform]

export-final

完成したファイルを組み立てます。引数: $project スラッグ、$platform は output.platform をオーバーライドし、ユーザーが2つ目のデリバラブルを希望する場合に使用します。完全なリクエストは $ARGUMENTS に含まれます。空の $-プレースホルダは、スキルがスラッシュ呼び出しではなく自動トリガーされたことを意味します。その場合、セッションコンテキストの PIPELINE_STATE からプロジェクトを取得し、選択したプロジェクトを伝えます。動詞名はビルドコントラクトに従います。python engine/ve.py --help が優先されます。

レンダリングアーキテクチャ(確定事項)

  • ビデオ: セグメントごとに1つのキャッシュされたMP4/MKV、同一エンコードパラメータ、各セグメントはIDRフレームで開始し、-f concat -safe 0 -c copy で結合。ロスレスかつほぼ瞬時であることが確認済み。
  • オーディオ: タイムライン全体を1回の連続パスで pcm_s24le にレンダリング。セグメントごとにキャッシュされることはありません。
  • マルチプレクサは1回のみ、AACエンコードも正確に1回。

これをエクスポート時に再設計しないでください。特に、すべてのセグメントを単一の filter_complex に「簡略化」しないでください。150セグメントのグラフは約19,000文字になり、約260セグメントを超えるとWindowsコマンドラインがオーバーフローし、役立つエラーメッセージではなく起動できないプロセスになります。また、セグメントごとのキャッシュを捨てることになりますが、これこそが2回目のエクスポートを数秒で完了させる理由です。

フィルターグラフは常にファイルに書き込み、-/filter_complex fc.txt として渡します。長くなった場合だけでなく、無条件にこれを行います。

ステップ1 - プリフライト

エンコードを開始する前に:

  1. QCパスを実行します。QCに失敗するプロジェクトをエクスポートすると、パイプラインで最も長い操作を無駄にします。
  2. output.platform を確認します。これにより、ラウドネスターゲット、解像度、キャプションのセーフエリアが決まります。$platform が output.platform と異なる場合、プロジェクトを黙って変更しないでください。代わりに2つ目の出力パスをレンダリングし、どちらがどちらかを明示します。
  3. 計画を報告します: セグメント数、予想総フレーム数、予想時間、コーデック、およびこのパスでキャプションとグラフィックを焼き込むかどうか。

ステップ2 - セグメントのレンダリング

python engine/ve.py render $project

.cache/seg/ の下にセグメントごとにキャッシュされ、ソースのstrong key、入出力フレーム、フィルター、エンコーダー、ツールバージョンでキーが付けられます。変更されたセグメントのみが再レンダリングされます。--only seg_0012 で1つのセグメントを検査用にレンダリングします。

エンコーダーのデフォルト: h264_nvenc、cq 20、preset p6。このAdaカードのNVENCは、libx264と概ねVMAFで同等です(2 Mbpsで0.19 VMAF劣り、8 Mbpsで0.06優れている)が、2〜4倍高速です。プレビューには適切なデフォルトであり、最終版にも妥当な選択です。ユーザーがビットあたりの最大品質を求め、待つ意思がある場合にのみlibx264に切り替えてください。

どちらのエンコーダーも、このマシンでは実行ごとにバイトレベルで再現可能であり、これによってコンテンツアドレス可能なセグメントキャッシュが安全になります。

ステップ3 - 連結、ただし事前にガードする

concat_compatible() は、例外なくすべての -c copy 連結の前に実行します。 パラメータが一致しない場合、concatデマルチプレクサはexit 0で破損したファイルを出力します。警告もエラーもなく、10秒間再生してから崩れるファイルです。QCチェック(c) がこのチェックです。

すべてのセグメント間で、解像度、ピクセルフォーマット、コーデック、プロファイル、レベル、タイムベース、サンプルレート、チャンネルレイアウトを比較します。不一致がある場合、異なるパラメータでレンダリングされたセグメントがあることを意味します。通常、エンコーダー設定が変更される前の古いキャッシュエントリです。連結を強制するのではなく、該当するセグメントを再レンダリングしてください。

ステップ4 - オーディオとラウドネス

python engine/ve.py render $project

次に、output.loudnorm のプラットフォームターゲットに向けて2パス loudnorm を実行します(YouTube: I -14、TP -1.5、LRA 11。他のプラットフォームは異なり、presets/formats/ にあります)。

パス2では、明示的に -ar 48000 を指定する必要があります。 これを指定しないと、出力は暗黙的に192 kHzになります。loudnormの内部レートが出力に漏れ出し、ファイルは予想の4倍のサイズになり、一部のプレーヤーでリサンプリングがうまくいきません。これはチェーン全体で最も見落とされがちなフラグです。

1パスではなく2パス: 1パス loudnorm は動的な推定であり、静かな開始部分がある素材(これはベッド音のあるすべてのトーキングヘッドビデオに当てはまります)では、ターゲットから1デシベル以上ずれます。

ステップ5 - マルチプレクサは1回

ステップ2から5まではすべて ve render $project です。キャッシュされたセグメントをレンダリングまたは再利用し、それらを連結し、オーディオを1パスでレンダリングし、ラウドネス正規化を適用し、AAC 320kを projects/$project/out/final.mp4 に正確に1回だけ output.path に従ってマルチプレクスします。

マルチプレクサでビデオを再エンコードしないでください。画像に変更が必要な場合は、セグメントレベルで変更し、キャッシュが残りを処理します。

マルチプレクスの後、ve render はレンダリングされたオーバーレイを合成し、captions.burn_in が設定されている場合はASSを焼き込みます。この順序で行われるため、キャプションはグラフィックの上に表示されます。どちらもマスターを再エンコードするため、ve gfx と ve captions は ve render の前に実行するものであり、後ではありません。後で実行すると、マスターが1バージョン古いままになり、警告もありません。

ve export は別の後のステップです。完全なQCを実行し、失敗した場合は --force を指定しない限り拒否し、日付入りの配信用コピーにスタンプを押し、その隣に .manifest.json を書き込みます。

ステップ6 - デリバラブルを検証して引き渡す

計画ではなく、実際の出力ファイルに対して必須チェックを実行します:

  • フレーム数が、有効なセグメントの (out_frame - in_frame) の合計と一致する。QC (a)。
  • オーディオサンプル数が frames / fps * 48000 と一致する。QC (b)。
  • ebur128 統合ラウドネスがプラットフォームターゲットの0.5 LU以内、トゥルーピークが天井以下。QC (f)。
  • コンテナ、解像度、フレームレート、継続時間が output と一致する。
  • 3フレームをスポットチェック: 最初、中間のセグメント境界、最後。境界での黒フレームは、セグメントが短くレンダリングされたことを意味します。

次に報告: 出力パス、ファイルサイズ、継続時間、測定されたLUFSとトゥルーピーク、フレーム数、セグメント数、キャッシュから取得したセグメント数。stage を "export" に設定します。

2つ目のデリバラブル

縦型カットは、完成したファイルの再クロップではありません。それは異なる output.platform であり、異なるラウドネスターゲット、異なるキャプションプリセット、異なるセーフエリア、そして通常は異なるストーリーパスを意味します。16:9のマスターをスケーリングするのではなく、そのように伝えてください。

障害モード

症状原因修正
出力が再生され、その後途切れる、ffmpegがexit 0concatでのパラメータ不一致すべてのconcatの前に concat_compatible() を実行。該当セグメントを再レンダリング
マスターが192 kHzloudnorm パス2で -ar 48000 が欠落追加してパス2を再実行
エンコードプロセスが起動しないコマンドライン上のフィルターグラフ常に fc.txt を書き込み、-/filter_complex を渡す
ラウドネスがターゲットから1デシベルずれる1パス loudnorm2パス
エクスポートが毎回遅くなるエンコーダー設定の変更によりキャッシュが無効化意図した変更であることを確認
カット点で黒フレームセグメントが短くレンダリングされたそのセグメントを再レンダリング。QC (a) を確認
最終版でプレビューより声が小さいamix に normalize=0 がないオーディオグラフを修正し、オーディオを再レンダリング

Individual skills in this repo

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

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks for mechanical tightening of material that is already selected - "mach den Rohschnitt", "bau den Rohschnitt", "schneid die Ähms raus", "nimm die Füllwörter raus", "entferne die Pausen", "kürz die Pausen", "schneid die Versprecher raus", "mach den Radioschnitt", "straff das", "build the rough cut", "cut the fillers", "remove the ums", "tighten the pauses", "trim the dead air", "cut the retakes", "radio edit". Turns kept story blocks into enabled segments in project.json. Does not decide what the video is about - that is cut-story.

businessbaum/vedit

This skill should be used when the user asks to decide what the video is actually about before any mechanical cutting - "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". This is the CONTENT-selection pass that writes the "story" block in project.json; it runs after transcribe and before cut-rough.

関連スキル