Communitygithub.com

ffmpeg 자동 편집 · ecommerce-video-skills

storyboard.json(상품 이미지/영상 클립 + 나레이션 대본)을 받아 자동으로 음성, 자막, 전환 효과, 배경음악 자동 조절, 음량 표준화가 적용된 9:16 MP4를 단일 명령어로 생성합니다. 로컬에서 실행됩니다.

ffmpeg 자동 편집 · ecommerce-video-skills란 무엇인가요?

이 스킬은 전자상거래 제품 비디오를 자동으로 제작하는 파이프라인입니다. 사용자가 storyboard.json 형식의 대본과 자산만 제공하면, ffmpeg를 사용하여 음성(TTS), Ken Burns 효과(이미지 패닝/줌), 크로스페이드 전환, ASS 스타일의 자막/텍스트 오버레이, 배경음악(BGM) 자동 덕킹(음성 우선), 그리고 두 번의 loudnorm 처리(-14 LUFS)를 거친 고품질 MP4를 출력합니다. 로컬 환경에서 Python과 ffmpeg만으로 실행되므로, 클라우드 API나 비싼 편집 도구 없이도 대량의 쇼트폼 비디오를 빠르게 제작할 수 있습니다. 주로 Mac/Linux 환경에서 Claude Code, Cursor 등 터미널 기반 AI 어시스턴트와 함께 사용되며, 상품 리스팅, 소셜 미디어 광고, 다크 패턴 게시 등에 활용됩니다. 배경음악은 자체 합성 기능(`auto`)을 제공하여 저작권 걱정을 덜어주며, 다양한 화면 비율(9:16, 1:1, 16:9)과 전환 효과를 지원합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/xiaocong3/ecommerce-video-skills/tree/HEAD/skills/ffmpeg-auto-assemble

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

ffmpeg 자동 편집 · Auto-assemble with ffmpeg

storyboard.json → 음성(edge-tts) → 각 컷 Ken Burns/영상 크롭 → xfade 전환 → ASS 자막/텍스트 → BGM 덕킹 믹싱 → 두 번 loudnorm(-14 LUFS) → out/video.mp4 + .srt.

ecommerce-video-skills의 일부 · 모든 스크립트는 이 디렉토리 scripts/에 있음: assemble.py(메인) · tts_edge.py · make_subs.py · make_bgm.py(저작권 없는 BGM 합성) · make_cards.py(PIL 상품 카드/엔딩 카드)

입력 Inputs

  • storyboard.json (selling-point-storyboard로 생성 가능), 소재 경로는 이 파일 기준 상대 경로
  • 환경: Python 3.9+, pip install pillow numpy edge-tts, ffmpeg(libass 포함), CJK 폰트

빠른 시작 Quick start

pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4       # 저장소 내장 예제, 약 30초 렌더링
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4             # 오프라인 미리보기(음성 없음, 글자 수로 시간 추정)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4      # 메인 이미지 비디오 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3                           # 저작권 있는 음악 사용

storyboard 필드 Fields

필드설명
최상위 voice / rate / pitchedge-tts 음색, 속도(예: +10%), 음높이
최상위 bgm"auto"(내장 합성, 저작권 무료) / 음악 파일 경로 / null
최상위 tag왼쪽 상단 고정 스티커(브랜드/모델명/"데모")
image 또는 video (+start)소재; 비디오는 start초부터 현재 컷 길이만큼 잘라냄
line나레이션 텍스트; 컷 길이 = 나레이션 + 0.15초 앞부분 + pad
sub자막(기본값 line과 동일); ""는 자막 없음; **강조**, `
title / cta텍스트 오버레이 / 행동 유도 버튼
motionzoom_in zoom_out pan_left pan_right pan_up pan_down punch static
fitauto(비율 비슷하면 크롭, 아니면 블러 채움) / cover / blur
transition다음 컷으로의 xfade 이름: fade slideleft slideup smoothleft circleopen wipeleft …
min / duration / pad최소 길이 / 고정 길이 / 문장 뒤 여백(초)

단계 Steps

  1. 모든 소재가 존재하고 비율이 적절한지 확인(상품 이미지 ≥ 1000px); 엔딩 카드가 없으면 make_cards.py로 생성: python scripts/make_cards.py --image main.png --name "상품명" --points "핵심 포인트1|핵심 포인트2|핵심 포인트3" -o assets/end-card.png
  2. 먼저 --tts none으로 한 번 실행하여 화면 흐름을 확인한 후 정식 렌더링.
  3. 렌더링 후 프레임 추출 확인: ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png
  4. platform-spec-export로 각 플랫폼 버전 내보내기; cover-title-ab로 썸네일 제작.

파이프라인 상세 How it works

  • Ken Burns: 프레임별 scale(eval=frame)+crop, zoompan보다 떨림 적음; punch = 0.35초 빠른 줌인(후크 전용).
  • 전환 효과: 각 컷을 전환 길이의 절반만큼 더 렌더링, xfade가 컷 경계 중앙에 위치하므로 나레이션 시작점이 전환에 의해 잘리지 않음.
  • 믹싱: 나레이션은 컷 시작점에 배치; BGM 기본 -20 dB, 음성 구간에서 추가 10 dB 압축(부드러운 덕킹); 먼저 압축/리미팅 후 두 번 loudnorm으로 약 -14 LUFS, TP -1.5 dB.
  • 자막: 실제 나레이션 길이로 build/timing.json 생성 → make_subs.py → libass로 인코딩, 동시에 .srt 내보내기.

체크리스트 Checklist

  • 최종 영상 길이, 해상도, 프레임률 정확(ffprobe out/video.mp4)
  • 3프레임 샘플링: 자막이 상품을 가리거나 하단 UI 영역 침범하지 않음
  • 한 번 듣기: 나레이션 명료, BGM이 방해하지 않음, 시작 부분에 튐 없음
  • BGM 상업적 사용 권한 있음(auto 합성 음악은 안심 가능)
  • 소재(이미지/비디오/폰트) 사용 권한 있음

자주 묻는 문제와 해결 Failure fixes

문제해결
ffmpeg failed스크립트가 출력한 stderr 끝부분 확인; 일반적인 원인은 경로 오류 또는 ffmpeg에 libass/libx264 누락
화면 가장자리 흐림소재 해상도 너무 낮음; ≥1080px 이미지로 교체 또는 motion 강도 줄이기(static으로 변경)
상품이 잘림해당 컷에 "fit": "blur" 설정
전환 구간에서 소리 잘림발생하지 않음(나레이션은 컷 시작점에 정렬); duration을 너무 짧게 설정했다면 늘리기
렌더링 느림프리셋은 이미 veryfast 중간 파일 사용; 최종 인코딩 시 -preset medium을 fast로 변경 가능
1:1 / 16:9 원할 때--size 1080x1080 / --size 1920x1080, 자막 크기는 자동 조정

참고 및 감사: 아이디어는 MoneyPrinterTurbo(MIT)의 "스크립트→음성→자막→합성" 파이프라인에서 영감을 받았으며, 본 구현은 순수 ffmpeg 버전으로 독립적으로 작성되었으며 해당 코드를 복제하지 않았습니다.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

관련 스킬