ffmpeg을 이용한 영상 편집
당신은 마우스와 타임라인 대신 대본(transcript)과 필터그래프(filtergraph)로 작업하는 편집자입니다. 파이프라인은 결정론적입니다: 모든 것이 텍스트로 편집되고 하나의 명령어로 재구성됩니다.
푸티지 → 단어 단위 타임스탬프가 있는 대본 → EDL(편집 목록) → ffmpeg → 완성된 영상
↑ ↑
faster-whisper 직접 편집 — 이것이 편집입니다
핵심 원칙: 영상은 픽셀 단위로 분석되지 않습니다 — 편집은 시간이 표시된 텍스트에 의해 주도됩니다. 음성이 구조를 정의하고, 화면은 이를 따릅니다.
하나의 릴(reel) 또는 여러 개?
이것을 먼저 결정하십시오 — 이후 모든 과정이 달라집니다.
- 한두 개의 릴 → 아래 절차를 순서대로 대화식으로 따릅니다.
- 세 개 이상 → 배치 파이프라인으로 전환합니다: references/batch-pipeline.md. 각 단계는 전체 프로젝트에 대해 한 번 실행되고 입력 해시로 캐시됩니다. 열 개의 릴을 대화식으로 처리하는 것은 대략 열 배의 컨텍스트를 소비하며 얻는 이점이 없습니다.
작업 순서
항상 단계를 따르고, 절대 건너뛰지 마십시오. 각 단계는 다음 단계의 입력을 생성합니다.
- 환경을 확인합니다. ffmpeg / faster-whisper / Chrome이 없는 경우 → references/setup.md. 깨끗한 기기에서 10분이 소요됩니다.
- 소스를 가져옵니다. 사용자가 파일 대신 URL을 제공한 경우, 먼저
download.py로 가져옵니다. - 소스를 검사합니다 — ffprobe, 장면 감지, 연속 스틸 이미지(contact sheet). Read를 통해 직접 프레임을 눈으로 확인하십시오. 텍스트만으로는 절대 맹목적으로 편집하지 마십시오.
- 전사(transcribe) 합니다(단어 단위 타임스탬프 포함) 그리고 결과를 교정합니다. 음성 인식은 깨끗한 오디오에서도 단어를 잘못 인식합니다. 로컬 모델이 없습니까?
transcribe_cloud.py가 Groq/OpenAI에서 동일한 출력을 얻습니다. - 사용자가 지정하지 않은 경우 사용자와 콘셉트에 동의합니다: 형식, 그래픽에 포함될 내용, 대상 플랫폼. 하나의 질문, 설문조사가 아닙니다.
- EDL을 구축합니다 — 일시정지는 자르되, 아이디어는 자르지 마십시오.
base를 구축한 다음, 컷을 프레임 단위로 확인합니다.- 자막과 오버레이를 생성하고,
final을 구축합니다. - 수용 체크리스트(acceptance checklist) 를 실행하고 SendUserFile로 파일을 전달합니다.
각 단계의 전체 명령어 — references/pipeline.md.
이 파이프라인이 할 수 있는 것과 할 수 없는 것
가능: 의미적 컷팅, 일시정지 제거, 컷에서의 확대(punch-in), 컬러 그레이딩(.cube LUT 포함), 단어 수준 자막, HTML/CSS를 통한 복잡한 인포그래픽, 안정화, 소셜 플랫폼을 위한 음량 정규화, 배치 처리. Remotion 플러그인이 설치된 경우, React에서 렌더링된 애니메이션 그래픽도 가능 — references/remotion.md 참조.
절대 불가능 — 사용자가 요청하면 미리 알리십시오: 객체 추적(움직이는 손에 캡션 고정) 및 마스크 그레이딩. 이러한 작업은 여전히 Premiere / DaVinci / After Effects가 필요합니다.
단독으로는 불가능하지만 FableCut이 설치된 경우 가능: 프레임 정확한 크리에이티브 컷팅, 키프레임 모션, 전환, 속도 램프, 크로마 키, 음악 비트에 맞춘 컷팅. FableCut은 에이전트가 MCP를 통해 구동하는 브라우저 타임라인입니다 — references/fablecut.md 참조. 자체 음성 인식 기능이 없고 내보내기에는 사람의 클릭이 필요하므로, 음성 기반 구조와 무인 배치는 이 파이프라인에 남아 있습니다.
준비된 도구
assets/tools/에는 12개의 작동 스크립트가 있습니다 — 프로젝트에 복사하여 사용하고, 처음부터 다시 작성하지 마십시오:
| 스크립트 | 기능 |
|---|---|
download.py | URL에서 소스 푸티지 가져오기 (yt-dlp) — 로컬 파일이 이미 있으면 건너뜁니다 |
transcribe.py | faster-whisper → 단어 단위 타임스탬프가 있는 transcript.json + .srt |
transcribe_cloud.py | 동일한 출력, Groq/OpenAI Whisper API를 통해 — 모델 다운로드 불필요, API 키 필요 |
pauses.py | 음성의 일시정지 나열 — EDL의 기초 |
dump_words.py | 인덱스와 신뢰도가 포함된 모든 단어 — 교정용 |
make_ass.py | 컷 후 타임라인에 맞게 재조정된 단어 수준 ASS 자막 |
render_overlays.py | HTML/CSS → 헤드리스 Chrome → 알파 채널이 있는 1080×1920 PNG |
build.py | 조립: base (컷 + 그레이딩), final (오버레이 + 자막 + 오디오) |
build_vo.py | 동일하지만 별도의 음성 해설 트랙용 — 여러 소스의 비디오를 오디오에 맞춤 |
batch_vo.py | 모든 음성 해설을 한 번의 모델 로드로 전사 |
mute_subs.py | 전체 화면 카드가 표시될 때 자막 제거 |
pipeline.py | 배치 드라이버 — 모든 릴에 대해 모든 단계, 캐싱 포함 |
assets/templates/에는 시작용 edl.json, overlays.json 및 corrections.json이 있습니다.
프로젝트를 다음과 같이 구성하십시오:
<푸티지가 있는 폴더>/
├── IMG_XXXX.MOV
└── edit/
├── tools/ ← 복사된 스크립트
├── work/ ← 중간 파일, 절대 배포되지 않음
├── overlays/ ← 렌더링된 PNG
├── out/ ← 완성된 영상
├── edl.json overlays.json corrections.json subs.ass
참조 파일
한 번에 모두 로드하지 말고 필요할 때만 로드하십시오:
- references/setup.md — 깨끗한 기기(Windows/macOS)에 설치, ffmpeg 빌드 확인
- references/pipeline.md — 작업 흐름 단계별 설명, 컷팅 규칙, 명령어
- references/storyboard.md — 비디오 형식, 패널 유형, 토킹 헤드 스토리보드 방법
- references/design-system.md — 팔레트, 글꼴 크기 체계, 안전 영역, 오버레이 기법
- references/batch-pipeline.md — 여러 릴을 단계로 실행하는 방법과 컨텍스트가 실제로 소비되는 위치
- references/remotion.md — 애니메이션 그래픽 단계: React 렌더링 오버레이가 그 비용을 정당화하는 경우
- references/fablecut.md — 타임라인 단계: 편집을 FableCut에 넘겨야 하는 경우와 두 파이프라인이 만나는 방식
- references/ffmpeg-cookbook.md — 그레이딩, 효과, 전환, 오디오, 인코딩
- references/troubleshooting.md — 첫 번째 ffmpeg 실행 전에 읽으십시오; 각각 한 시간을 소비한 17가지 실패 사례
영상을 성공 또는 실패로 이끄는 규칙
문서가 아닌 실제 제작에서 배운 내용입니다.
- 프레임을 직접 보십시오. 대본만으로는 그 순간 화자가 일어서거나 머리를 만지는지 알 수 없습니다. 바로 그 지점에서 컷이 망가집니다.
- 카드는 얼굴 위가 아닌 위쪽에 배치하십시오. 첫 번째 시도는 항상 패널을 프레임 중앙에 떨어뜨려 눈을 가립니다. 화자의 시선은 영상이 얻는 신뢰의 절반입니다.
- 스톱워치가 아닌 구절의 끝에서 자르십시오. "매 N초"마다 자르는 것은 아이디어를 반으로 자릅니다.
- 모든 일시정지의 0.2~0.3초는 남겨두십시오. 일시정지를 0으로 줄이면 말더듬처럼 들립니다.
- 극적인 일시정지는 절대 건드리지 마십시오 — 질문 후, 결론 전. 그곳에서 침묵이 역할을 합니다.
- 세그먼트 간에
zoom을 번갈아 사용하십시오. 그러면 컷이 실수가 아닌 앵글 변화로 읽힙니다. - 그래픽이 전혀 없는 한 부분을 남겨두십시오. 시청자는 숨 쉴 공간이 필요합니다. 카드의 벽은 지치게 합니다.
- 자막을 교정하십시오. 인식 오류가 화면에 각인되면 영구적입니다.
- 믿음이 아닌 눈으로 확인하십시오. 스틸 프레임을 추출하고,
hstack으로 쌓은 다음, Read를 통해 결과를 엽니다. - pipeline.md의 수용 체크리스트 없이 절대 배송하지 마십시오.
- 도구가 구성 파일에 다시 쓰지 못하게 하십시오. 스크립트가 EDL에 자체 출력을 추가하면 파일 크기가 두 배가 되고, 이후의 모든 편집이 전체를 컨텍스트에 에코합니다. 생성된 데이터는
work/에 속합니다. - 대본의 첫 줄과 마지막 줄을 직접 읽으십시오. Whisper는 침묵 구간에서 가짜 텍스트를 환각합니다 — 전형적으로 러시아어 오디오에 가짜 자막 제작자 크레딧 줄 — 그리고 완벽하게 정상적인 신뢰도 점수를 가질 수 있습니다. 두 전사 스크립트는 자명한 경우를 자동으로 필터링하지만, 필터가 완벽하지는 않습니다. troubleshooting.md #17을 참조하십시오.
오케스트레이션
작업은 다단계입니다 — TaskCreate로 단계(대본, EDL, 그레이딩, 그래픽, 조립)에 대한 작업을 생성하고 상태를 최신으로 유지하십시오. 긴 작업(모델 다운로드, base 렌더링)은 백그라운드에서 실행하고, 이에 의존하지 않는 작업에 시간을 사용하십시오: 모델이 다운로드되는 동안 오버레이를 디자인하고 스틸 프레임에서 그레이딩을 테스트하십시오.
완성된 영상을 SendUserFile로 전달하고 변경 사항에 대한 짧은 메모를 함께 보내십시오.