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 } ] }
  ]
}