TRENDSHIFT 딥다이브 · 2026-06-08

ffmpeg webCLI 딥다이브
— 업로드 없는 영상 편집기, ffmpeg을 통째로 브라우저에 넣다

영상 편집의 만능 칼 ffmpegWebAssembly (Wasm, 브라우저에서 네이티브급 코드를 돌리는 표준)로 컴파일한 ffmpeg.wasm 위에 올린 완전 로컬 브라우저 영상 편집기입니다. GIF 제작·포맷 변환·압축·트림·회전·자막·자동 자막(Auto-Caption)·배치 처리 등 32+ 작업이 전부 내 기기 안에서 처리됩니다 — 서버 업로드 0, 데이터 수집 0. 한 번 열면 오프라인에서도 도는 PWA이고, 막히면 raw ffmpeg 명령을 직접 칠 수 있는 탈출구까지. 총 20여 개 파일로 이뤄진 작지만 알찬 레포입니다. (저장소: tejaswigowda/ffmpeg-webCLI · JavaScript · TrendShift 19위(06-05))
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"영상을 서버에 올리는 순간 프라이버시와 시간이 나간다 —
그래서 서버를 없앴다."

웹 기반 영상 도구의 통상 구조(업로드→서버 처리→다운로드)를 버리고, 처리 엔진 자체를 사용자 브라우저로 가져왔습니다. 결과: 100MB 영상도 업로드 대기 0초, 회사 기밀 영상도 외부 유출 걱정 0, 그리고 비행기 안에서도 동작.

기능은 데스크탑 편집기 부럽지 않습니다 — 2-pass 팔레트 GIF 제작, CRF 슬라이더 압축(실시간 용량 추정), 트림(모든 작업에 중첩 적용), 속도 변경(atempo 체인으로 음정 보존), 페이드·밝기/대비/채도·자막 임베드·영상 이어붙이기·PiP·오디오 믹싱까지. 그리고 UI에 없는 건 raw ffmpeg 명령 입력으로 — 이름이 "webCLI"인 이유입니다.

2왜 주목받는가

트렌딩 이유 · 경쟁 대비 장점.

온라인 영상 변환 사이트는 수십 개지만 거의 전부 업로드 방식 — 느리고, 용량 제한 있고, 내 영상이 남의 서버를 거칩니다. ffmpeg-webCLI는 "로컬 처리 + 오프라인 PWA + 광고/수집 없음"이라는 3무(無)로 차별화했고, 13개 파일짜리 미니멀 구현이라 "나도 읽고 베낄 수 있다"는 점이 개발자 트렌딩의 동력이 됐습니다.

비교 항목업로드형 변환 사이트ffmpeg webCLI
데이터 이동내 영상이 서버로기기 밖으로 1바이트도 안 나감
속도 병목업/다운로드 대역폭내 CPU (Wasm 멀티스레드)
오프라인불가PWA — 첫 방문 후 완전 오프라인
유연성제공 메뉴만32+ 작업 + raw ffmpeg 명령 탈출구
기술적 난관
브라우저에서 멀티스레드 ffmpeg을 돌리려면 보안 헤더가 필요하다

ffmpeg-core의 pthreads는 SharedArrayBuffer를 요구하는데, Spectre 보안 이슈 이후 브라우저는 COOP/COEP 헤더(교차 출처 격리)가 설정된 페이지에서만 이를 허용합니다. GitHub Pages 같은 정적 호스팅에선 헤더를 못 박죠.

이 레포의 해결
coi-serviceworker — 서비스워커로 헤더를 "후장착"

서비스워커가 응답을 가로채 COOP/COEP 헤더를 끼워 넣는 우회(coi-serviceworker.js)로 정적 호스팅에서도 멀티스레드를 살렸고, 자체 서버(server.js)로 띄울 땐 진짜 헤더를 설정합니다 — 같은 문제의 두 해법을 한 레포에서 비교할 수 있습니다.

3기술 스택 전체 지도

프레임워크 없는 바닐라 웹 스택.

레이어기술역할
처리 엔진ffmpeg.wasm (ffmpeg-core-mt)ffmpeg 전체를 Wasm으로 — 멀티스레드(pthreads) 버전.
백그라운드 실행Web Worker (docs/worker.js)인코딩 중에도 UI가 멈추지 않게 분리.
격리 헤더coi-serviceworker.js / server.jsSharedArrayBuffer 활성화의 두 경로 (정적 호스팅용 / 자체 서버용).
오프라인PWA (service-worker.js + manifest.json)에셋·Wasm 캐싱 — 설치형 앱처럼 동작.
UX 디테일Screen Wake Lock API긴 인코딩 중 화면 꺼짐 방지.
자동 자막(STT)Transformers.js + Whisper (docs/transcriber.js)브라우저 내 온디바이스 STT — 서버 없이 자막 자동 생성.
배치 처리Batch + Stack mode (docs/index.html)여러 파일에 작업 체인을 한 번에 적용 — 25개 작업 지원.
프론트엔드바닐라 HTML/JS (docs/index.html)프레임워크 0 — 전체가 한 줌의 파일.
용어
SharedArrayBuffer + COOP/COEP (교차 출처 격리)
여러 스레드가 같은 메모리를 공유하는 버퍼(멀티스레드 Wasm의 필수품)와, 그걸 켜기 위한 보안 헤더 한 쌍(Cross-Origin-Opener-Policy / Embedder-Policy). "사이트를 격리된 방에 넣어야 위험한 도구를 준다"는 브라우저의 거래 조건입니다.

4아키텍처 심화 분석

영상 파일 하나가 GIF가 되어 나오기까지 — 전부 브라우저 안.

ffmpeg webCLI 처리 흐름 (서버 없음) ┌────────────────────────────────────────────────────┐ │ ① 페이지 로드 │ │ coi-serviceworker가 COOP/COEP 헤더 주입 │ │ → SharedArrayBuffer 사용 가능 상태로 │ │ ▼ │ │ ② 사용자가 영상 선택 (파일은 메모리로만 — 업로드 아님) │ │ ▼ │ │ ③ UI에서 작업 선택 (예: GIF 만들기, fps·너비 설정) │ │ │ → 대응하는 ffmpeg 명령 문자열 조립 │ │ │ (또는 raw 명령 직접 입력) │ │ ▼ │ │ ④ Web Worker로 명령 전달 │ │ │ ffmpeg.wasm(멀티스레드 코어)이 가상 파일시스템에 │ │ │ 입력을 쓰고 명령 실행 — UI는 계속 반응 │ │ │ (Wake Lock으로 화면 꺼짐 방지) │ │ ▼ │ │ ⑤ 출력 파일을 가상 FS에서 꺼내 Blob으로 → 다운로드 링크 │ │ │ │ PWA 서비스워커: 에셋+Wasm 캐싱 → 다음부턴 오프라인 동작 │ └────────────────────────────────────────────────────┘

구조의 묘미는 "UI는 명령 조립기일 뿐"이라는 점입니다. GIF 메뉴도, 압축 슬라이더도 결국 ffmpeg 명령 문자열을 만들어 워커에 넘깁니다 — 그래서 raw CLI 모드가 자연스럽게 존재하고, ffmpeg을 아는 사람에겐 학습 비용이 0입니다. 속도 변경 기능이 0.5~2.0 범위 제한이 있는 atempo 필터를 자동으로 체인(예: 4× = atempo=2.0,atempo=2.0)하는 디테일에서, "ffmpeg 사용법의 모범 답안 모음"이라는 부가 가치도 생깁니다.

비유

세탁소에 옷을 맡기는 대신(업로드형), 전문가용 세탁기를 우리 집에 들여놓은 격입니다(Wasm). 버튼식 코스(UI 메뉴)도 있고, 다이얼을 직접 돌리는 수동 모드(raw 명령)도 있는 — 옷은 집 밖으로 안 나갑니다.

5디렉토리 구조 해부

13개 파일 전부가 한눈에.

ffmpeg-webCLI/ ├── docs/ 실제 앱 (GitHub Pages 루트) │ ├── index.html UI + 명령 조립 로직 ★ │ ├── worker.js ffmpeg.wasm 실행 워커 ★ │ ├── transcriber.js Whisper STT 워커 (Auto-Caption) ★ │ ├── three-bvh-csg-shim.js 3D 연산 shim (Auto-Caption 의존) │ ├── coi-serviceworker.js COOP/COEP 후장착 우회 │ ├── service-worker.js PWA 오프라인 캐싱 │ ├── manifest.json 설치형 앱 선언 │ └── vercel.json (Vercel 배포 시 헤더 설정) ├── server.js COOP/COEP를 진짜 헤더로 주는 │ 로컬 정적 서버 (node server.js) ├── demos/ README용 시연 GIF 3종 └── LICENSE·README.md
위치주목할 점
docs/index.html30+ 작업의 ffmpeg 명령 레시피가 모두 여기 — ffmpeg 치트시트로도 가치.
server.js주석이 친절한 60줄급 정적 서버 — "왜 이 헤더가 필요한가"가 코드에 설명됨.
coi-serviceworker.js정적 호스팅에서 교차 출처 격리를 얻는 커뮤니티 표준 패턴.

6학습 포인트 (기술별)

이 레포에서 배울 만한 것 + 어디를 보면 되는지.

포인트 1 — Wasm 실전

무거운 네이티브 도구를 브라우저로 옮기는 전 과정

멀티스레드 Wasm의 전제조건(SharedArrayBuffer→COOP/COEP), 정적 호스팅의 한계와 서비스워커 우회, 워커 분리 — "브라우저에서 ffmpeg급 도구 돌리기"의 모든 관문이 최소 코드로 시연됩니다.

포인트 2 — ffmpeg 레시피

실무 영상 처리 명령 30종의 정답지

2-pass 팔레트 GIF, CRF/preset 트레이드오프, atempo 체인, reverse+areverse, eq 필터 — index.html의 명령 조립부는 ffmpeg 학습 자료로 그대로 씁니다.

포인트 3 — PWA

오프라인 우선 도구 앱의 최소 구성

manifest + 서비스워커 캐싱 + Wake Lock — 설치형 웹 앱의 뼈대를 군더더기 없이 보여줍니다.

포인트 4 — Auto-Caption (온디바이스 STT)

Transformers.js + Whisper로 브라우저에서 자막 자동 생성

서버 없이 Whisper 모델을 브라우저에서 직접 돌려 자동 자막을 생성합니다 — docs/transcriber.js가 전담 워커. Wasm 처리 엔진(ffmpeg)과 AI 추론(Transformers.js) 두 무거운 작업이 모두 로컬에서 돌아가는 구조를 비교해볼 수 있습니다.

포인트 5 — 배치 처리 + 작업 체이닝

여러 파일에 작업 체인을 한 번에 — Batch + Stack mode

25개 작업을 여러 파일에 일괄 적용하는 배치 처리와, 작업들을 순서대로 묶어 한 번에 실행하는 Stack 모드를 제공합니다 — "UI가 ffmpeg 명령 조립기"라는 설계가 배치·체이닝으로 자연스럽게 확장되는 과정을 읽을 수 있습니다.

포인트 6 — 제품 철학

"로컬 처리"가 만드는 차별화

같은 기능이라도 데이터가 어디서 처리되는가로 신뢰·속도·오프라인이 갈립니다 — 프라이버시를 아키텍처로 보장하는 작은 본보기.

7시스템 요구사항

돌리려면 무엇이 필요한가.

항목요구사항
사용자모던 브라우저면 끝 — 라이브 앱 접속 또는 PWA 설치.
메모리처리할 영상이 브라우저 메모리에 올라감 — 수 GB급 대형 파일은 한계.
자체 호스팅node server.js 한 줄 (기본 포트 5500, COOP/COEP 포함) 또는 node server.js 8080으로 포트 지정. 아무 정적 호스팅도 가능(coi-serviceworker가 커버).
성능인코딩 속도 = 내 CPU. 네이티브 ffmpeg보다는 느리지만 업로드 시간이 없어 체감은 종종 더 빠름.

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

난이도별로 손에 익히는 단계.

실습 1

GIF 제작 + 오프라인 확인 난이도 ★☆☆ 입문

라이브 앱에서 짧은 영상을 GIF로 만들고, 비행기 모드로 전환한 뒤에도 앱이 동작하는지 확인합니다 — 개발자도구 Network 탭에서 "정말 아무것도 안 나가는지"도.

실습 2

raw 명령 모드 활용 난이도 ★★☆ 중급

UI에 없는 작업(예: 특정 구간만 모자이크, 워터마크 overlay)을 raw ffmpeg 명령으로 직접 실행해 봅니다 — ffmpeg 문법 연습장으로 활용.

실습 3

격리 헤더 실험 난이도 ★★☆ 중급

클론 후 server.js로 띄워 crossOriginIsolated가 true인지 콘솔로 확인하고, 헤더를 빼면 멀티스레드 코어가 어떻게 실패하는지 관찰합니다 — COOP/COEP의 동작을 몸으로 익히는 과제.

실습 4

내 작업 버튼 추가 난이도 ★★★ 고급

index.html의 명령 조립 패턴을 따라 새 작업(예: 9:16 세로 변환 + 블러 배경)을 UI 버튼으로 추가하고 PWA 캐시 갱신까지 처리해 봅니다.

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

한 주씩 따라가는 계획.

주차주제학습 자료
1주차앱 사용 + ffmpeg 기본 개념(코덱·컨테이너·CRF)라이브 앱 · ffmpeg 입문 자료
2주차ffmpeg.wasm API와 가상 파일시스템ffmpeg.wasm 문서 · worker.js
3주차교차 출처 격리 — SAB·COOP/COEP·coi 우회실습 3 · web.dev 격리 가이드
4주차PWA·워커 패턴 + 기능 추가실습 4 · service-worker.js

10핵심 키워드 사전

본문에 나온 용어 빠른 참조.

용어의미
ffmpeg영상·오디오 변환의 사실상 표준 CLI 도구.
WebAssembly (Wasm)브라우저에서 네이티브급 속도로 도는 바이너리 포맷 — C로 짠 ffmpeg을 통째로 이식 가능.
SharedArrayBuffer스레드 간 공유 메모리 — 멀티스레드 Wasm의 전제.
COOP / COEP교차 출처 격리 헤더 쌍 — SAB 사용 허가 조건.
coi-serviceworker정적 호스팅에서 격리 헤더를 후장착하는 서비스워커 우회.
PWA설치·오프라인이 가능한 웹 앱 표준.
CRFConstant Rate Factor — 18(거의 무손실)~51(최대 압축)의 품질 다이얼.
2-pass 팔레트GIF 256색 한계를 위해 최적 팔레트를 먼저 뽑고 적용하는 고품질 기법.
atempo음정 유지 속도 변경 필터 — 0.5~2 범위라 배속엔 체인 필요.
Wake Lock처리 중 화면 꺼짐을 막는 브라우저 API.

11참고 링크