just take a walk — 제작기
🎬 영상: https://youtu.be/ED2PEiQC3p8
Daniel × Scott 인디 어쿠스틱 듀오의 첫 뮤비. Chillwave 톤, 노을·로드무비 컨셉. 곡 2:49, 영상 170초, 1920×1080 / 30fps.
시작 — “그냥 산책 같은 곡인데”
곡은 Daniel 보컬에 어쿠스틱한 챌웨이브였다. 가사는 “오늘 나 좀 심심해, 길을 마냥 걷는데” 로 시작해 “붉은 노을이 나를 안아” 로 흘러간다. 처음 들으면 그냥 잔잔한 산책 곡 같지만, 노을이 가슴을 데우는 따뜻한 멜랑꼴리가 깔려있다.
컨셉 한 줄: 노을 + 길 걷기 + 따뜻한 멜랑꼴리 + 일상 회복.
채널의 다른 영상들이 AI·코딩 톤이라 결이 다른 감성 실험이기도 했다.
캐릭터 — 듀오를 진짜 듀오답게
처음엔 한 프롬프트에 두 캐릭터를 같이 묘사해 시트를 만들었다. 결과는 묘하게 닮은 두 사람. AI가 같은 프레임 안의 얼굴을 비슷하게 그리는 경향이 있었다.
해결: 솔로 시트를 따로 생성. 인상이 분리되면서 듀오로 같이 찍어도 둘이 명확히 다른 사람으로 보였다.
| 캐릭터 | 인상 |
|---|---|
| Daniel | 22세 동안 베이비페이스, 둥근 얼굴 + 큰 눈, 어깨까지 오는 곱슬머리, 빈티지 크림 셔츠 + 베이지 카디건 |
| Scott | 26세, 좁은 길쭉한 얼굴 + 각진 턱, 또렷한 광대 + 날카로운 아몬드 눈, 짧은 검은 머리, 데님 자켓 + 화이트 티 |
씬 구성 — 듀오 1/3 비율
처음 시안은 20씬 중 듀오가 14씬이었다. 너무 많았다. 듀오만 계속 나오면 각자의 감정이 안 살았다.
재배치 후: Daniel solo 8 / Scott solo 4 / Duo 7 / Environment 1.
가사 arc에 맞춰 솔로와 듀오를 교차 — *“해가 지고 있었고”*는 Daniel solo, *“붉은 노을이 나를 안아”*는 듀오 wide together.
영상 생성 — ChatGPT image로 그리고 Grok Imagine으로 움직이기
각 씬은 두 단계로 만들었다.
- ChatGPT image 2.0(gpt-image-2) — 캐릭터 시트를 참조 첨부해 키 프레임 이미지 한 장 생성. 빛·구도·표정까지 정해진 그림을 먼저 확정.
- Grok Imagine 에이전트 모드 — 그 키 프레임을 입력으로 짧은 영상 클립으로 움직임 추가.
총 19개 클립 완성 (Scene 17은 컨셉 안 맞아서 drop).
가장 까다로웠던 건 Scene 10 — “듀오 바닷가 뛰기 splash”. 처음 만든 건 클립 퀄이 약했고, 다시 만든 건 발이 꼬이는 컷이 들어갔다. 결국 같은 씬 클립을 세 번 만들고서야 OK가 나왔다.
이 한 컷 때문에 v9 → v10 → v11 세 번 렌더했다.
조립 — Remotion 컴포지션 (v1 → v11)
영상은 Remotion으로 React/TypeScript 코드처럼 조립했다.
단계별 진화
- v1: 스틸 이미지 + Ken Burns + 0.53s 크로스페이드 + BGM. 첫 프로토타입.
- v2: NowPlayingWidget 추가. EQ 비주얼라이저 + 곡 제목 + Daniel & Scott 부제 + 프로그레스 바.
- v3: EQ만 페이드 인/아웃 — 의도와 달랐다.
- v4: 전체 OverlayLayer로 페이드 인 1.5s / 페이드 아웃 3s.
- v5: 부제 텍스트 정정 — 캐릭터를 가수로, 우리는 제작자.
- v6: 19개 AI 클립 (ChatGPT image + Grok Imagine) 첫 통합. 새 씬 순서.
- v7: 마지막 씬 playbackRate 0.67x — 8s 클립을 12s Sequence에 자연스럽게 펼침.
- v8: 인터레이스 스캔라인 + CRT 비네트 추가. “딱 브라운관~!” 톤.
- v9: CRT 전원 끄기 효과 — 마지막 0.6초에 화면이 수직 수축 → 가로선 → 점 → opacity 0.
- v10, v11: Scene 10 클립 두 차례 재교체.
기술 함정 — 그리고 그 해결
1. AI 비디오 클립 frame seek 흔들림
Grok Imagine 출력은 가변 프레임레이트(VFR)에 B-frame이 들어있어 Remotion에서 seek할 때 미묘하게 흔들렸다. AI 비디오 모델 출력 전반에 흔한 문제.
해결: ffmpeg로 strict CFR 재인코딩.
-vf scale=1264:720,fps=30
-bf 0 -g 30 -keyint_min 30 -sc_threshold 0
-vsync cfr -an -c:v libx264 -crf 18
B-frame 제거 + 키프레임 30프레임마다 + 강제 CFR.
2. 단일 클립 스왑 워크플로
Scene 10을 두 번 갈았다. 매번 19개 전체 클립 작업할 순 없었다.
워크플로:
- 새 클립 → 같은 파일명으로 덮어쓰기
- ffmpeg strict CFR 재인코딩
- Remotion 렌더 (5분)
- YouTube unlisted 업로드 (5분)
이 사이클이 안정적이라 향후 단일 컷 패치는 부담이 적다.
3. CRT 효과 위에 인터레이스
인터레이스 스캔라인 + CRT 비네트 + 플리커. 1264×720 클립을 1920×1080으로 업스케일하면서 생기는 노이즈를 가리는 동시에, 챌웨이브 무드를 강화했다.
결론: 효과 자체보다 왜 그 효과를 쓰는지가 더 중요했다 — 노이즈 가림 + 무드.
도구 스택
| 단계 | 도구 |
|---|---|
| 캐릭터 시트 | OpenAI Codex CLI (gpt-image-2) |
| 씬 키프레임 (이미지) | ChatGPT image 2.0 (gpt-image-2) |
| 씬 영상화 | Grok Imagine (에이전트 모드) |
| 클립 정규화 | ffmpeg (strict CFR 재인코딩) |
| 영상 조립 | Remotion (React/TypeScript) |
| BGM | (곡 작업자 측) |
| 렌더 | Remotion CLI |
| 업로드 | Python google-api-python-client |
학습한 것들
- 듀오 캐릭터 시트는 따로 생성 — 한 프롬프트에 같이 넣으면 인상이 닮아짐.
- 참조 첨부 시 포즈 복제 위험 —
-i참조는 그림체·색감은 좋지만 포즈/구도까지 복제됨. 명시적 분리 지시 필요. - 참조 이미지의 aspect ratio = 출력 ratio — 16:9 결과 원하면 16:9 시트 만들 것.
- AI 영상 클립은 strict CFR로 정규화 — Remotion 같은 frame-precise 도구에선 VFR이 미묘한 흔들림을 만든다.
- 단일 클립 스왑 사이클 — 한 컷만 갈아도 전체 워크플로(재인코딩→렌더→업로드)는 그대로. 사이클이 짧으면 퀄리티에 더 까다로워질 수 있다.
- 효과의 이유 — CRT/인터레이스가 “예뻐서”가 아니라 해상도 한계 가림 + 무드 강화라는 두 목적을 동시에 풀어줘서 채택한 것. 이유가 분명한 효과만 살아남았다.
다음 작품 후보
- 같은 채널의 다른 곡 (없으면 신규 곡 작업)
- Daniel·Scott 듀오 유지하거나, 새 캐릭터로 분기
- 컨셉: 야간 도시 / 비 / 카페 — 노을 다음의 무드
