9. 영상편집 (xMaker)
9.1 목표
xFactory 가 만든 컷 mp4 + SRT + manifest 를 xMaker 비디오메이커(현재 씬/캔버스 기반, mp4 는 로컬 Node render.js 로 출력)에 비디오 클립 트랙으로 가져와 이어붙이기·자막·오디오를 넣고 최종 mp4 로 저장한다. 보완 항목:
| 영역 | 보완 내용 |
|---|---|
| 타임라인 | 멀티트랙(비디오/이미지/자막/오디오), 스냅, 줌, 키보드 단축키 |
| 클립 편집 | 트리밍, 분할, 순서 변경(드래그), 속도, 페이드 전환 |
| 텍스트/자막 | SRT 가져오기/편집, 스타일 프리셋(폰트·색·위치), 다국어 자막 트랙 |
| 오디오 | BGM 교체·볼륨·페이드, 내레이션 트랙 |
| 미리보기 | <video> + Canvas 합성 실시간 프리뷰(저해상도 프록시) |
| 출력 | 서버 렌더(FFmpeg) — 프로젝트 editor_projects JSON을 렌더 스펙으로 변환, 화면비 재출력(9:16 ↔ 16:9 재프레이밍) |
| 프로젝트 저장 | 자동 저장(5초 디바운스) + 버전 스냅샷 |
9.2 로컬 파일관리
- 브라우저 로컬: File System Access API(지원 시) 로 사용자 폴더를 연결하여 소재 가져오기/결과 저장; 미지원 브라우저는
<input type=file>+ 다운로드로 대체. 편집 중 프록시·캐시는 IndexedDB(xmaker-cache)에 보관, 용량 상한 및 정리 UI 제공. - 서버 소재함(My Files): 사용자별 업로드 소재 라이브러리(
assets.kind=upload), 폴더/태그, 용량 쿼터(레벨별), 중복 업로드 해시 검사, 썸네일 자동 생성. - 업로드: 청크 업로드(5MB 단위, 재개 가능)
POST /api/media/upload/init|chunk|complete, 허용 MIME 화이트리스트, 서버측 ffprobe 검증.
9.3 데이터 구조 (editor_projects.document JSON)
{
"version": 1, "aspect": "9:16", "fps": 30, "duration_ms": 30000,
"tracks": [
{ "id": "v1", "type": "video", "clips": [
{ "id": "c1", "asset_id": 123, "start_ms": 0, "in_ms": 0, "out_ms": 4000, "speed": 1.0,
"transition": { "type": "fade", "ms": 300 } } ] },
{ "id": "t1", "type": "text", "clips": [
{ "id": "s1", "start_ms": 0, "end_ms": 4000, "text": "...", "style": "preset-a", "lang": "ko" } ] },
{ "id": "a1", "type": "audio", "clips": [ { "asset_id": 456, "start_ms": 0, "gain_db": -6 } ] }
]
} 
ceil(길이/8) → 15s=2컷 · 30s=4컷 · 60s=8컷 · 3분=23컷 · 10분=75컷. 견적에 프레임(image × N+2)과 video_clip_8s(실측 단가) 반영.
2. 모델 (Higgsfield 실측 8초 단가)
standard: Kling 3.0 std, sound=on(네이티브 오디오·립싱크), start_image — 16 HF → 130 cr/컷
premium: Seedance 2.0 1080p, 네이티브 오디오, start_image + 캐릭터 키 시트 image refs — 72 HF → 580 cr/컷
30초 기준 standard ≈ 790 cr(≈₩11,000) · premium ≈ 2,640 cr(≈₩37,000)
3. 기획 (Claude, 장르×스타일 브리프 + 새 스키마)
hook: 전략 · 0~3초 화면 · 훅 라인. 씬 1은 결과 먼저/강한 주장/익스트림 클로즈업/빠른 리빌로 시작, 설정샷·로고·인사 금지.
style_key.look: 모든 프롬프트에 그대로 붙는 스타일 서술 1개(렌더·팔레트·조명·렌즈).
characters[≤3]: 이름·역할·외형 ~40단어(매 씬 동일 문구)·목소리. setting.world/product.
씬마다 visual_prompt(샷·렌즈·행동·조명) · motion_prompt(초 단위 타이밍) · dialogue(대상 언어 ≤12단어, 화자) · sfx(디제틱) · caption · voiceover · transition_out(안정된 프레임으로 끝) — 씬 = 한 샷, 컷/페이드/자막/몽타주 금지, 씬 간 샷 사이즈 변화·스크린 방향·조명 연속.
4. 일관성 체인 (scenePrompt() 한 곳에서 조립)
콘티(visual+캐릭터 외형+스타일 키) → 캐릭터 키 시트(정면+전신, 회색 배경) 생성 → 씬 프레임을 콘티+키 시트+참조 사진 레퍼런스로 → 클립은 프레임을 start_image로, Seedance는 키 시트까지 refs로. 클립 프롬프트 예:
… Host: Korean woman in her mid-30s, shoulder-length dark hair, white linen shirt… Camera and motion: 0-3s slow push-in; 3-8s hold. Host (female, warm, calm) says: "이거 써보셨어요?". Sound: soft room tone, no music. Ending: holds on the product. Style: … Single continuous shot, no cuts, no on-screen text…
5. 산출 — 컷 mp4(오디오·대사 포함) + SRT + manifest v2(hook·style_key·characters·컷별 start_sec/dialogue/sfx/transition) → xMaker에서 이어붙이기·자막·BGM만.