TRENDSHIFT #15 · 2026-06-08

Clypra 딥다이브
— Tauri·React로 만든 오픈소스 CapCut

Clypra는 Tauri(Rust) + React 19 + TypeScript로 만든 크로스플랫폼 데스크탑 영상 편집기입니다. CapCut 같은 상용 NLE를 전부 오픈소스(MIT)로, 웹 기술로 재현하면서도, 영상 디코딩·썸네일·내보내기는 네이티브 FFmpeg에 맡기는 하이브리드 구조가 핵심입니다. 프리뷰와 익스포트가 같은 렌더 파이프라인을 공유한다는 설계가 특히 배울 만합니다. (AIEraDev/Clypra · MIT · macOS/Windows/Linux + 모바일)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 하드웨어/시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

한 문장으로 — 이게 뭐 하는 물건인가

"브라우저 기술(React·Canvas·WebGL)로 만든 화면을, 데스크탑 앱 껍데기(Tauri/Rust)에 담고, 무거운 영상 처리는 네이티브 FFmpeg에 떠넘긴 오픈소스 영상 편집기"입니다. 타임라인 위에 클립을 올리고 자르고 자막을 얹어 MP4로 뽑는, CapCut·프리미어가 하는 일을 무료·로컬·오픈소스로 합니다.

핵심 비유

"웹페이지로 만든 편집기 화면 + Rust로 만든 엔진룸 + FFmpeg이라는 엔진"

Clypra는 한 대의 자동차 같습니다. 운전석·계기판(UI)은 누구나 익숙한 웹 기술(React)로 만들고, 차체(데스크탑 앱)는 가볍고 빠른 Tauri(Rust)로 찍어냅니다. 그런데 실제로 바퀴를 굴리는 엔진(영상 디코딩·인코딩)은 직접 만들지 않고, 검증된 FFmpeg을 그대로 가져다 씁니다.

덕분에 "웹 개발자도 만들 수 있는 UI"와 "전문 편집기급 영상 성능"을 한 앱에 담았습니다. 이 분업이 Clypra 코드 전체를 관통하는 설계 철학입니다.

용어
NLE (Non-Linear Editor, 비선형 편집기)
영상을 처음부터 끝까지 순서대로만 만지는 게 아니라, 타임라인 아무 지점이나 자유롭게 잘라 붙이고 끼워넣을 수 있는 편집 방식. 프리미어·파이널컷·CapCut이 모두 NLE입니다. Clypra는 이걸 웹 기술로 구현했습니다.
용어
Tauri (타우리)
웹 기술(HTML·CSS·JS)로 만든 화면을 데스크탑 앱으로 포장해 주는 Rust 기반 프레임워크. Electron과 목적은 같지만, 자체 브라우저를 통째로 끼워넣는 Electron과 달리 OS에 이미 깔린 웹뷰를 빌려 써서 앱 용량이 수십 MB대로 작고 메모리도 적게 씁니다.

2왜 주목받는가

트렌딩에 오른 이유와 경쟁 도구 대비 차별점

① "CapCut을 오픈소스로" — 분명한 메시지

CapCut이 유료화·계정 강제·클라우드 종속으로 사용자 불만을 키우던 시점에, Clypra는 "프리미엄 CapCut 기능을 무료로"라는 직관적 슬로건을 들고 나왔습니다. 영상 편집기는 누구나 필요를 이해하는 카테고리라, "무료 + 오픈소스 + 로컬 처리(영상이 서버로 안 올라감)"라는 조합 자체가 강한 후킹 포인트입니다.

② Electron이 아니라 Tauri를 골랐다

영상 편집기는 무겁기로 악명 높습니다. Clypra는 Electron 대신 Tauri를 택해 설치 용량과 메모리를 크게 줄였고, 무거운 연산은 웹뷰가 아니라 Rust/FFmpeg에 내려보냅니다. "웹 기술로 만들되 네이티브 성능을 포기하지 않는다"는 접근이 기술 커뮤니티의 흥미를 끕니다.

③ 코드 자체가 잘 설계된 교본

알파 단계(Rust 크레이트 0.1.0-alpha.1)인데도 구조가 성숙합니다. React에 의존하지 않는 순수 엔진 계층(src/core/)을 따로 두고, 프리뷰와 익스포트가 같은 스케줄러를 공유하며, 플랫폼별 차이는 어댑터로 격리합니다. 80여 개 테스트 파일에 속성 기반 테스트(fast-check·proptest)까지 갖췄습니다.

경쟁 도구와의 비교

ClypraCapCutDaVinci ResolveShotcut/Kdenlive
가격무료·MIT유료(프리미엄)무료+유료무료·오픈소스
오픈소스아니오아니오
로컬 처리전부 로컬클라우드 의존로컬로컬
기반 기술Tauri+웹네이티브C++ 네이티브Qt/C++
앱 용량작음(수십 MB)매우 큼(GB)중간
성숙도알파(신생)성숙매우 성숙성숙
냉정한 평가
아직 알파 — 기대치를 정확히 맞추자

제품 버전은 1.0.1로 표기돼 있지만 Rust 코어는 0.1.0-alpha.1(첫 알파 2026-05-11)입니다. 다중 트랙 오디오 믹싱·영상 필터·클립 간 트랜지션·플러그인 시스템은 로드맵에 있을 뿐 아직 미완성입니다. 지금 Clypra의 가치는 "당장 프리미어를 대체"가 아니라, 웹 기술로 네이티브급 편집기를 만드는 법을 보여주는 레퍼런스 코드베이스라는 데 있습니다.

중요 사실
렌더링 핵심은 비공개 패키지에 있다

실제 합성·텍스트 이펙트 연산은 @clypra/engine(v1.5.0)이라는 비공개 npm 패키지에 들어 있고, 공개 레포는 그것을 호출·조율(orchestrate)만 합니다. 즉 "타임라인을 어떻게 엮고, 프리뷰와 익스포트를 어떻게 한 파이프라인으로 묶는가"는 공개돼 배울 수 있지만, "픽셀 단위 텍스트 래스터라이즈가 정확히 어떻게 계산되는가"는 닫혀 있습니다. 학습용으로 볼 때 이 경계를 알고 보는 게 중요합니다.

3기술 스택 전체 지도

프론트엔드 · 네이티브 백엔드 · 인프라를 한눈에

Clypra는 크게 웹뷰(React 화면) / 네이티브(Rust+FFmpeg 엔진) / 빌드·배포 3층으로 나뉩니다. "가벼운 건 위(웹)에서, 무거운 건 아래(네이티브)에서" 처리하는 분업이 일관되게 적용됩니다.

프론트엔드 (웹뷰 안에서 도는 화면)

분류기술역할
UI 프레임워크React 19.1 + TypeScript ~5.8편집기 화면 전체. 최신 React 19 채택
상태관리Zustand 5도메인별 스토어 분리(timeline/project/ui/history/settings…)
드래그앤드롭react-dnd 16 (HTML5 backend)클립을 타임라인에 끌어다 놓기
스타일Tailwind 4.2 + shadcn + Radix UICSS-우선 설정, 접근성 좋은 UI 컴포넌트
아이콘/유틸lucide-react, clsx, cva, tailwind-merge아이콘·조건부 클래스 처리
폰트@fontsource 24종자막용 번들 폰트(오프라인에서도 동작)
애니메이션 템플릿lottie-web 5.13클라우드에서 받는 애니메이션 자막/템플릿
렌더 엔진(비공개)@clypra/engine 1.5.0장면 평가·텍스트 이펙트·래스터라이즈 (소스 비공개)

네이티브 백엔드 (Tauri/Rust 쪽)

분류기술역할
앱 셸Tauri 2.11웹뷰 호스팅 + JS↔Rust 명령(invoke) 다리
영상 디코딩ffmpeg-next 8 (libav 바인딩)썸네일·프레임을 CLI가 아닌 라이브러리로 빠르게 디코딩
영상 인코딩FFmpeg 사이드카(CLI)최종 내보내기. 앱에 동봉된 ffmpeg/ffprobe 실행
병렬 처리rayon 1.10, crossbeam, dashmap 6썸네일 대량 디코딩을 멀티코어로
비동기 런타임tokio프로세스 파이프·채널·타이머
이미지/유틸image 0.25, uuid, md5, base64, walkdir프레임 인코딩·세션 ID·캐시 키
로컬 자막(STT)OpenAI Whisper tiny (Python, uv 실행)오디오에서 자막 자동 생성(로컬, 약 39MB 모델)

빌드 · 배포 · 모바일

분류기술역할
번들러Vite 7 (@tailwindcss/vite, plugin-react)프론트엔드 빌드, 포트 1420 고정
테스트Vitest 4 + Testing Library + fast-check / proptest단위·속성 기반 테스트(80여 개 파일)
모바일Capacitor 8.4 (iOS/Android)같은 웹 코드를 모바일 셸로
배포Homebrew cask · DMG · MSI · AppImagemacOS/Windows/Linux 패키지
CI/CDGitHub Actions (ci.yml, release.yml)빌드·테스트·릴리스 자동화
비유

주방에 비유하면 — 홀(React UI)은 손님이 보는 화려한 공간이고, 주방(Rust)은 주문을 받아 처리하는 곳, 그리고 가스불·오븐(FFmpeg)은 실제 열을 내는 설비입니다. Clypra는 홀과 주방은 직접 지었지만, 화구는 검증된 제품(FFmpeg)을 사다 설치했습니다. 그래서 "요리(영상)가 빠르고 안정적"입니다.

4아키텍처 심화 분석

전체 구조도와 핵심 설계 패턴 4가지

전체 시스템 구조

┌─ 웹뷰 (브라우저 엔진 안) ──────────────────────────────────┐ │ React 19 UI ─ 타임라인 · 클립 · 자막 · 미리보기 캔버스 │ │ │ │ │ Zustand 스토어 (timeline / project / history / ui …) │ │ │ │ │ src/core/ (React 비의존 순수 엔진) │ │ compositor → evaluation → render(rasterizer) → scheduler │ │ │ │ │ │ WebGL2 아틀라스(필름스트립) Canvas2D/OffscreenCanvas(합성) │ └──────────────┬───────────────────────────────────────────────┘ │ Tauri invoke() / Channel (JS ↔ Rust) ▼ ┌─ 네이티브 (Rust, src-tauri) ─────────────────────────────────┐ │ thumbnail_engine/ ffmpeg-next 하드웨어 디코더 풀 │ │ · decode_frame_gpu → 원시 RGBA (재인코딩 없음, 3~15ms) │ │ commands/export.rs raw RGBA → ffmpeg stdin 스트리밍 │ │ commands/media.rs ffprobe 메타데이터 + Whisper 자막 │ │ commands/project.rs JSON 프로젝트 저장/불러오기 │ └──────────────┬───────────────────────────────────────────────┘ ▼ FFmpeg / ffprobe (사이드카 외부 실행) libx264 · libx265 · prores_ks · AAC 믹싱

설계 패턴 ① 프리뷰와 익스포트가 같은 파이프라인을 쓴다

대부분의 편집기는 "화면에 보이는 미리보기"와 "최종 출력물"을 따로 만들어, 둘이 미묘하게 다른 사고를 냅니다(WYSIWYG 붕괴). Clypra는 FrameScheduler 하나가 우선순위(realtime > export > background)만 다르게 둔 채 같은 평가→래스터화 경로를 태웁니다. 그 결과 미리보기에서 본 그대로가 내보내기 결과로 나옵니다.

용어
래스터라이즈 (Rasterize)
"이 시점에 화면에 무엇이 보여야 하는가"라는 추상적 장면 기술을, 실제 픽셀 격자(비트맵)로 그려내는 과정. Clypra는 Canvas2D/OffscreenCanvas 위에 클립·자막을 그려 한 프레임의 RGBA 픽셀을 만들어냅니다.

설계 패턴 ② "트랙 중심"이 아니라 "시간 중심" 컴포지터

전통적 편집기는 "1번 트랙, 2번 트랙…"을 먼저 쌓고 그 위에 클립을 얹습니다. Clypra의 compositor는 반대로 "시각 T 시점에 존재하는 것이 무엇인가"를 먼저 풀고, 클립은 트랙이 아니라 역할(role)을 가집니다. 유효성 검사도 편집을 막지 않고 진단만 남기는(diagnostic, non-blocking) 방식이라, 사용자가 자유롭게 편집하다가 나중에 정리할 수 있습니다.

설계 패턴 ③ 내보내기 = 임시파일 없는 RGBA 스트리밍

익스포트할 때 프레임을 PNG로 디스크에 잔뜩 저장했다가 합치는 방식은 느리고 용량을 잡아먹습니다. Clypra는 각 프레임을 원시 RGBA 바이트 그대로 FFmpeg의 표준입력(stdin)에 흘려보냅니다. 디스크에 중간 파일이 생기지 않습니다.

[웹뷰] 타임라인 → FrameScheduler → 프레임 RGBA(ImageData) │ (프레임 시각 = startTime + i / frameRate, 부동소수 누적 오차 회피) │ invoke("write_export_frame", Uint8Array, { "session-id": id }) ▼ [Rust] start_video_export() 가 ffmpeg 자식 프로세스 1개 생성 ffmpeg -f rawvideo -pixel_format rgba -video_size WxH -framerate F -i pipe:0 ... 코덱/오디오믹싱 ... out.mp4 │ write_export_frame() → 바이트를 ffmpeg stdin 에 write │ 진행률·fps·ETA 를 Channel 로 UI 에 push ▼ finalize_video_export() → stdin 닫고 wait cancel_video_export() → 자식 프로세스 kill

오디오는 클립마다 atrim → asetpts → adelay → volume 필터를 만들어 amix로 합치고 AAC 128k로 인코딩합니다. 코덱은 H.264(libx264)·H.265(libx265)·ProRes(prores_ks)를 지원하며 +faststart로 웹 재생에 최적화합니다.

설계 패턴 ④ 썸네일은 "재인코딩 없는" 초고속 경로

타임라인을 빠르게 스크럽(scrub)하려면 프레임을 순식간에 뽑아야 합니다. Clypra는 이걸 내보내기 경로와 분리해, ffmpeg-next(라이브러리 바인딩)로 하드웨어 디코더(VideoToolbox·D3D11VA·VAAPI)를 쓰고, 재인코딩 없이 원시 RGBA를 바로 WebGL2 텍스처 아틀라스에 올립니다(프레임당 3~15ms). 같은 프레임을 동시에 여러 번 요청하면 in-flight 중복 제거로 한 번만 디코딩합니다.

용어
텍스처 아틀라스 (Texture Atlas) + epoch
작은 썸네일 수십 장을 하나의 큰 GPU 텍스처에 모아 담아, 한 번의 그리기 호출(drawArrays)로 필름스트립 전체를 그리는 기법. 타임라인이 바뀌면 epoch(세대 번호)를 올려 이전 캐시를 통째로 무효화합니다. 매번 개별 이미지를 GPU에 올리는 것보다 훨씬 빠릅니다.
용어
COOP / COEP (교차출처 격리)
tauri.conf.jsonCross-Origin-Opener-Policy: same-origin + Cross-Origin-Embedder-Policy: require-corp를 설정합니다. 이렇게 "교차출처 격리(cross-origin isolation)" 상태가 되면 브라우저가 SharedArrayBuffer와 고정밀 타이머를 허용합니다. 멀티스레드·고성능 렌더링에 필요한 보안 전제 조건입니다.

5디렉토리 구조 해부

웹(src) · 네이티브(src-tauri) 두 세계
clypra/ ├── package.json # clypra 1.0.1, React19·Zustand·Tauri·Capacitor ├── vite.config.ts # Vite7 + tailwind, 포트1420 고정, src-tauri 무시 ├── components.json # shadcn 설정 (style: radix-vega) ├── capacitor.config.ts # 모바일(iOS/Android) 설정 ├── index.html │ ├── src/ # ── 웹뷰: React 화면 + 순수 엔진 ── │ ├── core/ # ★ React 비의존 엔진 (가장 배울 가치 높음) │ │ ├── compositor/ # 시간중심 프레임 해석 (역할 기반) │ │ ├── evaluation/ # 시각 T 의 장면 평가 + 캐시 │ │ ├── render/ # rasterizer.ts = 시각 출력의 단일 진실원 │ │ ├── scheduler/ # FrameScheduler (프리뷰·익스포트 공용) │ │ ├── playback/ # PlaybackClock · TransportAuthority │ │ ├── resources/ # VideoElementPool · 미디어 캐시 │ │ ├── history/ # Command 패턴 → 100단계 undo/redo │ │ ├── platform/adapters # tauri / capacitor / web 어댑터 │ │ └── fonts/ # 결정적 폰트 로딩(자막 재현성) │ ├── lib/renderEngine/ # 필름스트립용 WebGL2 래스터 표면 │ │ └── videoExport.ts # 익스포트 프레임 루프(Rust 호출) │ ├── store/ # Zustand 스토어 묶음 + autoSave 미들웨어 │ ├── components/ # 타임라인·미리보기·패널 UI │ ├── features/ # text-effects(Whisper 자막) · text-templates │ ├── hooks/ constants/ types/ │ └── App.tsx main.tsx │ ├── src-tauri/ # ── 네이티브: Rust 엔진룸 ── │ ├── Cargo.toml # tauri2.11 · ffmpeg-next8 · rayon · tokio │ ├── tauri.conf.json # 창설정 · COOP/COEP · 에셋 스코프 · 사이드카 │ ├── src/ │ │ ├── lib.rs # 34개 invoke 명령 등록 + 썸네일엔진 init │ │ ├── commands/ # export · thumbnail · media · project │ │ ├── thumbnail_engine/ # decoder · pyramid · queue · cache · atlas │ │ └── models/ # MediaMetadata · Project 직렬화 구조 │ ├── bin/ # ffmpeg · ffprobe 사이드카 │ └── capabilities/ # 권한 스코프(fs · shell:사이드카만 허용) │ ├── android/ ios/ # Capacitor 모바일 셸 └── .github/workflows/ # ci.yml · release.yml
구조 읽기 포인트

src/core/가 React를 전혀 import하지 않는다는 게 핵심입니다. UI(React)와 엔진(core)을 분리해 두면, 나중에 React를 다른 프레임워크로 바꾸거나 모바일/웹/데스크탑에서 같은 엔진을 재사용할 수 있습니다. "화면은 갈아끼울 수 있고, 엔진은 유지된다"는 게 이 폴더 구조가 말하는 설계 의도입니다.

6학습 포인트

이 레포에서 기술별로 무엇을 배워갈 수 있는가

① Tauri 2 — 웹 앱을 데스크탑으로, JS↔Rust 통신

Clypra는 Tauri 2의 거의 모든 핵심을 실전 예제로 보여줍니다: invoke()로 JS에서 Rust 명령 호출, Channel로 Rust에서 JS로 진행률 스트리밍, capabilities/로 권한을 파일시스템·사이드카 실행만 좁게 허용, externalBin으로 FFmpeg을 동봉. "웹 개발 경험을 데스크탑 앱으로 확장하는" 가장 현실적인 교본입니다.

실습 아이디어 — 빈 Tauri 2 앱을 만들고, 버튼을 누르면 Rust가 0~100까지 세며 Channel로 진행률을 보내 프로그레스바를 채우게 해보세요. Clypra의 export 진행률과 같은 패턴입니다.

② Canvas / WebGL / WebCodecs — 브라우저로 영상 다루기

OffscreenCanvas로 백그라운드 스레드에서 합성하고, WebGL2 텍스처 아틀라스로 필름스트립을 한 번에 그리고, <video> 요소 풀(VideoElementPool)을 재사용하는 등, 브라우저에서 영상을 고성능으로 다루는 기법이 총집합돼 있습니다. 프런트엔드 개발자가 "캔버스/GPU"의 세계로 넘어갈 때 보기 좋은 코드입니다.

③ Zustand로 복잡한 상태를 도메인별로 쪼개기

편집기는 상태가 폭발하는 앱입니다. Clypra는 하나의 거대 스토어 대신 timelineStore·projectStore·historyStore 등으로 책임을 나누고, autoSaveMiddleware로 자동 저장을 미들웨어 한 곳에 모았습니다. 대형 상태를 어떻게 분할·정복하는가의 실전 사례입니다.

④ Command 패턴으로 Undo/Redo 구현

core/history/는 Move/Trim/Split/Delete/Transform 같은 편집 동작을 각각 실행/되돌리기를 아는 명령 객체로 만들고 저널(journal)에 쌓아 100단계 undo/redo를 구현합니다. 디자인 패턴 교과서의 Command 패턴이 실제로 어떻게 쓰이는지 볼 수 있습니다.

실습 아이디어 — 메모장 앱에 "글자 입력/삭제"를 Command 객체로 모델링해 undo/redo를 직접 구현해 보세요.

⑤ FFmpeg을 라이브러리(디코드)와 CLI(인코드)로 나눠 쓰기

같은 FFmpeg을 용도에 따라 다르게 씁니다: 빠른 응답이 필요한 썸네일은 ffmpeg-next 라이브러리 바인딩으로, 안정성과 코덱 호환이 중요한 최종 출력은 ffmpeg CLI 프로세스로. "도구를 언제 라이브러리로, 언제 외부 프로세스로 쓰는가"에 대한 좋은 판단 사례입니다.

⑥ 어댑터 패턴으로 멀티플랫폼 대응

platform/adapters/에 tauri·capacitor·web 어댑터를 두고 런타임에 환경을 감지(__TAURI_INTERNALS__·window.Capacitor)해 갈아끼웁니다. 같은 코드로 데스크탑·모바일·웹을 지원하는 추상화 설계를 배울 수 있습니다.

7하드웨어/시스템 요구사항

사용자 / 빌드하는 개발자 각각
항목내용
지원 OSmacOS · Windows · Linux (데스크탑) + iOS · Android (Capacitor)
설치(사용자)macOS: brew install AIEraDev/tap/clypra 또는 DMG · Windows: MSI · Linux: AppImage
FFmpegmacOS·Linux·Windows 모두 사이드카 스텁 구조이며, 배포용 릴리스에서는 각 트리플별 정적 빌드로 교체 필요. 개발 모드(npm run tauri dev)에서는 PATH의 시스템 FFmpeg 사용
GPUWebGL2 지원 필요(미리보기·필름스트립 가속). 하드웨어 디코더(VideoToolbox·D3D11VA·VAAPI) 있으면 더 빠름
빌드(개발자)Node.js 18+ · Rust/Cargo · FFmpeg → npm installnpm run tauri dev
클라우드 기능 키VITE_CLYPRA_API_KEY(.env) — 텍스트 이펙트·템플릿·Lottie 사용 시
로컬 자막Whisper tiny 모델(약 39MB) + uv(Python 실행기)

8직접 해볼 수 있는 실습 과제

난이도 순 5개 — 설치부터 코드 개조까지
과제 1 · 입문

설치하고 30초 영상 한 편 내보내기 ★☆☆☆☆

본인 OS에 맞게 설치한 뒤 영상·이미지·음악을 임포트해 타임라인에 올리고, 자막 한 줄을 얹어 1080p MP4로 내보내 보세요. 내보내는 동안 진행률 표시(fps·ETA)가 어떻게 갱신되는지 관찰합니다 — 그게 Rust Channel에서 오는 신호입니다.

과제 2 · 입문+

소스 빌드하고 dev 모드로 띄우기 ★★☆☆☆

레포를 클론해 npm installnpm run tauri dev로 직접 실행해 보세요. Rust가 처음 컴파일될 때 시간이 꽤 걸립니다. 콘솔에서 Rust 로그와 웹뷰 로그가 어떻게 같이 뜨는지(clearScreen:false 설정 덕분) 확인합니다.

과제 3 · 중급

새 invoke 명령 하나 추가하기 ★★★☆☆

src-tauri/src/commands/get_app_version 같은 간단한 Rust 명령을 만들어 lib.rsinvoke_handler에 등록하고, React에서 invoke("get_app_version")로 호출해 화면에 표시해 보세요. JS↔Rust 왕복의 최소 단위를 손에 익힙니다.

과제 4 · 중급+

내보내기 프리셋 추가하기 ★★★★☆

익스포트 프리셋(1080p-fast, 4k-quality 등)이 정의된 곳을 찾아 "720p-경량(낮은 비트레이트)" 프리셋을 추가해 보세요. -crf·-preset·해상도 값이 결과 파일 용량/화질에 어떻게 작용하는지 실험합니다.

과제 5 · 고급

핵심 구조를 베껴 미니 편집기 만들기 ★★★★★

Clypra의 골격 — Tauri 셸 + Canvas 합성 + FrameScheduler + RGBA→FFmpeg stdin 스트리밍 — 을 본떠, "이미지 N장을 슬라이드쇼 영상으로 내보내는" 최소 앱을 만들어 보세요. 프리뷰와 익스포트가 같은 렌더 함수를 쓰도록 설계하는 것까지가 목표입니다.

9관련 기술 심화 학습 로드맵

4주 코스 — Tauri 입문에서 영상 파이프라인까지
주차주제할 일
1주차Tauri 2 기초공식 튜토리얼로 빈 앱 만들기. invoke·Channel·capabilities(권한) 개념 익히기. 과제 1·2·3 수행
2주차브라우저 그래픽스Canvas2D → OffscreenCanvas → WebGL2 순서로 학습. 이미지 합성·텍스처 아틀라스 개념 정리. Clypra core/render/ 읽기
3주차FFmpeg 파이프라인FFmpeg CLI로 rawvideo→mp4 인코딩, filter_complex 오디오 믹싱 직접 실습. 코덱(libx264/265·ProRes)·CRF·preset 이해
4주차아키텍처 종합core(엔진)/UI 분리, 어댑터 패턴, Command 패턴 undo/redo 정리. 과제 4·5로 미니 편집기 완성

10핵심 키워드 사전

이 레포를 읽는 데 필요한 용어들
용어
Tauri웹 기술로 만든 화면을 Rust로 데스크탑 앱화하는 프레임워크. Electron보다 가볍다(OS 웹뷰 재사용)
invoke웹뷰의 JS에서 Rust 백엔드 명령을 호출하는 Tauri API. Clypra는 34개 명령을 등록
ChannelRust → JS 방향으로 데이터를 흘려보내는 통로. 내보내기 진행률·fps·ETA 전송에 사용
사이드카(Sidecar)앱에 동봉되어 함께 배포·실행되는 외부 실행파일. Clypra는 ffmpeg·ffprobe를 사이드카로 동봉
NLE비선형 편집기. 타임라인 어디든 자유롭게 잘라 붙이는 편집 방식(프리미어·CapCut)
래스터라이즈추상적 장면 기술을 실제 픽셀(비트맵)로 그려내는 과정
OffscreenCanvas화면에 붙지 않은 캔버스. 백그라운드 스레드(Worker)에서 합성 연산을 돌릴 수 있음
텍스처 아틀라스여러 작은 이미지를 한 큰 GPU 텍스처에 모아 한 번에 그리는 최적화 기법
WebCodecs브라우저에서 영상 코덱(디코드/인코드)에 저수준 접근하는 웹 API
COOP/COEP교차출처 격리 헤더. SharedArrayBuffer·고정밀 타이머를 켜는 보안 전제 조건
ffmpeg-nextFFmpeg의 libav를 Rust에서 직접 호출하는 라이브러리 바인딩. CLI보다 빠른 디코딩에 사용
rayonRust의 데이터 병렬 처리 라이브러리. 썸네일 대량 디코딩을 멀티코어로
Capacitor같은 웹 코드를 iOS·Android 네이티브 앱으로 감싸는 프레임워크
Zustand가볍고 간결한 React 상태관리 라이브러리. Clypra는 도메인별 스토어로 분리
Command 패턴동작을 "실행/되돌리기를 아는 객체"로 캡슐화. undo/redo 구현의 정석
Whisper tinyOpenAI의 경량 음성인식 모델(약 39MB). 로컬에서 오디오→자막 생성에 사용

11참고 링크

더 깊이 들어가기
링크설명
GitHub 저장소소스 전체. src/core/src-tauri/src/commands/export.rs가 핵심 읽을거리
TrendShift 페이지트렌딩 추이
Tauri 2 공식 문서invoke·Channel·capabilities·사이드카 표준
FFmpeg 공식 문서rawvideo 입력·filter_complex·코덱 옵션
WebCodecs API (MDN)브라우저 영상 코덱 저수준 처리
ZustandReact 상태관리 라이브러리
Capacitor 공식 문서웹 코드의 모바일 패키징