/fabrica-videos-reels — 대본에서 MP4까지
Fábrica de Vídeos Agêntica 스킬입니다(fabrica-videos 스킬 참고). '대본 우선' 방식입니다: 클라이언트가 녹화 전에 대본과 스토리보드를 승인합니다. 만약 이미 대본 없이 녹화했다면 fabrica-videos-rapido 스킬을 사용하세요.
포르투갈어로, 간단한 언어로 말하세요(비디오를 요청하는 사람은 거의 프로그래머가 아닙니다). 진행 상황을 코드가 아닌 렌더링된 미리보기로 보여주세요.
Remotion 코드를 작성하기 전에 CLAUDE.md(디자인 시스템 규칙, 각 파일 위치, 명령어)를 읽고, 공식 Remotion 스킬이 설치되어 있다면 remotion-best-practices도 읽으세요.
완전하고 승인된 예시는 Exemplo 비디오입니다: roteiros/exemplo*.{md,json} + src/videos/Exemplo.tsx. 그 구조를 복사하세요.
모든 명령어는 프로젝트 루트의 터미널에서 실행됩니다. 아래 표에서 TRABALHO = trabalho 폴더(git 외부)입니다.
0. 비디오가 어떤 단계에 있는지 확인하세요
짧은 slug를 선택하고(예: minha-ideia) 이미 존재하는 것을 확인하세요:
| 존재하는 것… | 다음 단계로 가세요 |
|---|---|
| 아무것도 없음 | 1. 대본 |
승인된 roteiros/<slug>.md, -animacoes.md 없음 | 2. 스토리보드 |
스토리보드, src/videos/<Nome>.tsx 없음 | 3. 제작 |
| 완성된 컴포지션 + 새 녹화(사용자가 저장 위치 알려줌) | 4. 녹화 |
TRABALHO\out\<slug>-final.mp4 | 5. 전달 |
한 줄로 현재 단계를 알려주고 진행하세요. 1단계와 2단계는 대화입니다: 제안하고, 듣고, 다듬고; 승인을 받아야만 넘어갑니다.
1. 대본 → roteiros/<slug>.md
- 여기서 클라이언트와 대화하며 대본을 작성합니다. 질문: 주제(또는 참조 링크/비디오), 기둥(브랜드 주제 중 하나), 목표 길이(30–60초 ≈ 2.5단어/초).
roteiros/exemplo.md와 동일한 구조: 예상 시작 시간, 대사, 카드가 있는 블록; 일반 대중을 위한 비유 사전; 녹화용 연속 텍스트; 필요한 스크린샷; 링크와 함께 확인된 사실.- 음성(사람에 맞게 조정; 그 규칙은 브랜드에 있음): 1인칭, 짧은 문장, 구체적인 숫자; 처음 3초 안에 후크; 절대 "혁명적"/"미래가 왔다" 사용 금지; 질문 + CTA로 마무리. 경보는 주장이 아닌 질문이 됩니다. 뉴스를 만들어내지 마세요.
2. 스토리보드 → roteiros/<slug>-animacoes.md + roteiros/<slug>.ancoras.json
- 비트별(2–3초마다 시각적 전환): 시간, 문구, 상단에 나타나는 것(1080×960 영역).
- 새 부품을 만들기 전에
src/pecas/의 부품을 재사용하세요:RedeNeural+Bisturi(AI의 "두뇌"),GradeConexoes,LoopPensando,Lupa,ContadorBarra,TrocaPrints,TextoRiscado(모드riscar/somar),OlhoRiscado,LinhaVersoes; 헬퍼TituloCena,Halo,RotuloMono,aparece(util.tsx). ancoras.json:{ "cena": "그 장면에서 처음으로 말하는 단어" }말하는 순서대로. 앵커에 고유명사를 피하세요(Whisper가 잘못 인식합니다: "Qwen"→"quen", "Claude"→"clou", "OpenAPI"→"OpenAI", 또한 "Vercel", "MCP", "JSON"). 한 장면 내부의 비트(예: 텍스트를 지우는 순간)도 앵커가 됩니다.
3. 제작 → src/videos/<Nome>.tsx
Exemplo.tsx의 뼈대를 복사하세요: zod 스키마(pilar, video, enquadramento, mostrarGuia, nome, cargo, prints, encerramento,tempos), 외부TelaDividida, 장면당 하나의<Sequence>+<Cena>(6프레임 페이드), 끝에 2초Encerramento.src/videos/index.tsx에<Folder name="Videos">안에calculateMetadata(길이 =duracaoFala+ 2초)와 함께 등록하세요.- 각 장면은 자체 컴포넌트이며
useCurrentFrame()을 호출합니다(부모 컴포넌트의 객체/배열 함수 내에서 hook을 호출하지 마세요: 프레임이 잘못 나옵니다).src\relogio.tsx에서useCurrentFrame,useVideoConfig,Sequence를 가져오세요.remotion에서 가져오지 마세요: 프레임은 초당 30으로 기록되고 시계는 비디오가 60으로 출력될 때 나머지를 처리합니다. - 새 부품은
src/pecas/로 이동합니다(일반적이며 props 포함),src/animacoes/tema.ts의 토큰을 따릅니다. - 스크린샷 및 부품 이미지(작은 파일): 이 폴더의
public\<slug>\에 저장하고npm run preparar를 실행하세요. - 녹화 전 테스트용 임시 음성:
roteiros\<slug>.fala.txt(UTF-8)에 연속 텍스트를 저장하고 다음을 실행하세요:
→npm run fala -- <slug> roteiros\<slug>.fala.txtTRABALHO\public\previa\fala-<slug>.mp4(시스템 음성, 1080×960). 그런 다음npm run legendar+npm run batidas(섹션 4)를 실행하여src/videos/<slug>.tempos.json을 생성하고,videoprop ="previa/fala-<slug>.mp4"로 설정하세요. - 확인:
npx tsc및 가이드가 켜진 연락처 시트:
→npm run folha -- <Id> src\videos\<slug>.tempos.jsonTRABALHO\out\folha-<Id>.jpg(각 장면 끝의 1프레임). 이미지를 확인하세요: 빨간색 없음(상단 270, 하단 320, 측면 96, 오른쪽 버튼), 겹치는 것 없음, 텍스트가 잘 맞음. - 미리보기 렌더링:
(가벼움, 540×960; 미리보기라고 말하세요) 그리고 그에게 보내세요.npm run renderizar -- <Id> "trabalho\out\previa-<slug>.mp4" previa
4. 실제 녹화 → 동기화 및 프레이밍
- 새 녹화를 찾으세요(어디에 저장했는지 물어보세요). 원본을
TRABALHO\originais\로 복사하세요(절대 이동하거나 변경하지 마세요) 그리고 변환하세요:
→npm run converter -- "trabalho\originais\<arquivo>" <slug>TRABALHO\public\gravacao-<slug>.mp4(세로, H.264, 일반 색상, 녹화의 해상도 및 프레임 속도 유지: 4K 60은 4K 60으로 유지되고 최종 비디오도 그렇게 출력됩니다. HDR은 예외: SDR로 변환되며 변환기가 알립니다. 명령 끝에ate=12를 붙이면 처음 12초만 변환하여 빠른 테스트를 수행합니다). 변환기는ffprobe로 파일을 확인하고, **4K HDR(최신 iPhone)**인 경우zscale+tonemap으로 HDR을 처리합니다(이것 없이 색상이 바래집니다). 각 세션의 첫 번째 HDR 녹화에서는 변환된 파일에서 한 프레임을 추출하여 그에게 보여주고 휴대폰과 비교하게 하세요. npm run legendar -- "trabalho\public\gravacao-<slug>.mp4"(백그라운드, 약 1-2분) →legendas/gravacao-<slug>.json. 녹화에 긴 일시 중지, 오류 또는 반복 테이크가 있는 경우 진행하기 전에 정리하세요(fabrica-videos-corte스킬): 그 이후의 비디오는gravacao-<slug>-limpa.mp4이고, 자막은 정리된 비디오의 자막입니다.npm run batidas -- legendas\gravacao-<slug>.json roteiros\<slug>.ancoras.json src\videos\<slug>.tempos.json "<vídeo>". 앵커가 누락된 경우 자막을 읽고 문구를 조정하세요. 그가 대사의 의미를 변경한 경우 애니메이션을 조정하세요(예: "한 사람에 의해서만" →TextoRiscado modo="somar"지우기 대신) 그리고 그에게 알리세요.duracaoFala≤ 비디오 길이(그렇지 않으면 아래에 이미지가 없는 순간이 남습니다): 위 명령 끝에 비디오가 있으면batidas가 자동으로 제한합니다; 없으면 수동으로 수정하세요.- 프레이밍(얼굴이 자막 영역(y 985–1125)과 하단 영역(y 1600) 사이에 있어야 함): 약 12개 지점에서 자르기를 테스트하세요:
각 이미지를 확인하세요.ffmpeg -ss <t> -i <video> -frames:v 1 -vf "crop=1080:960:0:<offset>" "trabalho\out\enq-<t>.png"enquadramento="50% <offset/960*100>%"(1080×1920 소스의 경우). 비디오 전체에 머리 전체가 프레임 안에 있어야 합니다. 턱이 하단 영역에 닿을 수 있습니다; 입은 절대 닿지 않습니다. 그가 카메라에 가까이 올 때도 테스트하고 머리 꼭대기가 나가지 않는 가장 큰 오프셋을 사용하세요. - 이름 태그 확인: 얼굴을 가리면 상단 절반에 배치됩니다(
TelaDividida의 기본값임). - 최종 렌더링을 백그라운드에서 실행하세요:
npm run renderizar -- <Id> "trabalho\out\<slug>-final.mp4"ffprobe로 길이/해상도를 확인하고 비디오를 보내세요.- 들어가는 품질이 나오는 품질입니다.
renderizar는 녹화의 해상도와 프레임 속도를 읽고 그대로 출력합니다: 4K 60으로 녹화하면 2160×3840 60으로 출력됩니다. 최종 결과에npx remotion render를 직접 사용하지 마세요: 항상 1080×1920 30으로 출력됩니다. - 매개변수로만 축소하며, 그가 스킬 호출에서 요청한 경우에만 축소합니다(예:
/fabrica-videos-reels <slug> 1080p):1080p는 해상도를,30fps는 프레임 속도를 줄입니다(npm run renderizar -- <Id> "<saída>.mp4" 1080p 30fps). 매개변수가 없으면 축소하지 마세요. - HDR은 규칙에 포함되지 않습니다: Remotion은 일반 색상으로만 그립니다. 녹화가 HDR로 온 경우 최종 결과가 SDR로 출력된다고 그에게 알리세요.
- 4K 60으로 렌더링하면 1080p 30보다 그릴 이미지가 8배 많습니다. 시간이 걸릴 것이라고 미리 알리세요.
- 들어가는 품질이 나오는 품질입니다.
5. 전달
fabrica-videos-entrega스킬로 마무리하세요(기술 검토, 표지, 프레임 시트 및NOTAS.md). 아래 사항은 이 흐름에 해당하는 부분입니다.- 그가 나중에 편집 앱에서 자막을 추가할 경우 자막을 어디에 둘지 설명하세요: 구분선 바로 아래(기둥 색상으로) (가이드의 녹색 영역), 최대 2줄. 그가 이미 비디오에 자막을 포함시키길 원한다면
fabrica-videos-legendas스킬을 참조하세요(LegendaQueimada요청, 위치faixa). - 자막이 자주 틀리는 이름을 알리세요.
- 게시물 설명: 그가 요청하면
NOTAS.md에 제안을 작성하세요(후크, 정확한 숫자가 포함된 2-3문장, 질문 + 동일한 CTA, 출처, 최대 3개의 이모지, 4-6개의 해시태그, 연구가 뒷받침하지 않는 과장 금지). entregas\AAAA-MM-DD-<slug>\에 기록:NOTAS.md(컴포지션 ID, 사용된 명령어, 녹화 및 최종 파일 경로, 길이, 프레이밍, 그가 대사에서 변경한 내용),capa.jpg및 연락처 시트. 최종 비디오는TRABALHO\out\에 남습니다.- 승인 후 녹화 파일을
TRABALHO\public\에서 제거하고trabalho\arquivo\AAAA-MM-DD-<slug>\로 이동하세요(Remotion은 렌더링할 때마다public전체를 복사합니다. 폴더가 가득 차면 모든 것이 느려집니다). 새 경로를NOTAS.md에 기록하세요. - 절대 게시, 예약 또는 전송하지 마세요. 게시하는 사람은 클라이언트입니다.
이미 해결된 함정 (반복하지 마세요)
- Halo:
<Halo>사용(div에filter: blur), 투명 요소에box-shadow사용하지 마세요(어두운 "알약"이 됩니다). - 여러 단어 강조:
*10 tarefas*는 단어별이 아닌 구절로 처리해야 합니다(TextoImpacto/Destaque참조). - 점에 중앙 정렬된 레이블(예:
v1)은 96px 여백을 침범하지 않도록 추가 여유가 필요합니다. - PowerShell:
--props='{...}'에 직접 JSON을 넣으면 따옴표가 사라집니다. 파일에 저장하고--props=arquivo.json을 사용하세요. - 프로젝트 내부의 녹화 또는 비디오는 저장소로 이동합니다: 항상
TRABALHO에 두세요. - Studio 포트는 3210입니다.
시리즈 (동일 주제에 대한 여러 릴)
- 에피소드당 하나의 slug(
<serie>-<n>-<tema>)를 사용하고, 클라이언트가 요청하면 에피소드당 하나의 세션을 사용하세요. 병렬 세션은 동일한 폴더를 공유합니다: 각 세션은 자체 slug의 파일만 수정합니다;src/videos/index.tsx를 편집하기 전에 다시 읽고 자체<Composition>만 추가하세요; 공유 부품은 변경하지 마세요. - 모든 세션에 적용되는 사실과 결정(변경된 숫자, CTA, 기둥)은 모든 세션에 즉시 전달되어야 합니다. 그렇지 않으면 각 비디오가 다른 규칙을 가지게 됩니다.
- 시리즈 최종 화면:
Encerramento대신src/pecas/TelaFinalReels.tsx, 대사 종료 후 4초(길이 =duracaoFala+telaFinalSeg). 그가 편집 앱에서 릴로 덮는 두 개의 빈 9:16 공간(400×711): 하나는 다음 챕터용(마지막은 첫 번째로 돌아감), 다른 하나는 시리즈를 시작한 릴용입니다.
사운드 (선택 사항, 그가 요청하거나 이미 승인한 경우에만)
public내 사운드 폴더에 있는 네 개의 짧은 사운드(라이센스가 명확한 자신의 사운드 사용: 저장소에는 사운드가 포함되지 않음):abertura.mp3(후크에서 라이저, 볼륨 ~0.35),tecla.mp3(들어오는 각 항목마다, ~0.3),whoosh.mp3(전환/확대 시, ~0.2),blip.mp3(숫자 또는 최종 응답이 도착할 때, ~0.3).- 각 사운드는
@remotion/media의<Audio>가 있는 짧은<Sequence>이며, 장면과 동일한 시간에 연결됩니다. 경로와 볼륨은 스키마 props에 있습니다(빈 문자열은 비활성화). - 렌더링 후
ffmpeg -i <video> -af volumedetect -vn -f null -로 피크를 측정하세요(0dB 미만이어야 하며 사운드는 음성보다 낮아야 합니다). 당신은 들을 수 없습니다: 청취 확인은 그에게 맡기세요.
녹화 교훈
- 대본 없이 녹화하는 사람은 종종 문장 단위로 말하고, 긴 멈춤을 가지며, 시작하기 전에 워밍업하고, 마음에 들지 않는 문장을 반복하고, 끝에 프레임을 벗어납니다.
fabrica-videos-corte스킬이 이 모든 것을 해결합니다. - 사람이 녹화할 때 대사를 바꾸는 것은 일반적입니다. 앵커를 신뢰하기 전에 전체 자막을 읽고 실제로 말한 내용에 맞게 화면과 게시물 자막을 조정하세요.
- 대사가 대본보다 짧을 때, 생략된 세부 사항과 숫자가 화면에 기록됩니다.
- 사실을 변경할 때(예: 업데이트된 숫자) 모든 곳에서 변경하세요: 대사, 화면, 제목, 게시물 자막 및 표지.