Communitygithub.com

ショートフォーム動画

ユーザーが「リール/TikTok/YouTube Shorts動画を作成する」「ショートフォーム動画テンプレートを構築する」「ショート動画のフックを書く」「 retention編集」「パターンインタラプトの追加」「動画ループ作成」「最初の3秒を修正」「縦型動画のカット間隔調整」「9:16セーフエリア設定」を依頼した場合に使用します。フック→ retention→ループという縦型ショートフォームの文法(ローンチフィルムとは異なる)をカバーします。

ショートフォーム動画 とは?

このスキルは、リール、TikTok、YouTube Shorts向けの縦型ショートフォーム動画(9:16)をエンジニアリングするための包括的なガイドを提供します。ショートフォーム動画を「retentionマシン」として捉え、フックで最初の1秒を獲得し、パターンインタラプトで数秒ごとに注意をリセットし、ループで視聴時間を100%以上に引き延ばすテクニックを詳細に解説します。動画編集のアプローチを、単なるカット編集から「retention曲線の編集」へと転換し、視聴者の離脱を防ぐための具体的な指標(70%以上の平均視聴率)と実践的な手法(フックの文法、パターンインタラプトの密度、シームレスループの実装)を提供します。主にRemotionフレームワーク上での実装を想定しており、すべてのアニメーション値を`useCurrentFrame()`で駆動する決定論的なレンダリングを重視します。また、9:16セーフエリアの設定や、ミュート視聴者向けのキャプション配置に関する実用的なガイドラインも含まれています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Kreesten-hsh/video/tree/HEAD/.agents/skills/short-form-video

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

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

ドキュメント

ショートフォーム動画 は何をしますか?

スワイプに耐える9:16動画を設計する。ショートフォーム動画は、小さなローンチフィルムではない——それは retentionマシンである:最初の1秒を獲得するフック、数秒ごとに注意をリセットするパターンインタラプト、そして多くの場合、視聴時間を100%以上に引き延ばすループ。その技術はタイミングにあり、洗練さではない。

使用するタイミング

  • リール / TikTok / YouTube Shorts(7~60秒、縦型9:16)。
  • retention編集:離脱ポイントの修正、パターンインタラプトの追加、ペーシングの調整。
  • フック、シームレスループ、反復可能なショートフォームテンプレート(1つのデザイン、多くのトピック)。

ストーリー構造(retention契約)

ショートフォームのストーリーテリングは、視聴者の親指との契約である:毎秒、次の秒を再び獲得しなければならない。物語はイントロから前方に向かってではなく、retention曲線から後方に向かって形作られる。タイムラインに触れる前に、これらを確定させる。

  • 1動画につき1アイデア。 ショートが伝えるのは、正確に1つのペイオフだけである。2つ目のアイデアは注意を分割し、曲線が途中でたるむ——代わりに2本目の動画にしよう。1文で単一の要点を言い表せないなら、まだショートはできていない。
  • 最初の約3秒でループを開き、最後に閉じる。 フックは質問やギャップ(開いたループ)を提示し、ペイオフがそれに答える。ループが開いているから視聴者は留まる——だから早く答えてはならず、ペイオフを前置きの下に埋めてはならない。
  • 無駄な時間なし。 すべてのビートは、アイデアを前進させるか、注意をリセットするかのどちらかである。どちらも行わないものはカットする。無音、ゆっくりとした立ち上がり、前置きのイントロ(「やあみなさん、この動画では…」)は、視聴者がスワイプする箇所である。
  • なぜカットではなく曲線が作業単位なのか。 アルゴリズムは、毎秒のretention曲線を平坦に保つものを配信する。曲線を平坦にする「良い」編集は、曲線を維持する「見苦しい」編集に負ける。あなたは曲線を編集しており、フックがその後のすべてを左右する——まずフックを修正せよ。

物語の背骨(フック → セットアップ → ボディ → ペイオフ/ループの流れは、以下の表に予算化されている):

ムーブストーリー上の役割失敗した場合の結果
フックループを開き、ペイオフを約束する最初の3秒でスワイプされる
緊張維持ボディ全体でギャップを開いたままにする中盤が平坦、途中で離脱
ペイオフループを閉じる——1つのアイデアを届ける「時間の無駄」、シェアされない
ループ / CTAフレーム0に戻す、または1つの明確な依頼をする再視聴なし、アクションなし

(以下のretention曲線表は各ムーブに秒数を割り当てる。このセクションはその背後にある物語の論理と順序である。フックの文法はフックのアーキタイプを列挙する。)

すべてを動かす唯一の指標

retention、制作価値ではない。 アルゴリズムは視聴者を保持するものを配信する。約87%の視聴者が3秒以内に視聴を続けるかスワイプするかを決定し、配信の閾値は70%以上の平均視聴率付近にある(Shorts約73%、TikTok約78%、Reels約65%)。以下のすべての決定は、この曲線とのトレードオフである。0:04で退屈させる完璧なショットは、視聴率を維持する見苦しいショットに負ける。

retention曲線

ビート役割予算(20秒のショートの場合)
フック(0~1秒)オープンループを作る1フレーム+1行0~1秒
セットアップなぜ見るべきかを伝える——約束、ステーク、またはギャップ1~4秒
ボディビートで価値を届ける。1ビートにつき1アイデア4~17秒
ペイオフ / ループループを閉じる——またはフレーム0にフィードバックする17~20秒

ボディを拡大せよ。フックは決して拡大しない。60秒のショートはより長いボディとより多くのビートを持つ——同じ1秒のフックである。

フックの文法(最初の約1秒)

フックとは、脳が閉じる必要がある好奇心のギャップを開く、文章+ビジュアルである。1つのパターンを選び、それにコミットする:

フックタイプ形状最適な用途
オープンループ「あなたのXがYを続ける理由…」(回答は遅延)ほとんどのコンテンツ
直接的な約束「30秒で___する3つの方法」教育的 / リスト形式
パターンインタラプトスナップズーム / ホイップパン / フレーム1でのビジュアルの不一致エンターテイメント
否定「___をやめて」 / 「あなたの___は間違っている」強い意見

2つのルール:フックの文言はフレーム1までに画面上にテキストとして表示される(85%はミュートで視聴)、そして最も印象的なビジュアルも最初のフレームである——決して暗転からのゆっくりとした出現ではない。強い開始フレームを保持せよ。黒からフェードアップしない。

パターンインタラプトとカットリズム

パターンインタラプトとは、注意をリセットするあらゆる変化である:ハードカット、ズームイン、Bロール挿入、効果音、キャプションポップ、アングル変更。ショートフォームでは密度が高い——約2~4秒ごとに視覚的変化。約4秒ごとにインタラプトがある動画は約58%の保持率であるのに対し、静止したトーキングヘッドでは約41%である。致命的なのは中盤の平坦化である:TikTokは視聴率曲線が平坦になると配信を抑制するので、低エネルギーのテイクからボディをつなぎ合わせてはならない。

// すべてのインタラプトを壁時計ではなくフレームで駆動する——決定論的にレンダリングする。
import { useCurrentFrame } from "remotion";
const fps = 30;
const cuts = [0, 1.2, 3.0, 5.4, 8.0, 11.2, 14.0]; // 秒——意図的に不均等
const frame = useCurrentFrame();
const shot = cuts.findIndex((t, i) => frame < (cuts[i + 1] ?? Infinity) * fps);

間隔を変えよ——メトロノームは退屈と読まれ、不均等なカットは勢いと読まれる。ズームインは、新しい映像を必要としない最も安価なインタラプトである:

import { useCurrentFrame, interpolate, spring, useVideoConfig } from "remotion";
const PunchIn = ({ at, children }) => {
  const frame = useCurrentFrame(); const { fps } = useVideoConfig();
  const s = spring({ frame: frame - at * fps, fps, config: { damping: 12, stiffness: 200 } });
  const scale = interpolate(s, [0, 1], [1, 1.12]); // ビートに合わせて112%にスナップ
  return <div style={{ transform: `scale(${scale})`, transformOrigin: "50% 45%" }}>{children}</div>;
};

キャプション

ほとんどの視聴者はミュートで視聴するため、画面上のキャプションは必須ではない——キャプションはコンテンツを伝え、各フレーズがポップインするときにパターンインタラプトとしても機能する。1行あたり4~7語、高コントラスト、セーフエリア内に配置する。ここでキャプションアニメーションを再実装しないでください——単語ごとのタイミング、カラオケハイライト、スタイリングにはcaption-animationスキルを使用してください。このスキルは、キャプションをretentionタイムライン上および9:16セーフゾーン内に配置するだけです。

ループと再視聴

シームレスループは、再視聴のたびに新しい視聴時間としてカウントされる——きれいな8秒ループを3回視聴すると300%の視聴率となり、最も強力なシグナルとなる。2つのテクニック:最後のフレームを最初のフレームに一致させる(同じ構図、位置、色)ことでカットを見えなくする。そして文章ループを書く——ペイオフがフレーム0にフィードバックするようにフックをフレーズする(「…だからこそ私は決して——」→最初にループする)。再視聴に最適な長さは約7~15秒。

9:16セーフエリア

プラットフォームのUIがテキストや顔を覆うことがないよう、ユニバーサルセーフゾーン内で構図を決める。

ゾーンピクセル(1080×1920)避けるべき領域
ユニバーサルセーフ(全プラットフォーム)中央 900×1400重要なものをその外側に配置しない
上部約120px空けるプロフィール / サウンドUI
下部約320px空けるキャプション、CTA、ハッシュタグ、オーディオバー
右端約120px空けるいいね / コメント / シェアレール

フックテキストと主要な被写体は中央の900×1400ボックス内に配置する。エディターでは空に見えても、下部の約320pxは予約しておく——プラットフォームが独自のキャプションやボタンを描画する場所である。

出力チェックリスト

  • フックの文言がフレーム1までに画面上のテキストとして表示されている。最も強いビジュアルが最初のフレームである(フェードアップなし)。
  • 最初の約4秒で1つのオープンループ / 約束が設定されている。
  • 約2~4秒ごとに視覚的なパターンインタラプトがあり、間隔は不均等、中盤が平坦ではない。
  • キャプションが存在する(caption-animation経由)、4~7語、セーフエリア内。
  • ループが閉じている——最初と最後のフレームが一致しているか、フレーム0にフィードバックする文章がある。
  • 中央の900×1400ボックス内に構図が収まっている。下部320px / 上部120px / 右端120pxは空けてある。
  • すべてのアニメーション値がuseCurrentFrame()から派生している——CSS/ライブラリのタイマーは使用しない。

納品と確認(レンダリング静止画 → MP4)

パッケージ化されたヘルパー(scripts/):scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.pngで静止画をタイル表示し、scripts/probe-mp4.sh out.mp4 [WxH] [fps]でエンコードを検証する。scripts/README.mdを参照。

ショートはRemotionコンポジション(<Composition> + zod schema + defaultProps)として出荷される。すべてのカット、ズームイン、インタラプトはuseCurrentFrame()で駆動され、Date.now() / Math.random() / タイマーは決して使用しない。成果物 = out/*.mp4 + プロジェクト(トピックごとに再レンダリング)。9:16縦型(1080×1920)がデフォルト。

確認ループ——静止画レンダリング → 検査 → エンコード。 3つのフレームが、retentionを左右する3つの要素(フック、ペーシング、ループの継ぎ目)をテストする。

# フック / ボディ中間 / 最終フレームの静止画——出荷するプロパティ(デフォルトではなく、実際のトピック)を使用する
npx remotion still Short out/f-hook.png --frame=10  --props='{"topic":"...","hook":"..."}'   # 最初の約3秒が瞬時に読めること
npx remotion still Short out/f-mid.png  --frame=N   --props='{"topic":"...","hook":"..."}'
npx remotion still Short out/f-end.png  --frame=L   --props='{"topic":"...","hook":"..."}'   # L = durationInFrames-1

# 各PNGを検査する:
#  - HOOKフレーム(〜フレーム0付近 / 最初の3秒):フックの文言が画面上のテキストとして表示され、瞬時に読めること。最も強いビジュアルがすでに表示されていること(フェードアップなし)
#  - LOOP継ぎ目:f-hook(フレーム0)とf-end(最終フレーム)を比較——シームレスなループカットのために同じ構図/位置/色であること
#  - 9:16セーフエリア:フック + 主要被写体が中央の900x1400ボックス内にあること。上部約12%、下部約20-35%(キャプション/CTA/オーディオ)、右端アクションレールは空いていること

npx remotion render Short out/short.mp4 --props='{"topic":"...","hook":"..."}'   # 静止画が確認できたら一度エンコードする
npx remotion render Short out/demo.gif --codec=gif                                # README用プルーフクリップ

トピック / バッチごと:すべてをレンダリングする前に、1つのトピックを静止画で確認する。npx remotion compositionsを使用してdurationInFrames/fpsを取得し、中間フレームと最終フレームを選択する。

終了する前に:

  1. 静止画がフック、中間、最終フレームでエラーなくクリーンにレンダリングされること。
  2. フックフレームが瞬時に読めること(画面上のテキスト + 最も強いビジュアルが前面にあり、フェードアップなし)。最初のフレームと最後のフレームがクリーンなループ継ぎ目のために一致していること。
  3. フック + 被写体 + キャプションが、チェックしたすべてのフレームで9:16中央900×1400セーフボックス内に収まっていること。
  4. フレーム駆動のみ——Date.now() / Math.random() / タイマーなし。カットは不均等、中盤が平坦ではないこと。
  5. 実際のトピックの出荷用プロパティ(defaultPropsではない)が正しくレンダリングされること。MP4がエンコードされ、GIFはオプション。

参考ファイル

  • references/retention-pacing.md — 完全に実行可能なRemotion <Short>コンポジション:不均等なカット、PunchInパターンインタラプト、画面上のフック、9:16セーフエリアオーバーレイ、シームレスな最初/最終フレームループを備えたフレーム駆動のショットスケジューラ。さらに、フックパターンライブラリ、retention曲線デバッグメソッド、プラットフォーム別セーフゾーンマップ、テンプレート×トピックのバッチレンダリングパターンを含む。

Individual skills in this repo

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

関連スキル