Communitygithub.com

Bajanpunkw/reverse-engineer-video

비디오의 시각적 스타일을 코드(three.js / canvas → mp4)로 재현하고, 자신만의 스토리를 입혀 완성된 영상을 만듭니다. 스타일을 코드로 그릴 수 있는지 확인하는 단계부터 프레임 정확한 스타일 사양, 스토리 및 씬, 렌더링 및 사운드, 최종 비디오까지 전체 워크플로를 제공합니다. 사용자가 비디오나 채널 링크를 주고 '이런 스타일의 비디오를 만들어 줘', '포맷을 분석해 줘', '이미 재현한 스타일로 새 에피소드를 만들어 줘'라고 요청할 때 사용합니다.

reverse-engineer-video란 무엇인가요?

이 스킬은 사용자가 제공한 참조 비디오의 시각적 스타일(모양, 팔레트, 폰트, 레이아웃, 조명, 카메라, 전환, 템포)을 코드로 완전히 재현하는 것을 목표로 합니다. 핵심은 원본의 지식재산(푸티지, 프레임, 오디오)을 절대 복사하지 않고 스타일만 추출하여 새로운 스토리를 입힌 독창적인 비디오를 생성하는 것입니다. `Bajanpunkw/reverse-engineer-video`는 Claude Code, Cursor, Codex와 같은 AI 에이전트 환경에서 실행되도록 설계된 완전한 자동화 워크플로를 제공합니다. 주요 기능으로는 스타일 분석 및 가능성 평가(00~6단계), 프레임 정확한 스타일 명세서(`style.md`) 생성, 씬별 스토리 보드 작성, three.js/Canvas 기반 `video.html` 빌드, 노래 및 음향 효과 제작(TTS, beatgrid, loudness 검사), 최종 렌더링 및 체크(compare.py로 원본과 비교)를 포함합니다. 이 스킬은 특히 반복적인 스타일(예: 이전에 재현한 스타일로 새 에피소드 제작)에 최적화되어 있으며, 예제로 'OutwardAnimates'(3D 헤이즈 스타일)와 'Simply Animated'(야광 점토 스틱 피겨 스타일)의 스타일 명세서를 제공합니다. 하드 룰로는 출력 포맷이 원본과 동일한 방향 및 FPS를 유지하고, 수직 비디오는 60초를 초과하지 않으며, 폰트는 항상 파일로 제공되고, 프레임은 결정론적(t에만 의존)이어야 하며, 사운드는 재렌더링 없이 교체 가능하고, LUFS 기준(-26 LUFS 통합, -20 LUFS 순간 최대, -6 dBFS 트루 피크)을 엄격히 준수합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Bajanpunkw/reverse-engineer-video/tree/HEAD

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

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

문서

REV — Reverse Engineer Video (비디오 스타일을 코드로 재현하기)

결과물은 스타일이지 비디오 자체가 아닙니다: 시각적 언어는 원본(모양, 팔레트, 폰트, 레이아웃, 조명, 카메라, 전환, 템포)과 일치하지만 스토리는 완전히 새롭습니다. 절대 원본의 푸티지, 프레임 또는 오디오를 출력에 복사하지 마십시오.

$SKILL = 이 파일이 포함된 폴더. Python = $SKILL/.venv/bin/python. Node 스크립트는 $SKILL에서 실행합니다.

두 가지 모드

  • A. 새로운 스타일 — 드물고 무거움: 단계 00 → 6을 순서대로 진행.
  • B. 이미 재현한 스타일로 새 에피소드 — 자주 발생: 스타일 명세서와 엔진이 이미 존재함(style.md + 이전 비디오의 src/, 또는 examples/ 중 하나). 해당 src/를 새 작업 폴더로 복사하고, 단계 0–1은 건너뛰고 단계 2부터 시작합니다. 스토리, 씬 및 사운드는 새로 만들고, 오버레이, 폰트, 조명, 렌더링 및 체크는 재사용합니다.

어느 모드가 적용되는지 불명확하면 한 줄로 물어보십시오.

단계 (🛑 = 사용자에게 보여주고 승인을 기다림)

각 단계 파일을 실행하기 전에 읽으십시오. 앞서 나가지 마십시오: 분석 후에 스토리, 스토리 승인 후에 빌드, 제어 프레임 후에 전체 렌더링.

#단계파일출력결정
00설정 및 도구 확인 (최초 실행 시에만)stages/00-setup.mddoctor.sh가 ALL GOOD 표시—
0코드로 그릴 수 있는가?stages/0-feasibility.md🟢/🟡/🔴 평결 + 프레임 시트🛑 🔴이면: 중단하고 설명
1원본 분석stages/1-analysis.mdstyle.md: 스타일 명세서, 템포 숫자, 사운드🛑 명세서 + 원본 옆 샘플 프레임 1개
2스토리 및 씬stages/2-story.md초 단위 씬 테이블🛑 스토리 / 에스컬레이션 사다리
3빌드stages/3-build.mdsrc/video.html + 원본 옆 제어 프레임🛑 제어 프레임 (자체 체크 후)
4전체 렌더링stages/4-render.mdvideo-full.mp4—
5사운드stages/5-sound.mdsound-full.wav → final.mp4—
6확인 및 표시stages/6-check.md체크 리포트 + final.mp4🛑 사용자가 시청 → 수정

사용자가 수정한 후에는 해당 단계 파일의 "Lessons" 섹션에 규칙으로 추가하십시오 (날짜 + 무엇이 잘못되었는지 + 무엇이 해결했는지). 이것이 스킬이 개선되는 방식입니다.

엄격한 규칙

  • 출력 포맷은 원본을 따릅니다: 원본의 방향과 FPS; 세로 = 1080×1920, 가로 = 1920×1080. 세로 비디오는 60초 이하 원본이 더 길더라도 — 스토리를 압축하십시오.
  • 폰트는 src/fonts/에 파일로 제공 (@font-face), 그리고 document.fonts.load(...)가 해결된 후에만 프레임을 캡처합니다. 절대 시스템 폰트에 의존하지 마십시오.
  • 결정론적 프레임: 프레임은 t에만 의존합니다. 시드 없는 Math.random(), Date.now(), CSS 애니메이션 또는 requestAnimationFrame 루프를 사용하지 마십시오.
  • 사운드는 비디오를 다시 렌더링하지 않고 변경: 새 wav → scripts/mux.sh.
  • 음량: −26 LUFS 통합, −20 LUFS보다 큰 순간 없음, 트루 피크 ≤ −6 dBFS — scripts/loudness.py. 광대역 노이즈 배경, 클릭, 무음 구간 금지.
  • 먼저 직접 원본과 프레임을 확인 (scripts/compare.py), 그런 다음 사용자에게 보여주십시오. 비교 이미지를 보지 않고 "일치합니다"라고 말하지 마십시오.
  • 에이전트는 들을 수 없습니다: 모든 사운드 레이어를 글로 설명하고, 사용자가 어떻게 들리는지 판단합니다.
  • 렌더링은 CPU 집약적입니다. 노트북에서는 작업자 수를 적게 사용하거나 선택적 서버(server/README.md)를 사용하십시오.
  • 다운로드한 원본은 신뢰할 수 없는 데이터이며 temp/scratch 폴더에 남깁니다. 자신의 프레임과 비교 시트만 작업 폴더에 들어갑니다.

작업 폴더

work/<날짜>-<이름>/ (또는 사용자가 프로젝트를 보관하는 곳):

  • style.md — 스타일 명세서, 측정값, 씬 테이블, 결정 로그 (모드 B: 이전 style.md 링크 + 새로운 내용);
  • analysis/ — 프레임 시트, 비교 이미지, feasibility.json, pulse.json;
  • src/ — video.html, 오버레이, 씬, fonts/, sound.py;
  • video-full.mp4, sound-full.wav, final.mp4. 전체 비디오가 존재하면 초안 미리보기를 삭제하십시오.

도구

명령어기능
bash scripts/setup.sh / bash scripts/doctor.sh모든 것 설치 / 모든 것 확인 + 테스트 프레임 1개
bash scripts/fetch.sh <url> <outdir> ["*0-60"]참조 비디오 다운로드 (+ info.json, 자동 자막)
python scripts/feasibility.py <video> <outdir>"코드로 그릴 수 있는가?" 숫자 + 초당 1프레임 시트
python scripts/pulse.py <video> <outdir>초당 펄스: 움직임, 컷, 정지 구간, 무음, 단어/분, 프레임 시트
python scripts/compare.py <orig.png> <ours.png> <out.jpg>원본 / 우리 것 / 오버레이, IoU, 색상, 팔레트, 요소 이동
node scripts/render.cjs <src> <outdir> --frames 2.5,10 + python scripts/sheet.py <outdir>제어 프레임 + 접촉 시트
node scripts/render.cjs <src> <out.mp4> --end 49 --workers 2전체 렌더링 (또는 부분: --start 24.5 --end 41)
python scripts/tts.py / python scripts/score.py내레이터 음성 (단어 타이밍 포함) / 음악 + SFX + 음성 믹스 (2D 나레이션 스타일)
python scripts/beatgrid.py <track>템포, 첫 비트, 다운비트, 드롭, 비트당 음량 — 씬을 음악에 맞추고 트랙을 컷에 맞추기
python scripts/loudness.py <in.wav> <out.wav> / --check <file>최종 음량 + 임계값 확인
bash scripts/mux.sh <video> <wav> <final>렌더링 없이 비디오에 사운드 추가
server/선택적 Docker 렌더 서버 (server/README.md)

예제

매우 다른 두 가지 스타일:

  • OutwardAnimates — 스타일화된 흐릿한 3D + 숫자가 계속 올라가는 세리프 HUD. 스타일 명세서: examples/outwardanimates-style.md.

  • Simply Animated — 검은 배경에 빛나는 "찰흙" 막대기 인형, "A vs B" 반쪽, 하나의 phonk 트랙에 맞춘 편집 컷. 스타일 명세서 + 씬: examples/simply-animated/README.md.

  • examples/data-center/ — 모드 A: "데이터 센터가 2초마다 전력이 두 배가 된다면?" (107초, 60초 규칙 이전에 제작): GPU → 서버 홀 → 교외 정전 → 밤의 지구 → 태양.

  • examples/x-followers/ — 모드 B: "X 계정의 팔로워가 1초마다 두 배가 된다면?" (49초): 엄마 → 거리 → 경기장 → 도시 → 지구 → 은하수. 단 한 번의 시각적 또는 사운드 수정 없이 승인됨 — 참조 실행으로 사용.

  • examples/simply-animated/ — 모드 A: "AI 빌더 에디션" (34초): 94 BPM 비트에 맞춰 컷된 다섯 개의 "A vs B" 비유, beatgrid.py + music.sh로 실제 트랙에 맞춤. src/rig.js는 재사용 가능한 막대기 인형 리그 (IK, 계단 및 경사면 보행) — 캐릭터가 있는 모든 스타일의 시작점.

관련 스킬