イントロとアウトロの追加
スティングは短い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]チェインは次のようになります。
8秒カット([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]-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フィルター)で結合してください。ジョブ終了後、volumevideo-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上で実行します。
- 検出(高速、解析のみ、トランスフォームファイルを書き込みます)、ソースクリップごとに:
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はボリューム内で入力の隣に配置する必要があります。 - トランスフォーム をメインレンダリング内で、そのクリップのビデオブランチの先頭(グレーディングやスケールの前)に配置します:
vidstabtransform=input=main.trf:smoothing=20:zoom=2:optzoom=0,unsharp=5:5:0.4smoothingは15-30(フレーム数)程度で自然な動きを保ちます;固定のzoom=2(パーセント)は、optzoom=1が人物のアップで引き起こす脈動を抑えながら、動く境界を隠します。軽いアンシャープマスクがリサンプリングによるソフトネスを補正します。
8秒カットでまずテストし、フルレンダリング前に静止画と短いクリップをユーザーと確認してください。libvidstab がない場合、deshake がワンパスのフォールバック(弱い)です。AI手ブレ補正はこの用途には不要です。
スティングの作成
使用中のスティングは、ブランドSVGと小さなPillowスクリプト、および生成されたジングルからレンダリングされました。find-script(タグ logo、sting、intro)で見つけてください。ビデオモデルでロゴを再生成しないでください:ビデオモデルは文字の形を歪めます。