Loading...
Loading...
promo-video/ 配下のRemotion動画プロジェクト専用。TikTok縦型プロモ動画のシーン作成・ 編集・レンダリングワークフローを提供する。promo-video/ 内のファイルを触る作業や、 Remotionコンポーネントの追加・修正で使うこと。 汎用的な動画編集やTikTok一般の質問には対応しない。
npx skill4agent add yusuketsunoda/ppt-trans tiktok-promo-videopromo-video/
├── package.json # Remotion + React(バージョンはpackage.json参照)
├── tsconfig.json
├── public/screenshots/ # スクリーンショット素材
│ ├── upload.png
│ ├── dashboard-empty.png
│ └── landing.png
└── src/
├── index.ts # registerRoot(RemotionRoot)
├── Root.tsx # Composition登録(Folder + Composition)
├── constants.ts # 全定数: FPS, サイズ, シーン尺, カラー, コピー
├── fonts.ts # NotoSansJP (@remotion/google-fonts)
├── motion.ts # アニメーションユーティリティ
├── index.css # Tailwind (optional)
├── TikTokAd.tsx # Ad版メイン (Sequence)
├── TikTokPromo.tsx # LP版メイン (TransitionSeries)
├── components/
│ ├── Background.tsx # ダーク背景
│ ├── SafeArea.tsx # TikTok安全領域 (top:160, bottom:260)
│ ├── KineticLine.tsx # テキスト表示(emphasis, veil対応)
│ ├── Icons.tsx # SVGアイコン(Bolt, Shield, Table, Globe, Pen, Arrow)
│ ├── TapRing.tsx # タップアニメーション
│ ├── TimerBadge.tsx # タイマー表示
│ ├── ProgressBar.tsx # プログレスバー
│ ├── GlowEffect.tsx # グロー演出
│ └── PhoneMockup.tsx # スマホモック
└── scenes/
├── HookScene.tsx # LP: フック(課題提示)
├── SolutionScene.tsx # LP: 証拠(タイマー + スクショ)
├── DemoScene.tsx # LP: 編集デモ(1行修正)
├── FeaturesScene.tsx # LP: 特徴カード(速い/表も翻訳/多言語/直せる)
├── CTAScene.tsx # LP: CTA(comment/try)
├── AdHookScene.tsx # Ad: Before/After カード
├── AdProofScene.tsx # Ad: タイマー + スクショ
├── AdDiffScene.tsx # Ad: 1行修正デモ
└── AdCTAScene.tsx # Ad: CTA(profile/comment)| 項目 | 値 |
|---|---|
| 解像度 | 1080 x 1920 (9:16 縦型) |
| FPS | 30 |
| Safe Area上部 | 160px (UIオーバーレイ) |
| Safe Area下部 | 260px (UIオーバーレイ) |
| Safe Area左右 | 60px padding |
| Ad版尺 | 11.5s = 345f |
| LP版尺 | 15.0s = 450f |
SequenceHook(24f/0.8s) → Proof(126f/4.2s) → Diff(105f/3.5s) → CTA(90f/3.0s) = 345fSequencefromdurationInFramesCOPY_VARIANTSctaVariantTransitionSeriesHook(29f) → Proof(107f) → Edit(143f) → Cards(128f) → CTA(75f)
= 482f - 4*8f(transitions) = 450fTransitionSerieslinearTiming<img><Img>staticFile()// アニメーションは必ず useCurrentFrame + interpolate/spring
const frame = useCurrentFrame();
const opacity = interpolate(frame, [0, 10], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});| 関数 | 用途 | 特徴 |
|---|---|---|
| フェードイン | interpolate |
| フェードアウト | interpolate |
| 下から登場 | Easing.out(exp) |
| 右から登場 | Easing.out(exp) |
| スケールイン | spring(damping:200) — バウンスなし |
| バウンス | spring(damping:12, stiffness:200) |
| コンポーネント | 主なProps | 用途 |
|---|---|---|
| children | TikTok安全領域ラッパー |
| text, fontSize, emphasisWord, veil | テキスト表示(固定幅、中央揃え) |
| size | SVGアイコン (Bolt/Table/Globe/Pen/Arrow) |
| x, y, delay | タップ演出 |
| seconds, done | タイマー表示 |
| progress, done, width | 進捗バー |
| - | ダーク背景 |
| color, size, delay | グロー演出 |
constants.tsscenes/sum(scenes) - (transition_count * LP_TRANSITION) = LP_FRAMESconstants.tsCOPY_VARIANTScd promo-video
npx tsc --noEmit # 型チェック(必須)
npm run render:all # 全4本レンダリング
# 個別:
npm run render:ad-profile # Ad Profile CTA
npm run render:ad-comment # Ad Comment CTA
npm run render:lp-comment # LP Comment CTA
npm run render:lp-try # LP Try CTApromo-video/out/| 問題 | 原因 | 対処 |
|---|---|---|
| Folder name error | Folder nameにスペース | a-z, A-Z, 0-9, |
| NotoSansJP subset error | "japanese" subset指定 | 番号付きsubset |
| 循環参照 | Root.tsx ↔ Composition | fonts.ts を独立ファイルに分離済み |
| render command format | | |
| 画像表示されない | native | |
| フォントずれ | fontFamily未設定 | AbsoluteFill の style に |
| レイアウトずれ | 固定幅未設定 | KineticLine (maxWidth), テキストはcenter align |
npx tsc --noEmitnpm run render:alluseCurrentFrameinterpolatespringKineticLineIcons.tsx<Img src={staticFile("...")}/><img>