# Remotion 영상 자동화 리서치 보고서

**작성일:** 2026-03-06
**작성팀:** dev2 (오딘 팀장, 토르/프레이야/미미르/헤임달)
**관련 태스크:** task-342.1

---

## 1. Remotion 기술 분석

### 1.1 최신 버전 및 아키텍처

- **현재 안정 버전:** v4.0.434 (2025년 3월 5일 릴리즈)
- 모든 서브패키지(`@remotion/lambda`, `@remotion/renderer` 등)가 동일 버전 번호 공유
- **v5.0 마이그레이션 가이드**가 이미 공개됨 — 메이저 업그레이드 임박

**핵심 철학:** "비디오는 시간에 따른 이미지의 함수 (A video is a function of images over time)"

**렌더링 파이프라인:**
1. `<Composition>` 컴포넌트에 width, height, fps, durationInFrames 등록
2. `@remotion/bundler` → Webpack으로 React 프로젝트 번들링
3. Chromium/Puppeteer가 headless 브라우저로 각 프레임을 스크린샷 캡처
4. 매 프레임마다 `useCurrentFrame()` 훅으로 현재 프레임 번호 → React 컴포넌트가 해당 시점 화면 결정
5. FFmpeg이 이미지 시퀀스를 지정 코덱으로 인코딩 + 오디오 합성
6. 최종 영상 파일 출력

**v4.0 핵심 변경사항:**
- Rust 바이너리 내장 — 성능 병목 구간을 Rust로 재작성
- FFmpeg 6.0 커스텀 빌드를 `node_modules` 내에 번들 내장 (별도 설치 불필요)
- `<OffthreadVideo>` v3.3 대비 281% 빠른 프레임 추출 (Rust 기반 캐시)
- `@remotion/rive` Rive 애니메이션 지원 추가

### 1.2 핵심 API

**`@remotion/renderer` 주요 함수:**
- `bundle(entryPoint, onProgress?)` — Webpack 번들링
- `getCompositions(bundleLocation, options?)` — 등록된 Composition 목록 조회
- `renderMedia(options)` — 프레임 렌더링 + FFmpeg 스티칭 단일 호출 (권장)
- `renderFrames(options)` — 개별 프레임만 PNG/JPEG로 렌더링
- `stitchFramesToVideo(options)` — 이미지 시퀀스 → 비디오 변환
- `renderStill(options)` — 단일 프레임(정지 이미지) 렌더링

**컴포넌트 내부 핵심 훅:**
- `useCurrentFrame()` — 현재 렌더링 중인 프레임 번호 (0-indexed)
- `useVideoConfig()` — fps, width, height, durationInFrames 반환
- `interpolate(value, inputRange, outputRange)` — 값 보간
- `spring(frame, fps, config)` — 물리 기반 스프링 애니메이션

### 1.3 지원 포맷

**비디오 코덱 (5종):**
- **h264** (기본값) — `.mp4`, `.mkv` / CRF 1-51(기본18) / 빠른 인코딩, 최고 호환성
- **h265 (HEVC)** — `.mp4` / CRF 0-51(기본23) / 작은 파일, 브라우저 지원 불량
- **vp8** — `.webm` / CRF 4-63 / h264보다 작은 파일, 느린 인코딩
- **vp9** — `.webm` / CRF 0-63(기본28) / 매우 작은 파일, 매우 느린 인코딩
- **prores** — `.mov` / 6개 프로파일(proxy~4444-xq) / 전문 편집용, 파일 매우 큼

**기타 출력:**
- GIF 애니메이션
- 정지 이미지: PNG, JPEG, PDF, WebP
- 오디오 전용: MP3, WAV, AAC

### 1.4 렌더링 성능

**서버 사이드 렌더링 소요시간 (Remotion Lambda, 2048MB RAM 기준):**
- Hello World 짧은 클립: 7~11초
- **1분 Full HD 영상: 약 15~20초**
- 10분 HD 원격 비디오 포함 영상: 약 56~61초
- 10초 4K 영상: 약 45~53초

**성능 영향 변수:**
- `--concurrency` 값 (CPU 코어 수 상한)
- 코덱 선택 (H264가 속도 면 최적)
- `<OffthreadVideo>` 사용 여부
- GPU 유무 (WebGL, CSS 필터 관련)
- 해상도 및 프레임레이트 (4K는 1080p의 4배 이상)

### 1.5 서버 요구사항

- **Node.js:** v4.x는 16.0.0+, v5.0+는 18.0.0+
- **FFmpeg:** v4.0부터 번들 내장 (별도 설치 불필요)
- **Chromium:** Remotion CLI가 자동 다운로드/관리
- **Linux:** glibc 2.35+, Chromium 헤드리스 실행용 표준 라이브러리
- **하드웨어 권장:** CPU 코어 많을수록 유리, RAM 최소 4GB(1080p), SSD 임시 저장 공간

### 1.6 라이선스 및 비용

**무료 사용 가능:**
- 개인 사용자
- 직원 3명 이하 영리 조직
- 비영리 단체
- 평가/학습 목적

**유료 라이선스 (4인 이상 영리 조직):**
- **Creators:** $25/월/시트 (연간 $250/년/시트)
- **Automators:** $0.01/렌더, 최소 $100/월
- **Enterprise:** $500+/월 (협의)

### 1.7 Remotion Lambda (AWS 서버리스)

**동작 방식:**
1. Lambda 함수 배포 + S3 버킷 생성
2. 오케스트레이터 Lambda가 영상을 N개 청크로 분할
3. N개 워커 Lambda가 병렬 렌더링 (Chromium 내장)
4. 청크들을 FFmpeg로 합성 → S3에 최종 파일 업로드

**Lambda 비용 예시 (us-east-1, 2048MB):**
- Hello World 짧은 클립: ~$0.001
- **1분 Full HD 영상: ~$0.017~$0.021**
- 10분 HD 영상: ~$0.103~$0.108
- 10초 4K 영상: ~$0.013~$0.014

---

## 2. ThreadAuto 연동 시나리오

현재 ThreadAuto: Python 기반 (PIL), 1080x1350 카드뉴스 5장, Threads 이미지 캐러셀 자동 업로드

### 시나리오 A: 카드뉴스 슬라이드쇼 영상

**개요:** 기존 5장 이미지 → 전환 애니메이션(fade, slide 등) + BGM → 15~30초 릴스 영상

**필요 기술:** FFmpeg(subprocess) 또는 MoviePy + pydub(선택)

**예상 작업량:**
- Phase 1: FFmpeg 설치 + 기본 슬라이드쇼 파이프라인 (1~2일)
- Phase 2: 전환 애니메이션 적용 (1~2일)
- Phase 3: BGM 합성 + 볼륨 페이드 (0.5~1일)
- Phase 4: ThreadAuto 파이프라인 통합 + Threads 업로드 연결 (1일)
- **총: 3~6일**

**장점:**
- 기존 Python 스택 유지, 언어 전환 없음
- 서버 리소스 부담 최소 — 인코딩 시 CPU 일시 스파이크 후 정상화
- 1080x1350 5장 기준 인코딩 약 5~15초
- 기존 파이프라인에 "후처리 단계" 하나만 추가

**단점:**
- 정적 이미지 단순 연결 → 시각적 임팩트 한계
- 콘텐츠 내 개별 요소(텍스트, 숫자) 애니메이션 불가
- 차별화 매력도 B/C 대비 낮음

### 시나리오 B: 텍스트 애니메이션 영상

**개요:** 카드뉴스 콘텐츠(텍스트/데이터)를 Remotion React 컴포넌트로 재구성. 타이핑 효과, 카운트업, 차트 애니메이션.

**필요 기술:** Node.js 18+ + Remotion 4.x + React + @remotion/renderer + Python↔Node 브리지(JSON)

**예상 작업량:**
- Phase 1: Node.js/Remotion 프로젝트 세팅 (1~2일)
- Phase 2: PIL 레이아웃 → React 컴포넌트 재설계 (3~5일) ← **핵심 병목**
- Phase 3: 애니메이션 구현 (3~5일)
- Phase 4: Python→JSON 직렬화 레이어 (1일)
- Phase 5: Remotion 렌더러 + ThreadAuto 통합 (2~3일)
- Phase 6: VPS Chromium+Remotion 안정화 테스트 (2~3일)
- **총: 12~19일**

**장점:**
- 최고 시각적 퀄리티 — 요소별 독립 애니메이션
- React 컴포넌트 재사용성
- 정교한 타이밍 제어

**단점:**
- Python + React + Node.js 동시 운용 → 기술 스택 전환 비용 최대
- VPS 사양 부족 시 렌더링 실패/느린 처리
- Chromium 1인스턴스 400~800MB 메모리 → 2GB VPS에서 OOM 위험

### 시나리오 C: 하이브리드 (A+B 조합)

**개요:** 표지/마무리(2~3장)는 PIL 이미지 그대로, 핵심 데이터 슬라이드(1~2장)만 Remotion 애니메이션 → FFmpeg concat 병합

**예상 작업량:**
- Phase 1: 시나리오 A 완성 (3~6일)
- Phase 2: 핵심 슬라이드 1~2개 Remotion 구현 (4~7일)
- Phase 3: 이미지 클립 + Remotion 클립 FFmpeg 병합 (1~2일)
- Phase 4: 파이프라인 통합 + 슬라이드 타입 분기 (1~2일)
- **총: 9~17일**

**장점:** B의 서버 부하 줄이면서 핵심 애니메이션 효과 확보. A 먼저 릴리즈 후 점진 확장 가능.
**단점:** 두 기술 스택 동시 유지. 해상도/프레임레이트/코덱 통일 관리 필요. Chromium 메모리 문제 동일.

---

## 3. 대안 기술 비교

### FFmpeg 직접 사용 (Python subprocess)

**장점:**
- 완전 무료 (LGPL/GPL)
- 모든 비디오 포맷 지원
- 하드웨어 가속 지원 (NVIDIA CUDA, Intel QSV)
- 렌더링 속도 최고 수준 (저수준 C 코드)
- Docker 패키징 용이

**단점:**
- 학습 곡선 가파름 (filter_complex 문법)
- 디버깅 어려움
- 텍스트 렌더링 품질 낮음 (drawtext 필터 기본적)
- 복잡한 애니메이션 구현 난해

**비용:** 완전 무료 / **난이도:** 상 / **커스터마이징:** 상 / **Python 호환:** 최고

### MoviePy (Python)

**장점:**
- 순수 Python API로 직관적
- NumPy 배열 픽셀 단위 접근 → 커스텀 이펙트
- OpenCV, PIL/Pillow와 자연스러운 연동
- MoviePy 2.0에서 의존성 대폭 축소 (Pillow만 사용)
- 빠른 프로토타이핑에 최적

**단점:**
- FFmpeg 직접 사용 대비 속도 느림 (Python 오버헤드)
- 대용량(4K, 장시간) 메모리 이슈
- 병렬 렌더링 미지원
- 내부 FFmpeg 의존

**비용:** 완전 무료 (MIT) / **난이도:** 중 / **커스터마이징:** 상 / **Python 호환:** 최고

### Shotstack API

**장점:**
- 서버 인프라 불필요 (완전 클라우드)
- Python SDK 공식 지원
- 렌더링 매우 빠름 (60초 영상 → 약 22.8초)
- 안정적 운영 환경

**단점:**
- 누적 비용 (대용량 시 고비용)
- 픽셀 단위 제어 불가
- 인터넷 필수
- Rate Limit: Production 10 req/s

**비용:**
- Sandbox: 무료 (워터마크)
- Pay-As-You-Go: $0.30/분 (최소 $75 구매)
- 구독: $39/월~ ($0.20/분, 200 크레딧 포함)

**난이도:** 하 / **커스터마이징:** 중 / **Python 호환:** 높음

### Creatomate API

**장점:**
- JSON 기반 선언형 영상 정의 → 대량 개인화에 강점
- 노코드 + 코드 모두 가능
- 템플릿 에디터 포함
- feed 연동(CSV/데이터 기반) 대량 자동화

**단점:**
- 공식 Python SDK 없음 (requests 직접 호출)
- Essential 플랜 크레딧 빠른 소진 가능
- 렌더링 속도 벤치마크 미공개

**비용:**
- 무료 체험 50 크레딧
- Essential: $49/월 (2,000 크레딧)
- Growth: $119/월 (10,000 크레딧)
- Beyond: $299/월 (50,000 크레딧)

**난이도:** 하~중 / **커스터마이징:** 중 / **Python 호환:** 중간

### Remotion

**장점:** React 선언적 구성, 픽셀 퍼펙트, Lambda 서버리스, 소스 공개
**단점:** React+JS 필수(Python 팀 부담), Puppeteer 기반 무거움, 기업 라이선스 필요
**비용:** 개인 무료, 기업 $25/시트/월 또는 $0.01/렌더(최소 $100/월)
**난이도:** 상 / **커스터마이징:** 최고 / **Python 호환:** 낮음

### ThreadAuto 관점 기술 추천 순위

1. **MoviePy** — Python 팀 가장 자연스러움, 빠른 프로토타이핑
2. **Shotstack API** — 서버 부담 없이 클라우드 렌더링, Python SDK
3. **FFmpeg 직접** — 최대 성능 + 무료, FFmpeg 전문성 필요
4. **Creatomate** — 대량 개인화 영상 자동화 시 강점
5. **Remotion** — Python 팀에는 기술 스택 부담 과대, React 개발자 있을 때만

---

## 4. Threads/Instagram 릴스 요구사항

### 4.1 Threads API 영상 업로드

**현황: 영상 업로드 완전 지원** — 현재 이미지 캐러셀만 사용 중인 것은 API 제약이 아닌 구현 선택의 문제.

**지원 미디어 타입:**
- TEXT, IMAGE, VIDEO, CAROUSEL (최대 20개 이미지+영상 혼합)
- GIF 지원 추가 (2025년 10월)

**API 워크플로우 (2단계):**
1. 미디어 컨테이너 생성: `POST /v1.0/{user-id}/threads` — `media_type=VIDEO`, `video_url=...`
2. 게시물 발행: `POST /v1.0/{user-id}/threads_publish` — `creation_id={media_id}`

**캐러셀 내 영상 포함:** `is_carousel_item=true` + `media_type=VIDEO`로 이미지와 영상 자유 혼합 가능

**영상 제한사항:**
- 포맷: MOV 또는 MP4, 코덱: H.264 또는 HEVC
- 프레임레이트: 23~60 FPS
- 최대 해상도: 1920px(폭), 최소 해상도: 320x360px
- 최대 길이: 5분(300초), 최대 파일 크기: 1GB
- 권장 해상도: 1080x1920px (9:16 세로)

### 4.2 Instagram Reels API

**업로드 가능:** Instagram Graph API 공식 지원 (Business/Creator 계정)

**API 워크플로우:**
1. `POST /v21.0/{ig-user-id}/media` — `media_type=REELS`, `video_url=...`, `share_to_feed=true`
2. `POST /v21.0/{ig-user-id}/media_publish` — `creation_id={id}`
3. 상태 확인: `GET /v21.0/{creation_id}?fields=status_code` → `FINISHED` 확인 후 발행

**필요 권한:** `instagram_basic`, `instagram_content_publish`, `pages_read_engagement`

**자동화 주의사항:**
- 24시간 롤링 윈도우: 계정당 100건 (Reels + 피드 + 스토리 합산)
- **시간당 API 호출 한도: 200건** (2025년 Meta 대폭 감축, 기존 5,000건에서 96% 감소)
- 초과 시 업로드 거부, 24시간 후 자동 초기화

### 4.3 최적 영상 사양 (두 플랫폼 공통)

- **포맷:** MP4
- **코덱:** H.264
- **해상도:** 1080x1920 (9:16)
- **프레임레이트:** 30 FPS
- **오디오:** AAC 48kHz
- **비트레이트:** 5,000~8,000 kbps

**Threads 추가:** 최대 5분, 최대 1GB
**Instagram Reels 추가:** 최대 90초 (일부 60초), 최대 650MB

### 4.4 영상 vs 캐러셀 도달률

**Instagram (2025-2026 데이터):**
- Reels 평균 도달률: **30.81%**
- 캐러셀 평균 도달률: **14.45%**
- 이미지 평균 도달률: **13.14%**
- Reels가 캐러셀 대비 **약 2.13배** 더 많은 도달률

**단, 인게이지먼트는 캐러셀 우세:**
- 캐러셀 평균 인게이지먼트율: 10%
- Reels 평균 인게이지먼트율: 6%
- 캐러셀이 저장+좋아요 약 12% 더 많이 발생

**팔로워 규모별 역전:**
- 소규모 계정(1,000명 미만): Reels 압승
- 대규모 계정(100만+): 캐러셀이 Reels 역전

**Instagram 공식(Adam Mosseri) 2025-2026 권장:** Reels 60~70% + 캐러셀 20~30% 믹스

**Threads:**
- 텍스트 기반 대화가 핵심 가치 — 형식(영상/이미지)보다 댓글 깊이, 공유, DM 발송 지표 중시
- 영상이 무조건 유리한 구조가 아님
- 공식 수치 데이터 미공개

**전략적 결론:**
- 신규 계정 / 성장 목표 → Reels가 더 효과적 (도달률 우선)
- 기존 팔로워 강화 / 저장율 → 캐러셀이 더 효과적
- **최적 전략: 두 포맷 병행** (Reels로 발견, 캐러셀로 전환/저장)

---

## 5. 구현 난이도 및 로드맵 제안

### 서버 환경 실행 가능성 (현재 Tailscale VPS 추정 2~4코어, 2~8GB RAM)

**시나리오 A:**
- 2코어 2GB: 실행 가능, 인코딩 시 CPU 일시 스파이크 후 정상화
- **현재 VPS 그대로 사용 가능**

**시나리오 B:**
- 2코어 2GB: OOM 위험 높음 (Chromium만 500MB+)
- 2코어 4GB: 렌더링 가능하나 15~30초 영상에 5~10분 소요
- 4코어 8GB: 실용적 운용 (1~3분 렌더링)
- **최소 4GB RAM 필요, 서버 업그레이드 가능성**

**시나리오 C:** B와 동일 (부분 렌더링이어도 Chromium 기동 비용 동일)

### 시나리오별 종합 비교

**구현 난이도:** A(낮음) < C(중~높음) < B(높음)
**예상 개발 기간:** A(3~6일) < C(9~17일) < B(12~19일)
**서버 리소스:** A(현재 가능) < C/B(업그레이드 필요)
**시각적 퀄리티:** A(보통) < C(중~높음) < B(높음)
**유지보수 복잡도:** A(낮음) < C/B(높음)
**추가 인프라 비용:** A(없음) < C/B(서버 업그레이드 또는 클라우드 API 비용)

---

## 결론: 권장안 + 근거

### 1순위 권장: 시나리오 A (카드뉴스 슬라이드쇼 영상) + MoviePy/FFmpeg

**근거:**
1. **기존 스택 유지:** Python 단일 스택으로 안정적 운용 중. 언어 전환 없이 후처리 단계만 추가
2. **현재 VPS 즉시 실행:** 서버 업그레이드 불필요
3. **빠른 검증:** 3~6일 개발로 영상 콘텐츠 효과를 데이터로 검증 가능
4. **릴스 도달률 이점 확보:** "영상이냐 이미지냐"에서 도달률 차이의 상당 부분이 발생. 전환 애니메이션 퀄리티가 도달률을 크게 좌우하지 않음
5. **낮은 실패 비용:** 효과가 미미하더라도 투자 대비 손실 최소

**권장 기술:** MoviePy (Python 네이티브, 빠른 프로토타이핑) 또는 FFmpeg subprocess (최대 성능)

### 2순위: 시나리오 A 이후 점진적 C 전환

A 릴리즈 후 영상 형식의 성과를 측정 → 시각적 퀄리티 개선이 실제 성과에 영향을 미치는지 데이터로 확인 → C로 전환. A 코드베이스가 C의 정적 슬라이드 파트로 재사용 가능.

### 시나리오 B 선택 조건 (모두 충족 시만)

- 서버 4GB RAM 이상 업그레이드 의사 있음
- React/Node.js 경험자 확보
- 동적 효과(타이핑, 카운트업)가 브랜드 아이덴티티로 필수

### 권장 실행 로드맵 (시나리오 A 기준)

- Day 1: FFmpeg/MoviePy 설치 + 기본 이미지→MP4 변환 POC
- Day 2: 전환 효과(crossfade, slide) 적용 + 파라미터 조정
- Day 3: BGM 합성, 페이드인/아웃
- Day 4: ThreadAuto 파이프라인 통합 + 영상 생성 단계 추가
- Day 5~6: 엣지케이스 테스트 + Threads 영상 업로드 API 연동 확인

---

## 참고 소스

- Remotion 공식 사이트 (remotion.dev)
- Remotion GitHub (github.com/remotion-dev/remotion)
- Remotion 라이선스/비용 문서
- Remotion Lambda 문서 및 비용 예시
- Shotstack Pricing & API 문서
- Creatomate Pricing & API 문서
- MoviePy PyPI / GitHub
- Threads API 공식 문서 (Postman)
- Instagram Graph API Reels 문서
- Instagram 도달률/인게이지먼트 벤치마크 (SocialInsider, Buffer, EpicOwl, CreatorsJet)
- Meta Adam Mosseri 2025-2026 알고리즘 가이드
