final.mp4를 내놓는다.
핵심 아이디어는 LLM이 영상 프레임을 직접 보는 대신
12KB 텍스트 전사(transcript) + 필요 시점에만 PNG 비주얼로 영상을 이해한다는 것이다.
30,000 프레임 × 1,500 토큰 = 4,500만 토큰 대신 수십 킬로바이트의 텍스트로 해결한다.
(저장소: browser-use/video-use · Python + ffmpeg · MIT 라이선스)
이 저장소가 대체 무엇인가.
video-use는 Claude Code(또는 다른 AI 코딩 에이전트)에 장착하는 영상 편집 스킬 플러그인이다. 영상 편집의 전 과정 — 불필요한 침묵/필러워드 제거, 컬러 그레이딩, 자막 생성, 애니메이션 오버레이 합성 — 을 에이전트가 대화를 통해 처리한다. 사용자는 유튜브 편집자처럼 타임라인 UI를 다룰 필요 없이 "이 부분 잘라줘", "더 영화적으로 만들어줘"처럼 말로 지시한다.
기술적 핵심은 텍스트 우선 설계: ElevenLabs Scribe로 단어 단위 타임스탬프를 뽑아 12KB짜리 텍스트 파일로 압축한 뒤, LLM이 그 텍스트에서 컷 포인트를 결정한다. 시각 정보는 결정이 불확실할 때만 PNG 한 장씩 요청한다.
트렌딩 이유 · 경쟁 대비 장점.
browser-use 팀이 만들었고, "에이전트가 영상 편집을 한다"는 컨셉 자체가 화제가 됐다. browser-use는 이미 "LLM이 브라우저를 제어한다"로 큰 주목을 받은 팀인데, 같은 철학을 영상 편집에 적용했다.
| 이유 | 설명 |
|---|---|
| 에이전트 시대 | Claude Code, Codex 등 코딩 에이전트가 실용화되면서 "에이전트로 무엇을 할 수 있나" 탐색이 활발. 영상 편집은 전형적인 반복 작업이다. |
| 토큰 효율 설계 | "30,000 프레임 × 1,500 토큰 = 4,500만 토큰 대신 12KB 텍스트"라는 수치가 명확해 개발자들의 공감을 샀다. |
| browser-use 브랜드 | browser-use 팀의 신뢰도와 실용적 오픈소스 문화 덕에 출시 직후 스타가 빠르게 쌓였다. |
| 100% 오픈소스 | ElevenLabs API 키 하나만 있으면 완전히 자기 서버에서 돌릴 수 있다. 영상 편집 SaaS가 아닌 개인 에이전트 스킬이다. |
| 도구 | 방식 | video-use 대비 |
|---|---|---|
| Adobe Premiere / DaVinci Resolve | 전문 GUI 타임라인 편집 | 전문 지식 필요, 반복 작업(필러 제거 등)은 수동 |
| Descript | 텍스트 기반 편집 SaaS | 클라우드 의존, 구독 비용, 자동화 한계 |
| CapCut AI | 모바일 자동 편집 | 커스터마이징 불가, 에이전트와 대화 불가, 소스 코드 없음 |
| video-use | 에이전트 스킬, 대화형 편집 | 자연어 지시, 완전 자동화, 오픈소스, 로컬 실행 가능 |
browser-use가 LLM에게 브라우저 DOM(구조화 텍스트)을 주는 것처럼, video-use는 LLM에게 단어별 타임스탬프 텍스트를 준다. 비싼 비전 모델 없이 텍스트 모델만으로 정밀한 컷 편집이 가능하다. 시각 확인이 필요한 순간에만 PNG를 한 장 요청하는 "온디맨드 비주얼" 전략이 독창적이다.
모든 전사(transcription)는 ElevenLabs Scribe API를 통해 이루어진다. 무료 tier가 있지만 분량이 많으면 비용이 발생한다. 전사는 소스 파일당 1회만 수행되고 결과를 캐싱하므로, 같은 소스를 반복 편집해도 추가 비용은 없다.
실제 pyproject.toml과 소스코드 기반으로 확인한 의존성.
| 패키지 | 역할 | 사용 위치 |
|---|---|---|
| requests | ElevenLabs Scribe API HTTP 호출 | helpers/transcribe.py |
| numpy | 오디오 PCM 데이터 처리, RMS 엔벨로프 계산 | helpers/timeline_view.py, grade.py |
| Pillow (PIL) | 필름스트립 이미지 합성, 파형 시각화 PNG 생성 | helpers/timeline_view.py |
| matplotlib | 오디오 파형 플롯 렌더링 | helpers/timeline_view.py |
| librosa (선택) | 고급 오디오 분석 (없으면 wave 모듈로 폴백) | helpers/timeline_view.py |
| manim (선택) | 수학/코드 애니메이션 오버레이 생성 | skills/manim-video/ |
| 도구 | 역할 | 필수 여부 |
|---|---|---|
| ffmpeg / ffprobe | 영상 인코딩·디코딩·컬러 그레이딩·자막 합성·오디오 추출 전반 | 필수 |
| ElevenLabs Scribe API | 단어별 타임스탬프 + 화자 분리 전사 | 필수 (API 키) |
| yt-dlp | YouTube 등 온라인 소스 다운로드 | 선택 |
| Node.js 22+ / npm | HyperFrames, Remotion 애니메이션 슬롯 | 선택 (애니메이션 시) |
| uv (또는 pip) | Python 의존성 관리 | 설치 시 필요 |
| 엔진 | 특징 | 사용 케이스 |
|---|---|---|
| HyperFrames | JavaScript 기반, npx로 즉시 사용 | Motion graphics, 타이틀 카드 |
| Remotion | React 기반 영상 생성 프레임워크 | 복잡한 인포그래픽, 데이터 시각화 |
| Manim | 수학 시각화 특화 Python 라이브러리 | 교육 영상, 수식 애니메이션 |
| PIL (Pillow) | 정적 이미지 합성 | 간단한 자막 오버레이, 배경 이미지 |
ffmpeg는 이 프로젝트의 "손"이다. 두뇌(LLM)가 "3초~7초 구간을 잘라서 따뜻한 색감으로 바꿔줘"라고 결정하면, ffmpeg가 실제로 영상 파일을 자르고 필터를 적용하고 붙인다. Python 코드는 LLM의 결정을 ffmpeg 명령어로 번역하는 통역사 역할을 한다.
ElevenLabs Scribe는 "귀"다. 영상에서 오디오를 추출해 단어마다 "이 단어는 2.52초~3.18초에 화자 0이 말했다"는 정밀 정보를 준다.
실제 코드에서 확인한 시스템 구조도와 설계 패턴.
LLM이 영상 프레임을 직접 소비하지 않는다. ElevenLabs Scribe가 단어 단위 타임스탬프를 만들고, pack_transcripts.py가 0.5초 이상 침묵이나 화자 변경에서 구를 분리해 takes_packed.md로 압축한다. 1시간 분량도 12KB 텍스트 안에 들어간다. 시각 확인이 필요한 경우(애매한 포즈, 테이크 비교)에만 timeline_view.py로 PNG를 생성한다.
이는 browser-use의 "DOM 우선" 원칙과 동일하다. 스크린샷 1장 대신 구조화된 DOM을 주면 LLM이 훨씬 정확하고 저렴하게 작동한다.
render.py는 세그먼트를 먼저 개별 추출해 컬러 그레이딩과 오디오 페이드를 각각 적용한 뒤(clips_graded/seg_00.mp4, ...), ffmpeg concat demuxer로 무손실 이어붙인다(-c copy). 이후 오버레이와 자막을 합성한다.
이 2단계 방식이 중요한 이유: 단일 패스로 처리하면 나중에 오버레이를 추가할 때 전체를 다시 인코딩해야 한다. 분리하면 오버레이 추가 시 concat된 base.mp4만 재처리한다 — 더 빠르고 화질 손실이 없다.
애니메이션 오버레이(HyperFrames, Remotion, Manim)가 여러 개 필요하면, 에이전트가 슬롯별로 서브에이전트를 병렬 생성한다. 각 서브에이전트는 독립된 animations/slot_<id>/ 디렉터리에서 작업하고, 전체 렌더링 시간 ≈ 가장 느린 슬롯 1개 시간이다. 순차 처리 대비 수 배 빠르다.
실제 파일 트리와 각 파일의 역할.
실제 편집 세션의 출력물은 레포 내부가 아니라 영상 파일 옆 edit/ 폴더에 생성된다:
이 레포에서 무엇을 배울 수 있는가.
이 레포는 ffmpeg의 다양한 기능을 실제 프로덕션 코드에서 활용한다. 단순 포맷 변환을 넘어 필터 그래프(filtergraph), 자막 렌더링(libass), HDR→SDR 톤매핑(zscale+tonemap), 오디오 페이드(afade), 무손실 concat demuxer까지 다룬다.
배울 것: -vf 필터 체인 조합, -af 오디오 필터, HDR 소스 처리 (iphone 영상의 HLG/PQ 문제), concat demuxer 패턴, ffprobe로 메타데이터 파싱.
SKILL.md는 LLM에게 "이 도구를 어떻게 사용해야 하는가"를 가르치는 문서다. 12개의 하드 룰과 그 이유를 함께 설명하고, 나머지는 "artistic freedom"으로 열어둔다. 이 설계는 LLM이 규칙을 외우는 것이 아니라 원칙을 이해하도록 유도한다.
배울 것: 에이전트 스킬 문서 작성법, "Ask → Confirm → Execute → Self-Eval → Persist" 패턴, 무엇을 하드 룰로, 무엇을 자유 재량으로 줄지 결정하는 설계 감각.
timeline_view.py의 compute_envelope()는 ffmpeg로 mono 16kHz PCM WAV를 추출한 뒤, numpy로 윈도우 RMS 엔벨로프를 계산한다. librosa 없이 표준 라이브러리 wave와 numpy만으로 오디오 분석을 구현했다.
배울 것: PCM 오디오 데이터 구조, RMS(Root Mean Square) 에너지 계산, 오디오 샘플링 레이트, numpy 배열 연산으로 신호처리.
grade.py의 auto 모드는 ffmpeg로 영상 세그먼트에서 프레임들을 샘플링하고, 평균 밝기·RMS 대비·채도를 계산해 최적의 eq=contrast:brightness:saturation 필터 값을 수치로 도출한다. 최대 ±8% 범위로 제한해 "보정된 것처럼 안 보이게" 만든다.
배울 것: ffmpeg vf 컬러 필터 체인, 이미지에서 HSV(색조·채도·명도) 분석, 알고리즘적 색보정 원리, curves 필터로 S-커브 적용.
transcribe.py는 Scribe v1 모델에 timestamps_granularity=word, diarize=true, tag_audio_events=true를 설정해 단어마다 시작·끝 타임스탬프와 화자 ID를 반환받는다. 전사 결과는 소스별로 캐싱해 재실행 시 API를 다시 호출하지 않는다.
배울 것: Speech-to-Text API 설계, 화자 분리(diarization), 단어 레벨 타임스탬프 활용, API 응답 캐싱 패턴.
실제로 돌리려면 무엇이 필요한가.
| 항목 | 최소 | 권장 | 비고 |
|---|---|---|---|
| OS | macOS / Linux | macOS (Apple Silicon) | Windows는 공식 미지원 (WSL 가능) |
| Python | 3.10+ | 3.12 | pyproject.toml 기준 |
| RAM | 8 GB | 16 GB+ | 4K 소스나 긴 영상 처리 시 |
| 디스크 | 소스 크기 × 3 | × 5 | clips_graded/, preview/final 임시 파일 |
| ffmpeg | 4.4+ | 6.x+ | brew install ffmpeg (macOS) |
| 에이전트 | Claude Code CLI | Claude Code + Pro 플랜 | Codex, Hermes 등도 호환 |
| API 키 | ElevenLabs 계정 | — | 전사 필수. 무료 tier 있음 |
최신 iPhone은 HLG HDR(Rec.2020) 포맷으로 촬영한다. render.py는 is_hdr_source()로 이를 자동 감지하고 zscale+tonemap 체인으로 SDR Rec.709로 변환한다. 이 처리 없이 단순 비트 변환만 하면 업로드 후 색이 이상하게 보이는 문제가 생긴다.
install.md에 나온 "Setup prompt"를 Claude Code에 붙여넣으면, 에이전트가 클론·의존성 설치·ffmpeg 설치·API 키 등록까지 스스로 진행한다. 사람이 직접 해야 하는 것은 ElevenLabs API 키를 붙여넣는 것뿐이다.
손으로 해봐야 진짜 이해가 온다.
video-use의 핵심 hard rule 중 하나인 "30ms 오디오 페이드"를 직접 구현해본다. 아무 영상 파일에서 특정 구간을 추출하면서 오디오 페이드를 적용한다.
# 5초~12초 구간 추출 + 30ms 오디오 페이드
ffmpeg -ss 5 -i input.mp4 -t 7 \
-af "afade=t=in:st=0:d=0.03,afade=t=out:st=6.97:d=0.03" \
-c:v copy output.mp4
페이드 없는 버전과 비교해 컷 경계에서 소리 차이를 들어보자. 페이드가 없으면 "뚝" 소리가 난다.
ElevenLabs Scribe API 없이도 pack_transcripts.py의 구조를 이해할 수 있다. 가상의 Scribe JSON을 직접 만들어 파이프라인을 테스트해보자.
# 가상 Scribe 응답 JSON 만들기 (edit/transcripts/test.json)
{
"words": [
{"type": "word", "text": "Hello", "start": 0.5, "end": 0.9, "speaker_id": "speaker_0"},
{"type": "word", "text": "world", "start": 1.0, "end": 1.4, "speaker_id": "speaker_0"},
{"type": "spacing", "start": 1.4, "end": 2.2},
{"type": "word", "text": "Goodbye", "start": 2.2, "end": 2.8, "speaker_id": "speaker_1"}
]
}
# 실행
python helpers/pack_transcripts.py --edit-dir edit/
출력된 takes_packed.md를 보면서 0.5초 침묵과 화자 변경에서 구가 분리되는 것을 확인한다.
같은 영상 클립에 4가지 컬러 프리셋을 각각 적용해 결과를 비교해본다. 코드에서 확인한 프리셋: subtle, neutral_punch, warm_cinematic, none.
# neutral_punch 프리셋으로 그레이딩
python helpers/grade.py input.mp4 -o output_neutral.mp4 --preset neutral_punch
# warm_cinematic (창작 용도)
python helpers/grade.py input.mp4 -o output_warm.mp4 --preset warm_cinematic
# auto 모드 (수치 기반 자동 보정)
python helpers/grade.py input.mp4 -o output_auto.mp4
# 분석 결과 확인 (적용할 필터 수치 출력)
python helpers/grade.py --analyze input.mp4
Edit Decision List(EDL)를 직접 JSON으로 작성하고 render.py를 실행해 실제 영상 편집을 체험한다. 먼저 영상 파일의 길이를 ffprobe로 확인한 뒤 컷할 구간을 결정한다.
# ffprobe로 영상 메타데이터 확인
ffprobe -v quiet -print_format json -show_streams input.mp4
# edl.json 작성
{
"source": "/path/to/input.mp4",
"grade": "neutral_punch",
"ranges": [
{"start": 2.5, "end": 8.0},
{"start": 15.3, "end": 22.7}
]
}
# 렌더링 실행
python helpers/render.py edl.json -o final.mp4 --no-subtitles
video-use를 실제로 설치하고 짧은 영상(1~2분)으로 전체 워크플로를 체험한다. ElevenLabs 무료 계정으로 시작할 수 있다.
# 1. 설치 (Claude Code에 setup prompt 붙여넣기)
# 2. 영상 폴더로 이동 후 claude 실행
cd ~/Desktop/my_videos
claude
# 3. 에이전트에게 지시
> "이 영상들을 분석하고 불필요한 침묵과 umm/uh를 제거해줘. 60초 이하로 편집해줘."
에이전트가 전략을 제안하고 승인을 기다린다. 승인하면 전사 → 편집 → 렌더링 → 자기검증까지 자동 진행된다.
이 레포를 발판으로 더 깊이 파고드는 경로.
| 주차 | 주제 | 핵심 학습 내용 |
|---|---|---|
| 1~2주차 | ffmpeg 기초 | 포맷 변환, 코덱 이해(H.264/H.265), 필터 체인(-vf/-af), ffprobe로 메타데이터 파싱 |
| 3~4주차 | Python 오디오 처리 | wave 모듈, numpy로 PCM 처리, RMS 에너지, 샘플링 레이트, librosa 기초 |
| 5~6주차 | ffmpeg 고급 | 필터 그래프(filter_complex), PTS/DTS 이해, concat demuxer, HDR 처리, libass 자막 |
| 7~8주차 | Speech API 활용 | ElevenLabs Scribe, OpenAI Whisper, 단어별 타임스탬프, 화자 분리(diarization) |
| 9~10주차 | LLM 에이전트 설계 | SKILL.md 패턴, Tool use 설계, 에이전트 메모리(project.md), 자기검증 루프 구현 |
| 11~12주차 | 애니메이션 엔진 | Manim 기초, Remotion(React 기반 영상 생성), HyperFrames, ffmpeg overlay 합성 |
ffmpeg CLI를 먼저 손에 익히는 것이 가장 중요하다. Python 코드는 결국 ffmpeg 명령어를 조립하고 실행하는 래퍼다. ffmpeg 없이 코드를 보면 "왜 이렇게 하는지" 이해하기 어렵다. ffmpeg -filters와 ffmpeg -codecs로 사용 가능한 도구 목록을 파악하는 것부터 시작하자.
이 레포를 이해하는 데 필요한 용어 정리.
더 깊이 파고들기 위한 자료들.