Communitygithub.com

Kreesten-hsh/video

사용자가 '릴스/틱톡/유튜브 쇼츠 영상 만들어 줘', '숏폼 영상 템플릿 만들어 줘', '숏폼 후크 작성해 줘', '시청 유지율 편집해 줘', '패턴 인터럽트 추가해 줘', '영상 반복 재생 만들어 줘', '처음 3초 수정해 줘', '세로 영상 편집 속도 조절해 줘' 또는 '9:16 안전 영역 설정해 줘'라고 요청할 때 사용합니다. 숏폼 세로 영상의 후크→시청 유지→반복 재생 문법을 다룹니다 (론치 프로모션 영상과 구분됨).

video란 무엇인가요?

이 스킬은 Remotion을 기반으로 한 숏폼 세로 영상(릴스, 틱톡, 유튜브 쇼츠) 제작을 위한 전문 에이전트 스킬입니다. 숏폼 영상을 단순한 작은 런치 필름이 아닌 '시청 유지 기계'로 설계하며, 후크, 패턴 인터럽트, 반복 재생 루프를 중심으로 한 구조를 제공합니다. 이 스킬의 핵심은 시청 유지율(retention)이며, 약 87%의 시청자가 처음 3초 안에 영상을 넘길지 결정한다는 데이터에 기반하여 모든 편집 결정이 이루어집니다. 세부적으로는 1초 이내의 강력한 후크 작성법, 2~4초 간격의 시각적 패턴 인터럽트, 9:16 안전 영역 준수, 자막 처리, 그리고 완벽한 반복 재생 루프 구현까지 포함되어 있습니다. 최종 출력은 Remotion 컴포지션(구성)이며, 프레임 기반 애니메이션(`useCurrentFrame()`)을 사용하고, 사전 정의된 스크립트를 통해 스틸 이미지 검증 후 MP4로 인코딩하는 워크플로를 제공합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Kreesten-hsh/video/tree/HEAD/.agents/skills/short-form-video

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

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

문서

숏폼 비디오 (Short-Form Video)

스와이프를 견디는 9:16 비디오를 설계하세요. 숏폼은 작은 런치 필름이 아닙니다. 시청 유지 기계입니다. 첫 1초를 벌어주는 후크, 몇 초마다 주의를 환기시키는 패턴 인터럽트, 그리고 100%를 넘는 시청 시간을 확보하는 반복 재생 루프로 구성됩니다. 핵심은 타이밍이지 완성도가 아닙니다.

사용 시기

  • 릴스 / 틱톡 / 유튜브 쇼츠 (7~60초, 세로 9:16).
  • 시청 유지율 편집: 이탈 구간 수정, 패턴 인터럽트 추가, 속도 조절.
  • 후크, 끊김 없는 루프, 재사용 가능한 숏폼 템플릿 (하나의 디자인, 다양한 주제).

이야기 구조 (시청 유지 계약)

숏폼 스토리텔링은 시청자의 엄지손가락과의 계약입니다. 매 초마다 다음 1초를 다시 벌어야 합니다. 이야기는 시청 유지 곡선에서 거꾸로 만들어지지, 인트로에서 앞으로 만들어지지 않습니다. 타임라인을 건드리기 전에 다음을 확정하세요.

  • 비디오당 하나의 아이디어. 숏폼은 정확히 하나의 페이오프를 전달합니다. 두 번째 아이디어는 주의를 분산시키고 곡선 중간이 처지게 만듭니다. 대신 두 번째 비디오로 만드세요. 한 문장으로 핵심 전달 내용을 말할 수 없다면 아직 숏폼이 준비되지 않은 것입니다.
  • 처음 ~3초 안에 루프를 열고, 마지막에 닫으세요. 후크는 질문이나 공백(열린 루프)을 제시하고, 페이오프가 그 답을 제공합니다. 루프가 열려 있기 때문에 시청자는 계속 봅니다. 따라서 절대 일찍 답하지 말고, 절대 페이오프를 준비 단계 아래에 묻지 마세요.
  • 데드 에어(침묵) 금지. 모든 비트는 아이디어를 발전시키거나 주의를 환기시킵니다. 둘 다 하지 않는 것은 잘라내세요. 침묵, 느린 시작, 서두 인사("안녕하세요, 여러분, 이번 영상에서는…")는 시청자가 넘겨버리는 지점입니다.
  • 곡선이 단위 작업이지, 컷이 아닙니다. 알고리즘은 초당 시청 유지율 곡선을 평평하게 유지하는 것을 배포합니다. 곡선을 평평하게 만드는 "좋은" 편집보다 곡선을 높게 유지하는 "못생긴" 편집이 승리합니다. 여러분은 곡선을 편집하는 것이며, 후크가 그 이후의 모든 것을 결정합니다. 후크부터 먼저 수정하세요.

서사적 뼈대 (후크 → 설정 → 본문 → 페이오프/루프 흐름은 아래 표에서 예산이 책정됨):

단계이야기 역할실패 시 결과
후크루프 열기; 페이오프 약속처음 3초 안에 스와이프
긴장 유지본문 동안 공백 유지중간이 지루해짐, 중간 이탈
페이오프루프 닫기 — 하나의 아이디어 전달"시간 낭비", 공유 없음
루프 / CTA프레임 0으로 피드백 또는 명확한 요청 하나재시청 없음, 행동 없음

(시청 유지 아크 표는 각 단계에 초를 할당합니다. 이 섹션은 그 뒤에 있는 서사적 논리와 순서입니다. 후크 문법은 후크 패턴을 나열합니다.)

모든 것을 결정하는 하나의 지표

시청 유지율, 제작 가치가 아닙니다. 알고리즘은 시청자를 붙잡는 것을 배포합니다. 약 87%가 3초 안에 시청 또는 스와이프를 결정하며, 배포 기준은 70% 이상의 평균 시청 완료율(쇼츠 ~73%, 틱톡 ~78%, 릴스 ~65%) 근처에 있습니다. 아래의 모든 결정은 그 곡선을 위해 이루어집니다. 0:04에 지루하게 만드는 완벽한 샷보다 지루하지 않게 잡아주는 못생긴 샷이 낫습니다.

시청 유지 아크

비트역할예산 (20초 숏폼 기준)
후크 (0~1초)열린 루프를 만드는 한 프레임 + 한 줄0~1초
설정왜 봐야 하는지 — 약속, 이해관계, 또는 공백을 설명1~4초
본문비트 단위로 가치 전달; 비트당 하나의 아이디어4~17초
페이오프 / 루프루프 닫기 — 또는 프레임 0으로 피드백17~20초

본문의 길이를 조절하고, 후크는 절대 변경하지 마세요. 60초 숏폼은 더 긴 본문과 더 많은 비트를 가지지만, 동일한 1초 후크를 사용합니다.

후크 문법 (처음 ~1초)

후크는 뇌가 닫고 싶어 하는 호기심 공백을 여는 문장 + 시각입니다. 하나의 패턴을 선택하고 고수하세요:

후크 유형형태가장 적합한 용도
열린 루프"X가 Y를 유지하는 이유는…" (답변 지연)대부분의 콘텐츠
직접 약속"30초 안에 ___하는 3가지 방법"교육 / 목록형
패턴 인터럽트스냅-줌 / 휘프-팬 / 프레임 1의 시각적 불일치엔터테인먼트
부정"___ 하지 마세요" / "당신의 ___는 틀렸습니다"강한 의견

두 가지 규칙: 후크 텍스트는 프레임 1에 화면에 자막으로 표시되어야 하며 (85%가 음소거 시청), 가장 눈에 띄는 시각 역시 첫 프레임이어야 합니다. 느린 페이드 인은 절대 사용하지 마세요. 강력한 오프닝 프레임을 유지하고, 검은색에서 페이드 업하지 마세요.

패턴 인터럽트 및 컷 리듬

패턴 인터럽트는 주의를 환기시키는 모든 변화입니다: 하드 컷, 줌 펀치, B롤 삽입, 음향 효과, 자막 팝, 각도 변경. 숏폼에서는 밀도가 높습니다. 약 2~4초마다 시각적 변화가 있어야 하며, 약 4초마다 인터럽트가 있는 비디오는 정적인 얼굴만 나오는 비디오(~41%)에 비해 약 58%의 시청 유지율을 보입니다. 가장 큰 적은 평평한 중간입니다. 틱톡은 시청 완료 곡선이 평평해지면 배포를 제한하므로, 본문을 에너지가 낮은 테이크로 연결하지 마세요.

// 모든 인터럽트를 실제 시간(wall-clock)이 아닌 FRAME 기준으로 구동 — 결정론적으로 렌더링
import { useCurrentFrame } from "remotion";
const fps = 30;
const cuts = [0, 1.2, 3.0, 5.4, 8.0, 11.2, 14.0]; // 초 — 의도적으로 불규칙
const frame = useCurrentFrame();
const shot = cuts.findIndex((t, i) => frame < (cuts[i + 1] ?? Infinity) * fps);

간격을 다양하게 하세요. 메트로놈처럼 규칙적이면 지루함으로 읽힙니다. 불규칙한 컷은 속도감으로 읽힙니다. 펀치인 줌은 새 푸티지가 필요 없는 가장 저렴한 인터럽트입니다:

import { useCurrentFrame, interpolate, spring, useVideoConfig } from "remotion";
const PunchIn = ({ at, children }) => {
  const frame = useCurrentFrame(); const { fps } = useVideoConfig();
  const s = spring({ frame: frame - at * fps, fps, config: { damping: 12, stiffness: 200 } });
  const scale = interpolate(s, [0, 1], [1, 1.12]); // 비트에 맞춰 112%로 스냅
  return <div style={{ transform: `scale(${scale})`, transformOrigin: "50% 45%" }}>{children}</div>;
};

자막

대부분의 시청자는 음소거 상태로 시청하므로, 화면 자막은 선택이 아닌 필수입니다. 콘텐츠를 전달하고 각 구문이 나타날 때 패턴 인터럽트 역할도 합니다. 줄당 4~7단어, 높은 대비, 안전 영역 내에 배치하세요. 여기서 자막 애니메이션을 다시 구현하지 마세요. caption-animation 스킬을 사용하여 단어별 타이밍, 가라오케 하이라이트, 스타일링을 처리하세요. 이 스킬은 시청 유지 타임라인에 자막을 배치하고 9:16 안전 영역 내에 두는 역할만 합니다.

루프 및 재시청

끊김 없는 루프는 각 재시청을 새로운 시청 시간으로 계산합니다. 깨끗한 8초 루프를 3번 시청하면 300% 시청 완료율로, 가장 강력한 신호입니다. 두 가지 기술: 마지막 프레임을 첫 프레임과 일치시키고 (동일한 구성, 위치, 색상), 문장 루프를 작성합니다. 후크를 페이오프가 프레임 0으로 다시 피드백되도록 작성하세요 ("…그래서 나는 절대 — " → 시작으로 루프). 재시청에 가장 좋은 길이는 약 7~15초입니다.

9:16 안전 영역

플랫폼 UI가 텍스트나 얼굴을 가리지 않도록 범용 안전 영역 안에 컴포즈하세요.

영역픽셀 (1080×1920)피해야 할 것
범용 안전 (모든 플랫폼)중앙 900×1400그 외부에 중요한 콘텐츠 배치 금지
상단약 120px 확보프로필 / 사운드 UI
하단약 320px 확보자막, CTA, 해시태그, 오디오 바
오른쪽약 120px 확보좋아요 / 댓글 / 공유 버튼

후크 텍스트와 주요 피사체를 중앙 900×1400 상자 안에 넣으세요. 하단 약 320px은 편집기에서 비어 보여도 확보하세요. 플랫폼이 자체 자막과 버튼을 그리는 곳입니다.

출력 체크리스트

  • 후크 텍스트가 프레임 1에 화면에 표시됨; 가장 강력한 시각이 첫 프레임 (페이드 인 없음).
  • 처음 ~4초 안에 하나의 열린 루프 / 약속 설정.
  • 약 2~4초마다 시각적 패턴 인터럽트; 간격 불규칙; 평평한 중간 없음.
  • 자막 있음 (caption-animation 통해), 4~7단어, 안전 영역 내.
  • 루프 닫힘 — 첫/마지막 프레임 일치 또는 프레임 0으로 피드백되는 문장.
  • 900×1400 중앙 상자 안에 컴포즈; 하단 320px / 상단 120px / 오른쪽 120px 확보.
  • 모든 애니메이션 값은 useCurrentFrame()에서 파생 — CSS/라이브러리 타이머 사용 금지.

전달 및 검증 (렌더링된 스틸 → MP4)

패키징된 헬퍼 (scripts/): scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png로 스틸을 타일링한 다음, scripts/probe-mp4.sh out.mp4 [WxH] [fps]로 인코딩을 확인하세요. scripts/README.md 참조.

숏폼은 Remotion 컴포지션 (<Composition> + zod schema + defaultProps)으로 제공됩니다. 모든 컷, 펀치인, 인터럽트는 useCurrentFrame()에 의해 구동되며, Date.now() / Math.random() / 타이머는 절대 사용하지 않습니다. 산출물 = out/*.mp4 + 프로젝트 (주제별로 재렌더링). 9:16 세로 (1080×1920)가 기본입니다.

검증 루프 — 스틸 렌더링 → 검사 → 인코딩. 세 가지 프레임이 시청 유지를 결정하는 세 가지 사항(후크, 속도, 루프 이음새)을 테스트합니다.

# 후크 / 본문 중간 / 마지막 프레임의 스틸 — 배송된 프롭(실제 주제, 기본값 아님) 사용
npx remotion still Short out/f-hook.png --frame=10  --props='{"topic":"...","hook":"..."}'   # ~처음 3초 즉시 읽힘
npx remotion still Short out/f-mid.png  --frame=N   --props='{"topic":"...","hook":"..."}'
npx remotion still Short out/f-end.png  --frame=L   --props='{"topic":"...","hook":"..."}'   # L = durationInFrames-1

# 각 PNG 검사:
#  - 후크 프레임 (~프레임 0 / 처음 3초): 후크 텍스트가 화면에 표시되고 즉시 읽힘; 가장 강한 시각이 이미 올라와 있음 (페이드 인 없음)
#  - 루프 이음새: f-hook(프레임 0)과 f-end(마지막 프레임) 비교 — 동일한 구성/위치/색상으로 보이지 않는 루프 컷 확인
#  - 9:16 안전 영역: 후크 + 주요 피사체가 중앙 900x1400 상자 안에 있음; 상단 약 12%, 하단 약 20-35% (자막/CTA/오디오), 오른쪽 동작 버튼 영역 확보

npx remotion render Short out/short.mp4 --props='{"topic":"...","hook":"..."}'   # 스틸 검증 후 한 번 인코딩
npx remotion render Short out/demo.gif --codec=gif                                # README 증명 클립

주제별 / 배치별: 모든 주제를 렌더링하기 전에 스틸로 하나의 주제를 검증하세요. durationInFrames/fps를 위해 npx remotion compositions를 사용하여 중간 및 마지막 프레임을 선택하세요.

완료 전 확인 사항:

  1. 스틸이 후크, 중간, 마지막 프레임에서 오류 없이 깔끔하게 렌더링됨.
  2. 후크 프레임이 즉시 읽힘 (화면 텍스트 + 가장 강한 시각이 앞쪽에, 페이드 인 없음); 첫 번째와 마지막 프레임이 깔끔한 루프 이음새를 위해 일치함.
  3. 후크 + 피사체 + 자막이 모든 확인된 프레임에서 9:16 중앙 900×1400 안전 상자 안에 있음.
  4. 프레임 기반 전용 — Date.now() / Math.random() / 타이머 없음; 컷 불규칙, 평평한 중간 없음.
  5. 실제 주제의 배송된 프롭 (defaultProps 아님)이 올바르게 렌더링됨; MP4 인코딩 완료, GIF는 선택 사항.

참고 파일

  • references/retention-pacing.md — 완전히 실행 가능한 Remotion <Short> 컴포지션: 불규칙 컷이 있는 프레임 기반 샷 스케줄러, PunchIn 패턴 인터럽트, 화면 후크, 9:16 안전 영역 오버레이, 끊김 없는 첫 번째/마지막 프레임 루프 포함. 또한 후크 패턴 라이브러리, 시청 유지 곡선 디버깅 방법, 플랫폼별 안전 영역 맵, 템플릿×주제 배치 렌더링 패턴 포함.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

관련 스킬