Communitygithub.com

WEBGRS/reframe

ランドスケープ(横長)映像を、縦(9:16)、正方形(1:1)、または4:5のフィルムに再フレーミングします。すべてのショットをその本質(話者、動くもの、ショットの主題)にクロップし、フレームを横切る被写体を追跡し、映像を再エンコードしません。各ショットを事前に測定し、確認用にすべてのウィンドウをフレーム上に描画し、完成したfilm.htmlを同じルールに照らしてチェックします。

reframe とは?

このスキルは、横長(16:9)の映像素材を、縦長(9:16)、正方形(1:1)、または4:5のアスペクト比に自動的に再フレーミングするためのツールです。各ショットの内容(話者の顔、動く物体、重要な要素)を分析し、最適なトリミング枠(ウィンドウ)を決定します。被写体がフレームを横切る場合は、スムーズなフォロー動作で追跡します。映像自体は一切再エンコードせず、HTMLのCSS(`object-fit: cover` や `translate`)を用いてトリミングと位置調整を行います。これにより、元の映像品質を完全に維持したまま、縦向きの動画を作成できます。主なプラットフォームとしてClaude CodeやCursorなどのAIエージェントで動作し、Node.jsスクリプトとして実装されています。事前に各ショットを測定し、すべてのフレーム枠を可視化したレビューシート(`-sheet.jpg`)を生成し、最終的に生成されたフィルム(`film.html`)が品質ルールを満たしているかを自動チェックする機能も備えています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/WEBGRS/openfilm-reframe/tree/HEAD/skills/reframe

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

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

ドキュメント

reframe は何をしますか?

人物のランドスケープ映像を、最初からその形状向けに撮影されたかのような縦長または正方形のフィルムにします。どの瞬間も、視聴者はショットの主題を見ることができ、隣の壁や顔の半分を見ることはありません。

何がそれを定義するか

各ショットは、その内容自体に基づいてフレーミングされます。ビデオ全体に1つの中央クロップを適用するのは、どれだけきれいに見えても、この定義に該当しません。また、ぼかしバーの間にランドスケープフレーム全体を縮小して表示するのも同様です。

満たすべき条件

  • 測定し、そして視認する。 すべてのウィンドウは、測定結果と、その画像に対するあなた自身の目視判断に基づきます。測定が誤ることもあり、画像が最終判断を下します。
  • 被写体は完全に表示される。 顔、話者、動くもの、重要な言葉は、周囲に余裕を持ってフレーム内に収まります。2つの重要な要素があり、両方が収まらない場合、フレームはその瞬間の主題(話す人、動くもの、ナレーションが指すもの)に向けられ、視聴者は除外された内容を耳で捉えます。
  • 落ち着いたフレーミング。 静止した被写体には、ショット全体で1つの静止したウィンドウが割り当てられます。ウィンドウは被写体が動くときにのみ移動します。最後の移動から少なくとも1秒後にハードリポジショニングを行うか、またはスムーズに追従します。ドリフトやジッターするクロップは避けます。
  • 元の映像をそのまま使用。 同じファイルを #t= でトリミングし、クリップ自身のCSS(object-fit: cover と object-position、または translate で移動された映像の形状のボックス)でクロップします。再エンコード、新しいファイルへのクロップ、または速度変更は行いません。1つのショットのクリップはフレーム単位で接合されるため、ショットの音声は途切れることなく連続します。

提供されるもの

node <このスキルのフォルダ>/scripts/reframe.mjs <動画> --aspect 9:16 --src assets/<ファイル> (フィルムのフォルダ内で実行) は、reframe/<名前>.json、レビューページ、および reframe/<名前>-sheet.jpg を書き出します。ショットを検出し、モーション(カメラ自身の動きを除去)、ディテール、色のコントラスト、肌色を毎秒10回評価し、各ショットに fixed(1つのクリップ)、split(同じファイルの複数クリップ、それぞれ1秒以上、それぞれ独自の位置を持つ)、または whole(元の映像の形状)のウィンドウを割り当て、各ソース秒に対応した <video> 行を生成します。

出力されたすべてのシートを読んでください(look: … (Read it))。 各画像は、ある瞬間(各クリップの開始、最も弱い瞬間は WEAKEST とマーク、1.5秒ごと)を示します。ウィンドウの輪郭と外側を暗くしたフレーム、フレームの%単位の定規、およびフィルムとして表示されるクロップが表示されます。被写体がウィンドウの外またはウィンドウで切られている場合は、自分で object-position を設定してください。出力は計算式を提供します。held はウィンドウが測定値と一致する頻度を示し、被写体がウィンドウ内にあることを証明するものではありません。! とマークされた行は、特に注意深く確認すべき箇所を示します。

スムーズフォロー (--follow):分割ショットのパス用の translate を使った @keyframes follow-N と、それを適用する1つの <video> クリップ。reframe/<名前>-follow.css にも出力されます。キーフレームを film.html の <style> に配置します。アニメーションは、クリップの at からの自身の時間で動作します。ショットの開始から a 秒後に開始するようにトリミングされたクリップは、animation-delay: -a s を設定します。クリップは自身の音声を保持します。

ショットのトリミング:新しい #t= 内のクリップのみを保持し、外側の2つはそれに合わせてカットされ、位置は変更されません。

記述されたフィルムとして: node <このスキルのフォルダ>/scripts/reframe.mjs check をフィルムのフォルダ内で実行すると、film.html の独自のクロップを読み取り、各ウィンドウ、その移動時間、各リポジショニング、ウィンドウが測定結果の最小部分を保持している瞬間を出力し、それらをシートに描画します。上記のルールに違反する箇所を ! でリストアップします。すべての ! を修正し、再度実行してください。

フィルムの形状はビューポート(<meta name="viewport" content="width=1080, height=1920">)で定義されます。npx openfilm look でカットされたフィルムを表示できます。

人物との連携

相手の要望を最優先します。形状(縦長と言われたら9:16)、必ず含めるべきショット、フレーム内に収めなければならないもの(製品、ロゴ、2人目の話者など)。作業を妨げない範囲で質問してください。完了したら、ショットごとに以下を伝えます。held、すべての ! 行、移動した各ウィンドウとその理由、そしてクロップが除外したもの。

関連スキル