Communitygithub.com

huypham85/motion-video

전문적인 모션 그래픽 동영상(MP4)을 Mac에서 직접 제작합니다. 오리지널 음악 트랙이 비트에 맞춰 모션 컷과 함께 합성됩니다. ffmpeg, 스톡 푸티지 또는 다운로드가 필요 없습니다. 프로모션, 출시, '새로운 기능', 릴리스 노트, 기능, App Store 미리보기 스타일, 소셜(Reels/TikTok/Shorts), 쇼릴 또는 앱/제품/업데이트에 대한 설명 동영상을 만들거나 이전 동영상을 수정할 때 사용하세요.

motion-video란 무엇인가요?

이 스킬은 macOS에서 완전히 코드로 구성된 10~30초 길이의 모션 그래픽 동영상을 제작합니다. Swift로 작성된 신디사이저가 오리지널 음악 스코어를 생성하고, Swift CoreGraphics/CoreImage 기반 렌더러가 비트 그리드에 맞춰 모든 프레임을 그립니다. 모션 블러, 실제 가우시안 블러, 프로스트 글라스, 필름 그레인과 같은 시각 효과를 포함하며, AVFoundation이 H.264+AAC로 인코딩합니다. macOS와 Xcode 커맨드라인 도구만 있으면 바로 사용할 수 있습니다. 이 스킬의 핵심은 '모션 디자이너의 쇼릴' 수준의 품질을 목표로 한다는 점입니다. 모든 큐는 음악 비트에 정확히 맞춰지며, 화면의 모든 요소는 장식적인 노이즈가 아닌 정보 전달 목적을 가집니다. 또한 화면에 보이는 모든 정보는 실제 제품 데이터(알림 문구, 버튼 라벨, git 로그 등)에 기반해야 하며, 사용자에게 어떤 부분이 실제 제품 데이터이고 어떤 부분이 예시용인지 명확히 알립니다. 워크플로우는 브리핑, 리서치, 에셋 수집, 비트 그리드 기반 계획, 프로젝트 폴더 생성, 스코어(음악) 개발, 씬 개발, 스틸 리뷰(최소 2회), 최종 렌더링 및 검증, 그리고 전달 단계로 구성됩니다. 이전 버전 동영상을 수정할 때는 템포 조절, 씬 수 조정, 스프링 애니메이션 감쇠, 다양한 전환 스타일 적용 등의 방법으로 피드백에 대응할 수 있습니다. 특히 이 모든 과정이 ffmpeg, 스톡 푸티지, 외부 다운로드 없이 순수하게 코드와 명령어만으로 진행됩니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/huypham85/app-3d-video-skill/tree/HEAD/motion-video

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

모션 비디오

10~30초 길이의 모션 그래픽 스팟을 실제 코드로 만듭니다: Swift 신디사이저가 악보를 작성하고, Swift CoreGraphics/CoreImage 렌더러가 동일한 비트 그리드(서브프레임 모션 블러, 실제 가우시안 블러, 프로스트 글라스, 필름 그레인 포함)에 맞춰 모든 프레임을 그리며, AVFoundation이 H.264 + AAC를 인코딩합니다. 필요한 모든 것은 이 스킬 폴더 안에 있습니다. macOS + Xcode 커맨드라인 도구가 유일한 의존성입니다.

기준은 "모션 디자이너의 쇼릴"이며, 데모가 아닙니다: 모든 큐가 음악 위에 정확히 떨어지고, 화면의 어느 것도 장식적인 노이즈가 아니며, 모든 주장은 사실입니다.

폴더 맵

  • engine/ — audio_core.swift + audio_main.swift (악보 엔진), video_core.swift + video_main.swift (렌더 엔진). 프로젝트별로 편집하지 마세요. 프로젝트 코드는 프로젝트 폴더에 들어갑니다.
  • scripts/mv.sh — 빌드 + 실행: audio, stills <beats>, video [out]. levels.py, sheet.py, probe.swift가 이 스크립트에 의해 사용됩니다.
  • 완전한 작업 프로젝트는 동반 스킬 app-3d-video에 있습니다(template/: score.swift, scenes.swift, project.env, 추가로 SceneKit 레이어 s3d.swift). 2D 전용 비디오의 경우, 그 project.env와 score.swift를 복사하고 references/engine-api.md를 참조하여 새 scenes.swift를 작성하세요.
  • examples/scores/energetic-128bpm.swift — 고에너지 런치 스코어(드롭, 필, 드롭아웃).
  • references/motion-direction.md — 톤별 페이싱, 이징, 전환, 레이아웃, 스토리텔링 패턴, 리뷰 체크리스트. 씬 계획 전에 읽으세요.
  • references/score-guide.md — 템포/키/편곡 레시피, 브랜드 사운드 키 매칭, 라우드니스 목표. 스코어 작성 전에 읽으세요.
  • references/engine-api.md — 모든 드로잉/오디오 함수와 시그니처. 코드 작성 시 읽으세요.

워크플로우

1. 브리핑 (결과를 바꾸는 질문만 유지)

확정: 목적 및 대상, 지속 시간, 화면 비율(기본 1080×1920 세로; W/H를 통해 1920×1080 또는 1080×1350), 톤, 화면 텍스트 언어. 사용자가 신경 쓰지 않으면 기본값: 15초, 세로, 영어 텍스트, 제품 도메인에 맞춘 톤. 요청된 콘텐츠가 톤에 맞는 속도로 지속 시간에 맞지 않으면, 억지로 넣기보다 어떤 것을 포기할지(지속 시간 또는 콘텐츠) 질문하세요. (헬스 앱이 차분한 페이싱 과 15초를 원했다면, 답은 속도를 높이는 것이 아니라 씬을 없애는 것이었습니다.)

2. 참인 것이 무엇인지 조사

화면의 모든 것은 방어 가능해야 합니다:

  • 출시된 것: 마지막 몇 번의 버전 범프 이후 git log, CHANGELOG, 릴리스 노트.
  • 정확한 제품 텍스트: 알림 제목/본문, 버튼 레이블, Siri/인텐트 대화 문자열, 스니펫 제목, 온보딩 텍스트에 대해 코드를 읽으세요. 인용하세요; 약속으로 의역하지 마세요.
  • 예시적인 것(샘플 이름, 개수, 시간)을 표시하고 전달 시 사용자에게 알리세요.
  • 스토리를 내부적으로 일관성 있게 유지하세요: 씬 1이 9시 41분에 메트포르민을 기록했다면, 씬 2에서 "메트포르민을 마지막으로 언제 복용했나요?"라고 묻고 "13시간 전"이라는 응답을 들을 수 없습니다. 다른 약물을 사용하세요.

3. 에셋

실제 브랜드 에셋 수집: 앱 아이콘(가장 큰 PNG), 로고, 브랜드 색상(디자인 토큰/에셋 카탈로그), 제품이 이미 사용하는 공식 배지(예: "Works with Apple Health"), 그리고 제품 자체 사운드(알림/소닉 로고 WAV). 신디사이저용 원샷 변환: afconvert -f WAVE -d LEF32@48000 -c 1 in.wav assets/name.wav; SVG → PNG는 sharp/resvg (리포지토리에 있다면) 또는 qlmanage -t -s 1024.

원시 스크린샷보다 하나의 데이터 세트(하나의 배경화면, 하나의 시계 시간, 하나의 이름 세트)로 재현된 벡터 UI를 선호하세요. 서로 다른 소스(다른 시간, 기기, 데이터, 프레임)의 스크린샷을 나란히 놓으면 부자연스러워 보이며, 시청자가 즉시 알아차립니다. 스크린샷을 사용해야 한다면, 한 세션에서 xcrun simctl status_bar booted override --time 9:41 …로 캡처하고, 이후에 지우고, 우연히 열려 있는 다른 앱은 절대 캡처하지 마세요.

4. 비트 그리드에서 계획

지속 시간 = 마디 × 4 × 60 / BPM, 따라서 BPM과 마디 수를 함께 선택하세요(15초 = 96 BPM에서 6마디, 128 BPM에서 8마디). 프로젝트에 plan.md를 작성하세요: 마디 → 씬 → 각 비트의 큐(단어 등장, 카드 배치, 체크 표시, 전환) 테이블. 마디당 하나의 아이디어; 중요한 순간(로고, 주요 기능, 엔드 카드)은 다운비트에 위치합니다. 톤 프리셋과 패턴은 references/motion-direction.md를 참조하세요.

5. 프로젝트 폴더

~/Movies/MotionVideo/<slug>/에서 작업하세요(나중에 수정을 위해 유지됨):

mkdir -p ~/Movies/MotionVideo/<slug> && cp ~/.claude/skills/app-3d-video/template/{project.env,score.swift} ~/Movies/MotionVideo/<slug>/

project.env(BPM, DURATION, W, H, FPS)를 편집하고, 브랜드 에셋을 assets/에 넣은 다음, score.swift를 다시 작성하고 scenes.swift를 작성하세요. scenes.swift 상단에서 브랜드에 맞게 팔레트 변수(INK, TEAL, MINT, GREEN, GLOW, PAPER, DARKTEXT, ORANGE, DARK_MID, LIGHT_GLOW_A/B)를 재할당하세요.

6. 먼저 스코어

score.swift를 작성하고(레시피는 references/score-guide.md 참조), mv.sh <dir> audio를 실행하세요. 소리를 들을 수는 없습니다. — 레벨 출력을 읽으세요: 톤에 맞는 목표 범위의 RMS, 클리핑 없음, 의도한 대로의 섹션 대비(조용한 인트로, 드롭에서의 리프트, 드롭아웃을 위한 딥). 비디오는 오디오 반응 요소를 위해 music.wav를 읽으므로, 스틸보다 먼저 오디오를 렌더링하세요.

7. 씬, 그다음 스틸 리뷰 — 최소 두 라운드

func render(_ t: Double, frame: Int)를 정의하는 scenes.swift를 작성한 후:

~/.claude/skills/motion-video/scripts/mv.sh <dir> stills 0.5,2,4.25,6,8.5,10,13,16,20,22.5

<dir>/sheet.png를 읽기로 열고 references/motion-direction.md의 체크리스트(스프링 오버슈트에서 겹침, 잘린 디센더, 너무 작은 텍스트, 지저분한 크로스페이드, 일관성 없는 UI, 죽은 공간)를 확인하세요. 또한 정지 상태뿐만 아니라 전환 중간 비트도 선택하세요. 라운드가 깨끗하게 나올 때까지 수정하고 다시 촬영하세요. 스틸 렌더링은 약 0.1초/프레임이므로 자유롭게 반복하세요.

8. 최종 렌더링 및 검증

mv.sh <dir> video <dir>/out.mp4 — SUB=5 모션 블러 사용 시 약 0.3–0.5초/프레임(15초 @ 60fps ≈ 5–8분)이므로 백그라운드에서 실행하세요. 프로브는 지속 시간과 트랙을 출력합니다. 또한 몇 개의 프레임을 추출하여(.build/probe out.mp4 <dir> 2,5,9,12) 확인하세요.

9. 전달

~/Downloads/<Product>_<Topic>_<duration>s[_vN].mp4로 복사하고, SendUserFile로 보내고, 보고하세요: 비트별 스토리(초), 어떤 에셋과 문자열이 실제인지, 무엇이 예시용인지, 측정으로만 오디오를 판단했음을 알리고, 사용자를 위한 짧은 체크리스트(볼륨으로 듣기, 휴대폰에서 가독성, 브랜드/배지 사용법)를 제공하세요. 수정 시 이전 버전(v1/)은 유지하세요.

수정하기

대부분의 피드백은 하나의 노브에 매핑됩니다: 느리게/차분하게 → 더 낮은 BPM + 더 적은 씬 + 감쇠된 스프링(k≈5, w≈6) + 더 긴 등장(0.9–1비트) + 휘핑 대신 랙 포커스/아이리스 전환; 더 에너지 넘치게 → 에너제틱 스코어, 오버슈트가 있는 스프링, 휘핑, 드롭에서의 플래시; "기능 X를 이해하지 못하겠어요" → 하나의 기기에서 전체 원인과 결과(요청 → 응답 → 결과)를 제품의 실제 응답 텍스트와 함께 보여주고, 기능 이름이 아닌 가치로 제목을 지정하세요.

관련 스킬