비디오 편집 (라우터)
비디오를 직접 보지 않고 작은 단일 목적 스크립트를 실행하고 그 JSON 출력을 읽어서 비디오를 편집합니다. 결정이 필요한 시점에만 프레임(증명 시트, 풀 해상도 스틸 이미지)을 확인합니다.
어떤 스킬
| 사용자가 원하는 것... | 스킬 |
|---|---|
| 긴 녹화를 클립으로 나누기, 컷 지점 제안, 불필요한 앞부분 제거 | auto-cut |
| 동영상에 훅 / 제목 / "POV:" 텍스트 추가 | hook-overlay |
| 자막, 캡션, 대본, 단어 경계를 존중하는 컷 | captions |
| 음량 수정, 무음 제거, 깔끔한 연결, 크로스페이드 | audio-polish |
| 매끄러운 루프, GIF, 밈 GIF, 스티커 | loops-gifs-stickers |
| 렌더링이 정상인지 확인, 연락처 시트, 승인 단계 | render-qc |
| YouTube에 동영상 게시 | youtube-publish |
기본 파이프라인 (원본 화면 녹화에서 게시된 Short까지)
auto-cut -> hook-overlay -> captions -> audio-polish -> render-qc -> youtube-publish
제안, 플레이트 PNG + 전사, 무음 제거, 검증, 드라이 런,
승인, 오버레이 ASS, 번 loudnorm 증명 시트, 비공개 업로드,
분할, 자르기 (마지막 시각적) (마지막 오디오) 사용자 승인 원장
모든 작업이 모든 단계를 필요로 하지는 않습니다. 음악 클립은 자막을 건너뛰고, GIF는 게시를 건너<0xE1><0x85><0xA0>니다. 목표가 불분명하면 물어보고, 그렇지 않으면 계획을 설명하고 진행합니다.
하드 규칙 (모든 스킬)
- 원본을 절대 건드리지 않습니다. 출력물은 소스 옆에 있는
edit/디렉토리로 이동합니다(스크립트는 기본적으로 이렇게 설정됨). - 계획을 세우고, 자릅니다. 파괴적이거나 느린 단계를 진행하기 전에 컷 지점/훅/설정을 제안하고 사용자의 승인을 받습니다.
- 단어 중간에서 절대 자르지 않습니다. 음성의 경우 단어 간격(
captions/snap-to-words)으로 컷을 맞춥니다. - 모든 오디오 컷에는 약 30ms의 페이드가 있습니다. 0이 아닌 샘플에서 자르면 클릭이 발생합니다.
- 클립은 내용부터 시작됩니다. 검은 프레임, 로딩 화면 또는 이전 화면의 꼬리가 없어야 합니다(
auto-cut/trim-lead,render-qc에서 확인). - 텍스트는 안전 영역 안에 있어야 합니다. 훅 플레이트는 상단 영역, 최대 2줄; 캡션은 하단 플랫폼 UI 위에; 겹치는 부분 없음.
- 순서가 중요합니다. 자르기, 오버레이, 캡션(마지막 시각적 단계), 음량(마지막 오디오 단계), QC.
- 모든 최종 렌더링을 QC합니다
render-qc/verify-render를 사용하고, 사용자에게 증명 시트 또는 실제 MP4를 보여줍니다. 축소된 미리보기로 판단하지 마십시오. - 승인은 사람이 합니다. 사용자가 이 대화에서 명시적으로 말하지 않는 한
--approved또는--allow-public을 전달하지 마십시오. - 비밀 정보는 git과 로그 밖에 보관합니다. OAuth 클라이언트와 토큰은 환경 변수나 gitignore된 파일에 저장하며, 절대 출력하지 않습니다.
- ffmpeg를 수동으로 작성하는 대신 스크립트를 다른 플래그로 다시 실행하는 것을 선호합니다. 모든 스크립트는
--help와--help --json에 응답합니다.
설정 확인
ffmpeg -version && ffprobe -version # 필수 (최신 빌드; drawtext는 필요 없음)
node --version # >= 18
npm install # 한 번, 저장소 루트에서 (sharp 설치)
python3 -m pip install faster-whisper # captions/transcribe.py에만 필요
ffmpeg가 PATH에 없으면 FFMPEG_PATH와 FFPROBE_PATH를 설정하십시오.
스타일 팩
brands/example.json에는 캔버스 크기, 폰트, 색상, 훅 플레이트 지오메트리 및 캡션 스타일이 저장되어 있습니다. 채널/브랜드별로 복사하고 --brand brands/<name>.json을 전달하십시오. 시스템 폰트 또는 오픈 라이선스 폰트(--font-file)를 사용하고, 상업용 폰트는 절대 커밋하지 마십시오.