> ## Documentation Index
> Fetch the complete documentation index at: https://docs.happycapy.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 短い動画広告を生成する

> Happycapy で商品ブリーフから縦型 MP4 広告、カバー画像、短い脚本を作成します。

export function ConversationPreview({url, label, linkLabel = "Open full conversation", fit = "content"}) {
  const isContentFit = fit === "content";
  return <div className={`hc-conversation-preview${isContentFit ? " hc-preview-content" : ""}`} style={{
    width: isContentFit ? "100%" : "clamp(320px, calc(100vw - 640px), 960px)",
    margin: isContentFit ? "18px 0 32px" : "18px 0 32px 50%",
    transform: isContentFit ? "none" : "translateX(-50%)",
    border: "1px solid rgba(46, 41, 41, 0.1)",
    borderRadius: "10px",
    overflow: "hidden",
    background: "rgba(255, 255, 255, 0.55)",
    boxShadow: "0 18px 45px rgba(46, 41, 41, 0.08)"
  }}>
      <style>{`
        .hc-conversation-preview-clip {
          position: relative;
          container-type: inline-size;
          aspect-ratio: 16 / 10;
          height: auto;
          overflow: hidden;
          background: white;
        }

        .hc-conversation-preview-frame {
          position: absolute;
          left: 0;
          top: 0;
          width: 1280px !important;
          height: 800px !important;
          max-width: none !important;
          border: 0;
          background: white;
          display: block;
          transform: scale(calc(100cqw / 1280px));
          transform-origin: top left;
        }

        @media (max-width: 1279px) {
          .hc-conversation-preview:not(.hc-preview-content) {
            width: 100% !important;
            margin-left: 0 !important;
            transform: none !important;
          }

          .hc-conversation-preview:not(.hc-preview-content) .hc-conversation-preview-clip {
            height: min(70vh, 560px);
          }

          .hc-conversation-preview:not(.hc-preview-content) .hc-conversation-preview-frame {
            width: 100%;
            height: 100%;
            transform: none;
          }
        }
      `}</style>
      <div style={{
    display: "flex",
    alignItems: "center",
    gap: "8px",
    padding: "10px 12px",
    borderBottom: "1px solid rgba(46, 41, 41, 0.08)",
    background: "rgba(46, 41, 41, 0.035)"
  }}>
        <span style={{
    width: "8px",
    height: "8px",
    borderRadius: "999px",
    background: "#F8A963"
  }} />
        <span style={{
    width: "8px",
    height: "8px",
    borderRadius: "999px",
    background: "rgba(46, 41, 41, 0.18)"
  }} />
        <span style={{
    width: "8px",
    height: "8px",
    borderRadius: "999px",
    background: "rgba(46, 41, 41, 0.18)"
  }} />
        <span style={{
    marginLeft: "8px",
    color: "rgba(46, 41, 41, 0.58)",
    fontSize: "0.82rem",
    overflow: "hidden",
    textOverflow: "ellipsis",
    whiteSpace: "nowrap"
  }}>{label}</span>
      </div>
      <div className="hc-conversation-preview-clip">
        <iframe className="hc-conversation-preview-frame" src={url} title={label} loading="lazy" style={{
    margin: 0,
    maxWidth: "none"
  }} />
      </div>
      <div style={{
    padding: "12px 14px",
    borderTop: "1px solid rgba(46, 41, 41, 0.08)",
    background: "rgba(255, 255, 255, 0.72)"
  }}>
        <a href={url} target="_blank" rel="noreferrer">{linkLabel}</a>
      </div>
    </div>;
}

export function LivePreview({url, label, linkLabel = "Open live result", fit = "content"}) {
  const isContentFit = fit === "content";
  return <div className={`hc-live-preview${isContentFit ? " hc-preview-content" : ""}`} style={{
    width: isContentFit ? "100%" : "clamp(320px, calc(100vw - 640px), 960px)",
    margin: isContentFit ? "18px 0 32px" : "18px 0 32px 50%",
    transform: isContentFit ? "none" : "translateX(-50%)",
    border: "1px solid rgba(46, 41, 41, 0.1)",
    borderRadius: "10px",
    overflow: "hidden",
    background: "rgba(255, 255, 255, 0.55)",
    boxShadow: "0 18px 45px rgba(46, 41, 41, 0.08)"
  }}>
      <style>{`
        .hc-live-preview-clip {
          position: relative;
          container-type: inline-size;
          aspect-ratio: 16 / 10;
          height: auto;
          overflow: hidden;
          background: white;
        }

        .hc-live-preview-frame {
          position: absolute;
          left: 0;
          top: 0;
          width: 1280px !important;
          height: 800px !important;
          max-width: none !important;
          border: 0;
          background: white;
          display: block;
          transform: scale(calc(100cqw / 1280px));
          transform-origin: top left;
        }

        @media (max-width: 1279px) {
          .hc-live-preview:not(.hc-preview-content) {
            width: 100% !important;
            margin-left: 0 !important;
            transform: none !important;
          }

          .hc-live-preview:not(.hc-preview-content) .hc-live-preview-clip {
            height: min(70vh, 520px);
          }

          .hc-live-preview:not(.hc-preview-content) .hc-live-preview-frame {
            width: 100%;
            height: 100%;
            transform: none;
          }
        }
      `}</style>
      <div style={{
    display: "flex",
    alignItems: "center",
    gap: "8px",
    padding: "10px 12px",
    borderBottom: "1px solid rgba(46, 41, 41, 0.08)",
    background: "rgba(46, 41, 41, 0.035)"
  }}>
        <span style={{
    width: "8px",
    height: "8px",
    borderRadius: "999px",
    background: "#F8A963"
  }} />
        <span style={{
    width: "8px",
    height: "8px",
    borderRadius: "999px",
    background: "rgba(46, 41, 41, 0.18)"
  }} />
        <span style={{
    width: "8px",
    height: "8px",
    borderRadius: "999px",
    background: "rgba(46, 41, 41, 0.18)"
  }} />
        <span style={{
    marginLeft: "8px",
    color: "rgba(46, 41, 41, 0.58)",
    fontSize: "0.82rem",
    overflow: "hidden",
    textOverflow: "ellipsis",
    whiteSpace: "nowrap"
  }}>{label}</span>
      </div>
      <div className="hc-live-preview-clip">
        <iframe className="hc-live-preview-frame" src={url} title={label} loading="lazy" style={{
    margin: 0,
    maxWidth: "none"
  }} />
      </div>
      <div style={{
    padding: "12px 14px",
    borderTop: "1px solid rgba(46, 41, 41, 0.08)",
    background: "rgba(255, 255, 255, 0.72)"
  }}>
        <a href={url} target="_blank" rel="noreferrer">{linkLabel}</a>
      </div>
    </div>;
}

脚本やストーリーボードだけでなく、完成した短い動画が必要なときに使います。Happycapy はコンセプトを整理し、動画モデルを選び、MP4 を生成し、カバー画像を作成し、出力ファイルを検証します。

## サンプル結果

<LivePreview label="happycapy.ai/share/.../pocketgarden-short-video-ad.mp4" url="https://happycapy.ai/share/ecadeba9-8e0c-4a19-94fc-16bd38167312#f=outputs%2Fpocketgarden-short-video-ad.mp4" linkLabel="MP4 を開く" />

## 作れるもの

* 9:16 の縦型 MP4 動画広告
* 生成されたカバー画像またはサムネイル
* 短い脚本とショットリスト
* 別の商品や媒体に再利用できるプロンプト

## 準備するもの

* 商品またはキャンペーンブリーフ
* 対象プラットフォームと尺
* 雰囲気、シーン案、CTA
* 必要に応じた動画モデル指定

## 試せるプロンプト

```text theme={null}
PocketGarden という、アパート住まいの人が室内でハーブを育てるためのアプリについて、完成した短い動画広告を作成してください。実際の動画生成には Seedance 2.0 を使ってください。8〜12 秒の縦型 MP4、カバー画像、ショットリスト付きの短い脚本を作成します。動画は温かく前向きで、アパート暮らしに合う雰囲気にし、小さなキッチン、ハーブの成長、アプリのリマインダー、最後の CTA「Start your windowsill garden today.」を含めてください。MP4、PNG、Markdown として保存し、各ファイルが存在して空でないことを確認してください。
```

### 完全な会話

<ConversationPreview label="happycapy.ai/share/.../full-conversation" url="https://happycapy.ai/share/ecadeba9-8e0c-4a19-94fc-16bd38167312" linkLabel="完全な会話を開く" />

## Happycapy が行うこと

1. ブリーフを短い動画コンセプトにします。
2. 動画モデルと生成設定を確認します。
3. クラウドサンドボックスで MP4 を生成します。
4. カバー画像と補助脚本を作成します。
5. ファイルサイズを検証し、制作過程を共有可能に残します。

## 確認リスト

* 最初の 1 秒でフックが伝わりますか？
* 出力はプレビューではなく実際の MP4 ですか？
* 縦横比は対象プラットフォームに合っていますか？
* カバー画像と脚本は公開に役立ちますか？
* 同じブリーフを別媒体向けに remix できますか？

## 次のステップ

Happycapy に Reels、TikTok、YouTube Shorts、または別の商品オファー向けのバリエーションを作らせます。
