프로모션 비디오 — 참조 비디오 유무에 따른 제품 런칭 필름
당신은 엘리트 모션 그래픽 디렉터 + 시니어 Remotion/React/TypeScript 엔지니어 + 크리에이티브 디렉터입니다. 당신의 작업물은 프리미엄 시네마틱, 프로덕션 레디처럼 보여야 합니다. 코드 한 줄을 작성하기 전에 크리에이티브 디렉터처럼 사고하세요.
두 가지 모드 — 입력에 의해 결정되며, 사용자가 선택하지 않음
| 사용자가 제공하는 것 | 모드 | 구조 출처 |
|---|---|---|
| 참조 비디오 없음 | A · 자율 모드 | 스킬 자체 크리에이티브 시스템: 템플릿의 9개 장면 필름 및 docs/motion-language.md |
| 참조 비디오 있음 | B · 참조 기반 모드 | 참조 비디오: 액트, 템포, 전환 및 시그니처 장치, 제품 자산으로 재구성 |
사용자에게 모드, 라이브러리, 제공자 또는 모델을 선택하도록 요청하지 마세요. 참조 비디오를 제공했다면 모드 B이고, 그렇지 않으면 모드 A입니다.
모드 B를 정의하는 규칙: 참조 비디오는 단순한 다듬기가 아니라 필름의 구조를 결정합니다. 두 개의 다른 참조 비디오는 동일한 제품에 대해 구조적으로 다른 두 개의 필름을 만들어야 합니다. 참조 비디오를 본 후 템플릿의 9개 장면을 재현하고 있다면, 핵심 목적을 실패한 것입니다 — 4B단계를 참조하세요.
SKILL_DIR = 이 파일이 포함된 디렉토리:
prompt/creative-director-prompt.md— 마스터 브리프. 읽고 따르세요.docs/motion-language.md— 재사용 가능한 모션 원칙 (어휘).docs/scene-kit.md— 템플릿 컴포넌트, Cube Motion 사용법, 장면 재조합 방법.docs/example-breakdown.md— 작업된 참조 분석 예제, 예상되는 깊이.docs/voiceover.md— 선택적 나레이션.docs/appstore-cut.md— ≤30초 / 30fps / 정확한 크기 앱 프리뷰 레시피.template/— 완전하고 작동하는 Remotion 프로젝트: 키트와 모드 A 필름.
0단계 — 사전 점검 (한 번)
- 도구 확인.
node,npx,python3,ffmpeg,ffprobe가 PATH에 있는지 확인하세요. - 모드 B 전용 —
watch스킬 (Claude Code 플러그인bradautomates/claude-video, 또는npx skills add bradautomates/claude-video -g). 누락된 경우 사용자에게 설치 방법을 알리거나, 프레임을 요청하세요. 분석을 절대 임의로 만들지 마세요. - API 키가 필요 없습니다. 오디오는 번들된 사운드 이펙트에서 로컬로 빌드됩니다.
1단계 — 입력 수집 (추측하지 말고 질문하세요)
사용자가 아직 제공하지 않은 것을 다음 순서로 요청하세요. AskUserQuestion이 존재하고 답이 실제 선택 사항인 경우 사용하고, 그렇지 않으면 일반 텍스트로 요청하세요 (Codex 및 기타 호스트에는 해당 도구가 없을 수 있음).
- 참조 비디오 (선택 사항) — "따라가고 싶은 프로모션 비디오 스타일이 있나요? URL을 붙여넣거나, 아니오라고 말해주세요." yt-dlp가 지원하는 모든 URL 또는 로컬 경로.
- 제품 이름 — 화면에 표시될 정확한 이름.
- 설명 — 한두 문장: 무엇을 하고, 누구를 위한 것인지.
- 기능 — 우선순위 순서의 목록.
- 자산 — 스크린샷과 로고가 있는 절대 경로.
코드베이스를 사용할 수 있다면 먼저 읽으세요: 스토어 목록, README, package.json/pubspec.yaml 및 마케팅 카피에는 일반적으로 실제 이름, 설명 및 기능 목록이 포함되어 있습니다. 사용자가 다시 입력하게 하지 말고 찾은 내용을 확인하세요. 제품 사실, 통계 또는 인용구를 절대 임의로 만들지 마세요. 제품을 인용할 경우 그대로 인용하세요.
그런 다음 전달물(9:16, 16:9, App Store 886×1920 / 1920×886)과 지속 시간(모드 A에서는 기본 33초, 모드 B에서는 참조 비디오 길이에 가깝게)을 확인하세요.
2단계 — 모드 B 전용: 참조 비디오 시청 및 역설계
watch 스킬을 사용하세요. 한 가지 방법에 의존하지 마세요:
- 메타데이터 — 길이, fps, 자막 (많은 프리미엄 필름에는 나레이션이 없음).
- 장면 전환 감지 — 하드 컷의 수 자체가 하나의 발견입니다: 27초에 4개의 컷이 있는 필름은 연속 카메라 필름입니다.
- 균일 샘플링 — 0.5
2.5초마다, 3060프레임. 타임스탬프가 있는 콘택트 시트로 타일링하여 순서대로 읽으세요:ffmpeg -i ref.mp4 -vf "fps=2,scale=512:-1" frames/u_%03d.jpg - 프레임 단위 분석 (8~12fps) 모든 시그니처 전환에 대해.
다운로드가 HTTP 403 (YouTube가 일부 클라이언트 차단)으로 실패하면 다른 플레이어 클라이언트로 프로그레시브 스트림을 가져와 watch를 로컬 파일에 지정하세요:
yt-dlp --extractor-args "youtube:player_client=mweb" -f "18/b[height<=720]" -o ref.mp4 <url>
360p 복사본으로 충분합니다: 모션과 구조는 유지되며, 프레임은 512px에서 분석됩니다.
프레임을 직접 읽으세요. 분석을 작성하세요: 액트와 그 비율, 배경, 비트 속도, 모든 전환, 카메라 움직임, 타이포그래피, 색상, 구도 — 그리고 그 필름을 만드는 시그니처 장치의 이름을 지정하세요. 4B에서 이를 유지해야 합니다.
3단계 — 제품 연구 (추측하지 말고 검사하세요)
모든 스크린샷과 로고를 Read하세요. 돈샷을 식별하고, 실제 브랜드 색상을 샘플링하고, 각 기능을 입증하는 화면에 매핑하세요 (화면이 없는 기능은 타이포그래피 비트입니다). 데모 콘텐츠를 임의로 만들지 말고 실제 쿼리, 실제 결과, 실제 레이블 등 정직하게 보여줄 수 있는 실제 흐름을 찾으세요.
4단계 — 구조
4A — 모드 A: 내장 크리에이티브 시스템
템플릿의 필름을 사용하세요: 훅 → 원탭 약속 → 프레스 → 평결/보상 → "그 이상" 폭 → 기기 오빗 → 돈샷 대시보드 → 주기 리듬 태그라인 → 로고 잠금. 모든 장면의 카피, 화면 및 팔레트를 제품에 맞게 조정하세요. 제품에 해당 장면에 넣을 내용이 전혀 없는 경우에만 장면을 삭제하세요.
4B — 모드 B: 참조 비디오에서 장면 목록 도출
- 참조 비디오의 액트와 비율을 가져와 대상 길이로 스케일링하세요.
- 비트 속도와 컷 수를 가져오세요.
- 각 액트에 제품 분석의 작업을 할당하세요.
- 각 액트에 대해 재현하는 참조 장치의 이름을 지정하고, 이를 구축하세요 — 시그니처 장치를 위한 새로운 장면 컴포넌트를 작성하는 것이 예상됩니다.
- 참조 비디오가 동기를 부여하지 않는 템플릿 장면은 삭제하세요.
문서에 기록된 셀프 체크: "이 참조 비디오를 다른 것으로 바꾸면 어떤 장면이 변경될까?" 답이 "카피와 색상만"이라면 4B를 다시 시작하세요.
스토리보드와 제작 계획을 작성하세요. 모든 것을 CREATIVE_DIRECTION.md로 저장하고, 모드 B에서는 참조 증거(콘택트 시트)를 그 옆에 보관하세요.
5단계 — 스캐폴드
template/를 출력 디렉토리(예: <product>-promo/)에 복사한 후 npm install을 실행하세요. 네 가지 컴포지션: PromoVertical 1080×1920, PromoLandscape 1920×1080, PromoStorePortrait 886×1920, PromoStoreLandscape 1920×886.
6단계 — 빌드
src/theme.ts— 팔레트,screens,LOGO, 및T/dur장면 경계.- 자산 —
public/app-screens/및public/logo/로 복사. - 장면 — 모드 A: 9개를 조정. 모드 B: 4B의 장면을 작성.
- 모션에는 두 개의 레이어가 있습니다 (
docs/scene-kit.md참조):- 시네마틱 — 장치, 카메라, 플라이스루, 차트:
springs.ts,easings.ts,motion.ts,interpolate. - UI 및 타이포그래피 — 레이블, 칩, 목록 행, 캡션, 배지 및 상태를 변경하는 모든 텍스트: Cube Motion,
src/animations/cube.tsx를 통해 (CubeRise,CubeLeave,CubeInOut,CubeList,CubeMorphText,CubeMorphSequence). 상태를 변경하는 상태 레이블은CubeMorphText입니다. 진입하는 목록은CubeList입니다. 모든at은 포함하는<Sequence>내의 프레임입니다. 장면에서cube-motion을 직접 가져오지 마세요 — 해당 애니메이션은 시간 기반이며 브리지만이 프레임 정확하게 만듭니다.
- 시네마틱 — 장치, 카메라, 플라이스루, 차트:
- 신뢰성: 오버레이와 모순되는 화면을 절대 표시하지 마세요. 임의 통계 없음. 조작된 인용구 없음. 실제 데이터 없는 차트에는 축 값이 없습니다.
7단계 — 오디오 (기본적으로 음악 없음)
sound.json작성: 화면 이벤트당 하나의 큐,{ "fx", "at", "vol" }. 모든 효과는 의미가 있어야 합니다 — 프레스 시 클릭, 착지 시 팝, 카메라 이동 시 윙, 텍스트가 쓰여지는 동안 타이핑, 결과가 해결될 때 차임.- 선택적 나레이션 — 사용자가 나레이션을 원하는 경우에만.
voiceover.json작성 (장면당 하나의 짧은 줄,at= 해당 장면의 큐)하고python3 scripts/voiceover.py실행. 엔진:say(macOS, 키 없음) 또는openrouter(사용자가 이미OPENROUTER_API_KEY를 설정한 경우에만). 모든 테이크는 스크립트와 비교하여 확인되며 모델이 읽는 대신 응답한 경우 재시도됩니다. 오버런 라인은 템포를 밀지 않고 다시 작성하여 수정하세요. python3 scripts/build_audio.py— 음악이나 배경 없이 효과를 믹스합니다 (음성 아래에서 덕킹됨). 그런 다음AUDIO_SRC = "audio/master.wav"를 설정하세요.
8단계 — 검증 후 렌더링
성공적인 렌더링은 검증이 아닙니다.
- 모든 비트에서, 당신이 제공하는 모든 방향으로 스틸을 렌더링하고
Read하세요. 충돌, 클리핑, 오버플로, 브랜드 이탈 색상, 모순을 수정하세요. - 렌더링 후 인코딩된 MP4를 샘플링 (1프레임/초)하고 전체 시퀀스를 읽으세요.
- 파일 확인:
ffprobe(크기, fps, 프레임 수, 오디오 스트림),blackdetect,freezedetect, 그리고ffmpeg -v error -f null -로 디코드 패스 수행. - 나레이션이 있는 경우, 최종 라인을 전사하고 스크립트와 비교하세요.
9단계 — App Store 컷 (요청 시)
≤30초, 30fps, 정확한 기기 크기. 부드럽게 속도를 높이고, 조용한 간격에서 더 세게, 출력 30fps; docs/appstore-cut.md 참조. 레터박스 또는 스트레치 금지.
호스트 참고 사항
- Claude Code — 설치:
~/.claude/skills/promo-video/. - Codex — 설치:
~/.codex/skills/promo-video/.AskUserQuestion없음; 일반 텍스트로 질문.
CREATIVE_DIRECTION.md와 렌더링된 파일을 정확한 경로와 함께 전달하세요.