Communitygithub.com

add-intro-outro

完成した動画にブランドのイントロ・アウトロを追加し(手持ち撮影の動画にはオプションでvid.stab手ブレ補正を適用可能)、動画の向きに合わせて16:9または9:16のスティングを選択、さらに縦向き動画から16:9の横長版(背景ぼかし付き)を生成します。

add-intro-outro とは?

このスキルは、ユーザーの動画編集ワークフローにおいて、ブランド用のイントロ・アウトロクリップ(スティング)を既存の動画の先頭と末尾に追加する処理を自動化します。対応するスティングは、横向き(16:9)と縦向き(9:16)の2組をプリファレンスで設定でき、動画の実際の表示向き(回転タグを含む)を自動判別して適切なペアを選択します。また、縦向きスマホ動画からYouTubeメインフィード向けの16:9横長版を、中央に動画を配置し背景をぼかしたスタイルで生成する機能も内蔵しています。さらに、手持ち撮影の動画に対する軽量な手ブレ補正(vid.stab)を同一レンダリング処理内で行うオプションを提供し、品質劣化を抑えながら自然な動きを実現します。編集・レンダリングはffmpegを用いて行われ、負荷の高いエンコードはModal上で実行するよう設計されており、ローカル環境への負荷を軽減します。このスキルは主にClaude Code上で動作するプラグインとして提供され、動画の最終書き出しやブランド統一に活用されます。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/danielrosehill/Remote-Video-Editing/tree/HEAD/skills/add-intro-outro

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

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

ドキュメント

イントロとアウトロの追加

スティングは短いMP4ファイルで、それぞれ独自のジングルがあり、向きごとに1組がプリファレンスに設定されています。このスキルは、すべてを同じフォーマットに正規化し、イントロ、動画、アウトロを短いクロスフェード(映像および音声)で結合し、結果をレンダリングします。

プリファレンス

remote-video-editing/preferences.json(検索順序は clean-voice-sidon と同様)

キー意味
stings{"intro_16x9": url, "outro_16x9": url, "intro_9x16": url, "outro_9x16": url};URLまたはローカルパス
sting_fade_sクロスフェード長、デフォルト 0.5
render_notes長時間エンコードをどこで実行するか(例:ラップトップではなくサーバー)。これに従うこと。

stings が設定されていない場合は、ファイルをユーザーに確認してください。このプラグインにはブランドアセットは同梱されていません。

向き

表示上の向きを読み取ってください。コード上のサイズではありません。スマートフォンは縦向き動画を1920x1080で回転タグ付きで保存します。以下で確認してください。 ffprobe -v error -select_streams v:0 -show_entries stream=width,height:stream_side_data=rotation -of compact IN 回転が90または-90の場合、幅と高さが入れ替わります。ffmpegはデコード時に自動的に回転を適用します。

  • 縦向き(9:16)動画:intro_9x16 / outro_9x16 を使用、キャンバス 1080x1920。
  • 横向き動画:16:9のペアを使用、キャンバス 1920x1080。
  • 縦向き動画の16:9カット(YouTubeメインフィード用):キャンバス 1920x1080、動画は高さ1080で中央にスケール、その上に自身のぼかし・暗く・ズームされたコピーをオーバーレイ;16:9のスティングを使用。以下の [v1] チェインは次のようになります。
    [1:v]fps=30,split[a][b];
    [a]scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,scale=480:270,boxblur=20:2,scale=1920:1080,eq=brightness=-0.06:saturation=0.9[bg];
    [b]scale=-2:1080[fg];[bg][fg]overlay=(W-w)/2:0,setsar=1,format=yuv420p[v1]
    
    8秒カット(-ss 60 -t 8)でテストし、全体をレンダリングする前に1フレームを表示してください。

レンダリング

W:H はキャンバス、F はフェード長(0.5)、DI はイントロの長さ、DV は動画の長さ(ffprobe format=duration)。オフセット:最初のフェードは DI-F、2番目のフェードは DI+DV-2*F。

ffmpeg -y -i intro.mp4 -i main.mp4 -i outro.mp4 -filter_complex "
 [0:v]fps=30,scale=W:H,setsar=1,format=yuv420p[v0];
 [1:v]fps=30,scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p[v1];
 [2:v]fps=30,scale=W:H,setsar=1,format=yuv420p[v2];
 [0:a]aresample=48000,aformat=channel_layouts=stereo[a0];
 [1:a]aresample=48000,aformat=channel_layouts=stereo[a1];
 [2:a]aresample=48000,aformat=channel_layouts=stereo[a2];
 [v0][v1]xfade=transition=fade:duration=F:offset=DI-F[v01];
 [v01][v2]xfade=transition=fade:duration=F:offset=DI+DV-2*F[v];
 [a0][a1]acrossfade=d=F[a01];[a01][a2]acrossfade=d=F[a]" \
 -map "[v]" -map "[a]" -c:v libx264 -preset medium -crf 20 -maxrate 10M -bufsize 20M -c:a aac -b:a 192k -movflags +faststart out.mp4
  • 複数のソースクリップがある場合:最初に結合してください(同じフィルターパターン、または同一コーデックの場合は concat デマルチプレクサを使用)。その後、結果を main.mp4 として扱います。
  • これはフル再エンコードです:10分の1080p動画で数分間、全コアを消費します。Modal上で実行してください。ローカルやホームサーバーでは実行しないでください。-filter_complex から +faststart までの引数を1行ずつ render.args に書き、実行します。 $MODAL run "${CLAUDE_PLUGIN_ROOT}/scripts/ffmpeg_modal.py" --inputs intro.mp4,main.mp4,outro.mp4 --args-file render.args --out out.mp4 (modal_command と run_notes はプリファレンスから取得)。複数のクリップを個別のパスではなく、同一グラフ内(concat フィルター)で結合してください。ジョブ終了後、volume video-editing-work 内のジョブフォルダを削除してください。
  • xfade は両方の入力が同じタイムベースである必要があります:すべてのビデオブランチ(concat の後も含む)に fps=30,settb=1/30 を付けるか、そうでなければ ffmpeg が "First input link main timebase (1/30) do not match" で失敗します。
  • ビットレート:上限を守ってください(-crf 20 -maxrate 10M -bufsize 20M)。ノイズの多いスマホ映像にプレーンなCRF 18を使用すると、24 Mbps、約2 GB / 11分になりました(2026-11-13)。YouTubeは再エンコードするため、1080pアップロードには8-12 Mbpsを推奨しています。
  • 確認:出力時間は約 DI + DV + DO - 2*F になり、DI-F/2(フェード途中)、中間、終了のフレームを確認してください。

手持ち撮影の動画:同じレンダリング内で手ブレ補正

手持ちで撮影したスマホ動画は軽い手ブレ補正が有効です(ユーザー報告、2026-11-13、最初のHebrish週末アップデートで手ブレ補正なしでリリースされた後)。ffmpegのvid.stab(libvidstab;ModalイメージがインストールするDebianのffmpegに含まれます;ffmpeg -filters | grep vidstab で確認)を使用します。2パス処理で、両方ともModal上で実行します。

  1. 検出(高速、解析のみ、トランスフォームファイルを書き込みます)、ソースクリップごとに: ffmpeg -i main.mp4 -vf vidstabdetect=shakiness=5:accuracy=15:result=main.trf -f null - これを独自の ffmpeg_modal.py ジョブとして実行するか(引数 -vf / vidstabdetect=...:result=/work/<job>/main.trf / -f / null、出力 -)、スクリプトに検出ステップを追加します。.trf はボリューム内で入力の隣に配置する必要があります。
  2. トランスフォーム をメインレンダリング内で、そのクリップのビデオブランチの先頭(グレーディングやスケールの前)に配置します: vidstabtransform=input=main.trf:smoothing=20:zoom=2:optzoom=0,unsharp=5:5:0.4 smoothing は15-30(フレーム数)程度で自然な動きを保ちます;固定の zoom=2(パーセント)は、optzoom=1 が人物のアップで引き起こす脈動を抑えながら、動く境界を隠します。軽いアンシャープマスクがリサンプリングによるソフトネスを補正します。

8秒カットでまずテストし、フルレンダリング前に静止画と短いクリップをユーザーと確認してください。libvidstab がない場合、deshake がワンパスのフォールバック(弱い)です。AI手ブレ補正はこの用途には不要です。

スティングの作成

使用中のスティングは、ブランドSVGと小さなPillowスクリプト、および生成されたジングルからレンダリングされました。find-script(タグ logo、sting、intro)で見つけてください。ビデオモデルでロゴを再生成しないでください:ビデオモデルは文字の形を歪めます。

関連スキル