llvideo은(는) 무엇을 하나요?
당신은 비디오를 볼 수 없습니다. 비디오 네이티브 모델은 볼 수 있습니다. 이 스킬은 그 모델을 CLI 뒤에 배치하고, 산문 대신 구조화된 증거를 반환하도록 만든 다음, 당신이 직접 판단을 내릴 수 있도록 실제 프레임을 제공합니다.
이 차별점이 핵심입니다. 모델의 요약을 중계한다면 당신은 단순한 중개자에 불과합니다. 하지만 입력된 인덱스를 분석하고 직접 확인한 픽셀과 대조한다면, 당신은 분석가가 됩니다.
설정 확인
llvideo providers
ffmpeg가 PATH에 있어야 하며 API 키가 하나 필요합니다. GEMINI_API_KEY가 모든 것을 처리합니다. OPENROUTER_API_KEY는 가격이 약 절반이지만 업로드 엔드포인트가 없어 URL 및 작은 클립 전용이며, OpenRouter는 :free 모델을 포함한 모든 비디오 요청을 수락하기 전에 1.00달러의 구매 크레딧이 필요합니다.
키는 먼저 환경 변수에서 읽습니다. 대체로 ~/.itachi-api-keys 파일에서 KEY=value 형식으로 읽는데, 이는 쉘 프로파일에서 키를 분리해두기 위한 편의 기능일 뿐입니다 — 환경 변수만으로도 충분합니다.
따라야 할 루프
1. 항상 무료로 시작
llvideo probe VIDEO # 길이, 코덱, 해상도, 토큰 예상 — 비용 없음
llvideo plan VIDEO # 비용 및 처리 방식 — 비용 없음
plan은 샘플링 속도, 트랜스코딩 필요 여부, 토큰 수 및 달러 예상치를 알려줍니다. 비용을 지출하기 전에 읽어보세요.
2. 비디오 인덱싱
llvideo index VIDEO
llvideo index VIDEO --json # 파싱용
llvideo index VIDEO --verify 3 # 화면 텍스트가 중요할 때 — 아래 참조
타임스탬프, 화면 텍스트, 동작, 음성, 주요 순간 및 명시적인 uncertainties 목록이 포함된 장면을 반환합니다. 또한 연속 사진(contact sheet) 을 작성합니다.
3. 연속 사진을 보세요. 이 단계는 선택 사항이 아닙니다.
index 출력은 파일 경로로 끝납니다. 사용자에게 답변하기 전에 해당 이미지를 직접 시각으로 읽으세요. 전체 타임라인을 대략 600–1,600 토큰으로 커버하는 하나의 이미지입니다. 근거를 확인하는 것은 저렴하지만, 잘못된 답변은 비용이 많이 듭니다.
당신이 주장하는 모든 것은 다음 중 하나여야 합니다:
- 프레임에서 직접 본 것,
- ffmpeg 측정 결과, 또는
- 대본 인용문.
그 외의 모든 것은 출처를 밝혀야 합니다: "인덱스에 따르면…". 모델의 추측을 자신의 목소리로 둔갑시키지 마세요.
4. 필요한 곳에 더 깊이 파고들기
llvideo clip VIDEO --start 02:10 --end 02:40 --fps 4 -q "로고가 깔끔하게 애니메이션되나요?"
llvideo stills VIDEO --at 02:14,02:19 --width 1920 # 전체 해상도, 직접 확인
llvideo sheet VIDEO --at 01:00,01:05,01:10 --tile 768 --cols 2 # 조밀한 UI 텍스트
클리핑은 프레임 정확하며 몇 백 토큰이 듭니다. 자유롭게 사용하세요.
이해를 위한 최고의 뷰 — timeline
llvideo timeline VIDEO
llvideo timeline VIDEO --transcribe # 단어 수준의 정확한 음성 타이밍
index는 scenes, speech, audio_events를 세 개의 개별 배열로 반환합니다. 각각은 정확하지만 서로 연결되어 있지 않습니다. 따라서 "대시보드의 클로즈업"과 "그가 범위가 잘못되었다고 말한다"는 다른 목록에 있으며, 동시에 발생한다는 사실은 당신이 재구성해야 합니다.
그 동시 발생이 바로 컨텍스트입니다. 샷은 그 위에 무슨 말이 오가는지에 따라 의미가 달라집니다. timeline은 모든 것을 하나의 트랙에 인터리브합니다:
00:10-00:18 (8.0s) *KEY*
shot close-up facing driver
see Camera returns to the driver as a lit gas station glides past the window
does The vehicle drives past the illuminated canopy
says "The gas station appears at nine seconds into the clip."
hear Low interior car ambient hum
why The gas station canopy passes directly behind the driver
질문이 인벤토리가 아닌 의미에 관한 것일 때 index 대신 이걸 사용하세요.
--transcribe는 로컬 단어 수준의 대본을 모델의 음성 대신 사용합니다. 모델의 오디오 타임스탬프는 약 1초 정도 흐르는데, 빠른 컷에서 한 줄을 잘못된 샷에 연결하기에 충분합니다. 음성은 처음 닿는 비트가 아니라 가장 많이 겹치는 비트에 할당되므로, 컷을 가로지르는 대사는 대부분 말해진 쪽에 배치됩니다.
커버리지를 보고하고 아무 말도 하지 않은 실행 시간 구간을 명명합니다. 구멍이 있는 타임라인은 무언가를 놓친 것이며, 이를 인정하는 것이 부분적인 설명을 완전한 것으로 제시하는 것보다 낫습니다.
후속 질문은 무료입니다
인덱스는 콘텐츠 ID와 샘플링 설정에 대해 48시간 동안 캐시됩니다. 측정 결과: 동일한 비디오에 대한 두 번째 timeline은 12.5초 및 $0.02에서 0.4초 및 비용 없음으로 줄었습니다. 필요한 만큼 질문하세요 — 반복을 통해 이해가 구축되며, 첫 번째 패스 이후에는 비용이 들지 않아야 합니다. --no-cache는 강제로 새로 실행합니다.
발견한 문제 수리 — fix
대부분의 감사 결과는 리렌더링이 필요하지 않습니다. 잘못된 음량, 클리핑된 피크, 머리 또는 꼬리의 블랙 프레임 — 이들은 결정론적 ffmpeg 연산이며 비용이 들지 않고 환각이 발생할 수 없습니다.
llvideo audit render.mp4 # 찾기
llvideo fix render.mp4 # 수리 -> render_fixed.mp4
자동으로 수리됨: 통합 음량(−14 LUFS로의 2패스 loudnorm), 트루 피크 클리핑(−1.0 dBFS로 유지), 검은색 또는 흰색 첫/마지막 프레임 — 프레임 수를 가정하지 않고 블랙이 실제로 끝나는 위치를 측정하여 트리밍.
의도적으로 수리되지 않음, 각각 이유와 함께:
| 결과 | 이유 |
|---|---|
| 타임라인 중간 블랙 갭 | 편집 결정이므로 조용히 삭제할 결함이 아님 |
| 프리즈 | 유지된 프레임은 의도적일 수 있음 — 타임라인에서 단축 |
| 낮은 해상도 | 업스케일링은 캡처되지 않은 디테일을 만들어냄 |
| 세이프 마진 | 레이아웃은 구성 선택임; 요소를 이동하고 크롭하지 마세요 |
| 길이 / 종횡비 | 렌더링 시 설정됨; 맞추기 위해 트리밍하면 콘텐츠가 잘림 |
fix는 수리 후 재감사하고 전후 개수를 보고합니다. 수리가 효과가 있었다고 주장하면서 재측정하지 않는 것은 이 도구가 깨뜨리기 위해 존재하는 습관입니다. 의도적으로 망가뜨린 렌더링에서 측정: 5개 주요 + 1개 경미가 1개 주요 + 1개 경미가 되었으며, 남은 두 개는 인간의 결정이 필요한 것이었습니다.
소스를 덮어쓰지 않습니다. --out을 전달하지 않으면 출력은 <이름>_fixed.mp4로 이동합니다.
보충 클립 생성 — gen
다른 곳에서 구축된 타임라인에 슬롯되는 짧은 클립: 설정 샷, B-롤, 텍스처, 로고 스팅. 전체 영화가 아닙니다.
llvideo gen "새벽 안개 낀 소나무 숲 위로 천천히 공중 푸시" --seconds 5
llvideo gen "로고가 프레임에 안착" --image logo.png --seconds 3 # 이미지-비디오
llvideo gen "같은 장면, 더 차가운 그레이딩" --video clip.mp4 --seconds 5 # 비디오-비디오
llvideo gen-image "오래된 나무 타이틀 카드" --out title.png
기존 XAI_API_KEY를 통해 Grok Imagine에서 실행됩니다. 이것은 xAI의 Grok이지 Groq가 아닙니다 — 다른 회사입니다. 1초에서 15초까지 1초 단위로, Veo의 고정 4/6/8초보다 유연합니다.
| 해상도 | 측정된 비용 |
|---|---|
| 480p | $0.05/s |
| 720p | $0.07/s |
| 1080p | ~$0.11/s (외삽, 측정되지 않음) |
이 요금은 문서가 아닌 실제 작업에서 API 자체 사용 필드에서 나왔습니다. $1.00 이상은 --yes가 필요합니다.
모든 클립은 도착 시 감사되며, 이는 장식이 아닙니다. Grok의 자체 기본값은 약 -21 LUFS에서 848x480을 생성하는데, 둘 다 감사자가 플래그를 표시합니다. 따라서 gen은 기본적으로 720p를 사용합니다. 그런 다음 직접 확인하세요:
llvideo sheet clip.mp4
--audio는 grok-imagine-video-1.5로 전환하여 사운드트랙을 생성합니다. 생성된 오디오는 일반적으로 조용하게 나오므로 음량 결과를 예상하고 클립이 다른 자료 옆에 배치된다면 포스트에서 정규화하세요.
직접 만든 비디오 감사 — spec + --from-project
이것이 전체 루프입니다. HyperFrames, brag 및 Remotion은 이미 무엇을 만들려고 했는지 알고 있으므로 누구도 수동으로 의도 사양을 작성할 필요가 없습니다:
llvideo audit render.mp4 --from-project ./my-hyperframes-project
llvideo audit brag-output/brag.mp4 --from-project ./brag-output
llvideo audit out.mp4 --from-project ./my-remotion-project
또는 사양 자체를 추출하여 검사하거나 편집할 수 있습니다:
llvideo spec ./project --out intent.json
의도가 어디서 오는지, 얼마나 신뢰할 수 있는지:
| 소스 | 추출 내용 | 신뢰도 |
|---|---|---|
HyperFrames index.html | data-start / data-duration의 장면 시작/종료, DOM의 화면 텍스트 | 정확 |
HyperFrames STORYBOARD.md | 프레임당 전환 유형 및 길이 (transition_in) | 작성된 의도 |
| brag | composition/ 아래에 구축하는 HyperFrames 프로젝트를 읽음; brag-plan.md 장면 수 및 총계 교차 확인 | 정확 + 교차 확인 |
Remotion .tsx | <Sequence from= durationInFrames=> ÷ fps; <TransitionSeries.Transition presentation=> | 리터럴 및 N * fps에 대해 정확; 계산된 값은 추측되지 않고 건너뜀 |
정적으로 읽을 수 없는 것은 가정하지 않고 메모로 보고됩니다. springTiming 길이나 from={computeIt()}은 플래그가 지정되고 제외됩니다.
이것이 존재하는 이유. HyperFrames check는 헤드리스 Chrome에서 seeked 컴포지션 타임라인을 검증합니다. brag의 딜리버리 게이트는 사전 렌더링 스냅샷에서 멈춥니다. Remotion에는 동등한 게이트가 전혀 없습니다. 그 어떤 것도 내보낸 MP4를 보지 않으므로 인코더 버그, 오래된 렌더링 또는 내보내기 시 드롭된 프레임이 눈치채지 못한 채 출시됩니다. 이것이 이 도구가 메우는 격차이며, 프로젝트 자체 검사가 통과하더라도 audit을 실행할 가치가 있는 이유입니다.
사양이 요청한 페이드 투 블랙은 블랙 프레임 결함으로 보고되지 않습니다. 선언되지 않은 블랙만 결과입니다.
전환, 카메라 및 페이싱 — craft
"이 컷은 어떤가요?", "어떤 전환이 사용되었나요?", "편집을 분석해줘", "카메라가 뭘 하고 있나요?", "왜 이렇게 빠르게 느껴지나요?"와 같은 질문에는 index가 아닌 craft를 사용하세요.
llvideo craft VIDEO
llvideo craft VIDEO -q "00:14의 컷이 비트에 맞나요?"
index는 전체 비디오를 1fps로 샘플링하는데, 이는 무슨 일이 일어나는지에는 좋지만 어떻게 편집되었는지에는 쓸모가 없습니다. 하드 컷은 단일 프레임을 차지하므로 1fps에서는 샷의 양쪽만 볼 수 있고 전환 자체는 볼 수 없습니다. craft는 다르게 작동합니다:
- 무료 로컬 패스가 모든 프레임을 점수화하고 후보 전환을 찾습니다. 이것은 일반 감지기가 잡을 수 없는 소프트 블렌드도 포착합니다. 1초 크로스페이드는 약 0.025에서 피크를 이루는데, 장면 감지는 0.12에서 트리거됩니다.
- 그런 다음 각 후보는 타이트한 윈도우에서 8fps로 재검사되므로 모델이 전환이 프레임별로 발생하는 것을 봅니다.
- 각 윈도우를 통한 밝기는 ffmpeg로 측정되며, 이것이 블랙-스루-페이드를 크로스페이드와 구분합니다. 이것이 없으면 모델은 페이드 투 블랙을 크로스페이드라고 부릅니다. 있으면 정확합니다.
샷 목록(크기, 카메라 무브, 구성), 전환 목록(유형, 정확한 길이, 컷이 거기에 있는 이유), 페이싱 통계, 색상 및 조명을 반환합니다.
알려진 전환이 있는 비디오로 검증됨 — 4/4 유형 정확, 길이 0.2초 이내:
| 구축됨 | 감지됨 |
|---|---|
| 하드 컷, 즉시 | hard_cut, 즉시 |
| 크로스페이드, 1.0초 | crossfade, 1.0초 |
| 페이드 투 블랙, 0.6초 | fade_to_black, 0.5초 |
| 와이프-레프트, 0.8초 | wipe, 0.63초 |
그리고 휩 팬을 포함한 연속 핸드헬드 테이크에서 하나의 샷과 0개의 전환을 정확히 보고하여 컷을 만들어내지 않았습니다.
카메라 무브는 컷이 아닙니다. 휩 팬, 빠른 틸트 또는 랙 포커스는 낮은 프레임 레이트에서 편집처럼 보입니다. craft는 그것들을 구별하도록 만들어졌습니다. index는 그렇지 않습니다. 질문이 편집에 관한 것이라면 craft를 사용하세요.
플래그: 매우 빠른 컷팅에는 --zoom-fps 12 · 더 바쁜 편집에는 --max-windows 12 · --no-zoom은 클로즈 패스를 건너뜁니다(더 저렴하지만 훨씬 덜 정확).
화면 텍스트가 실패 모드입니다. 진지하게 받아들이세요.
모델은 흐릿한 텍스트를 자신있게 읽고 틀릴 수 있습니다. 실제 영상에서 측정 — 동일한 모션 블러가 있는 자동차 대시보드, 세 번 질문:
호출 1: "642" "55 F" "330 mi"
호출 2: "23.9" "65 F" "330"
호출 3: "6:42" "55 F" "330 mi"
어떤 단일 답변에도 문제를 표시하지 않습니다. 따라서 단일 답변에 의존하지 마세요:
llvideo index VIDEO --verify 3
이것은 쿼리를 세 번 실행하고 어떤 판독값이 안정적인지(매 실행 동일)와 어떤 것이 불안정한지를 보고합니다. 불안정한 판독값은 "디스플레이는 있지만 읽을 수 없음"으로 처리하세요. 불안정한 판독값이 중요하다면 전체 해상도 스틸을 내보내고 직접 읽으세요:
llvideo stills VIDEO --at 00:11 --width 1920
답변이 실행될 때마다 --verify 3을 사용하세요: 화면 녹화의 오류 메시지, 대시보드의 숫자, 화면의 코드, 가격, 이름. 각 추가 실행 비용은 첫 번째와 비슷합니다 — 페니 수준입니다.
렌더링 감사 — audit
비디오(Remotion, HyperFrames, brag, ffmpeg, Veo)를 만든 후에는 본 적이 없습니다. 제공하기 전에 확인하세요:
llvideo audit out.mp4 # 무료 측정 검사만
llvideo audit out.mp4 --craft # 전환 및 카메라 추가
llvideo audit out.mp4 --spec intent.json # 요청한 것과의 차이 추가
무료 검사는 실제로 출시되는 버그를 잡습니다. 모델 없음, 토큰 없음, 네트워크 없음:
- 검은색 또는 흰색 첫/마지막 프레임 — 가장 흔한 내보내기 결함, 타임라인의 1 오프셋 오류
- 본문 내부의 검은색 갭과 얼어붙은 구간
- EBU R128 음량 및 트루 피크 클리핑, -14 LUFS 플랫폼 목표 대비
- 무음 갭 및 "오디오 트랙이 사실상 비어 있음"
- 선언된 프레임 레이트 vs 암시된 프레임 레이트, 해상도, 비트레이트
- 프레임 가장자리에 밀착된 밝은 디테일(타이틀 세이프 힌트)
검증됨: 의도적으로 심은 5개의 결함 중 5개를 잡아내고 실제 전문 영상에서 제로 결과로 CLEAN 반환. 거짓 경보를 울리지 않습니다.
모든 결과는 측정됨(ffmpeg가 숫자와 함께 말함)인지 판단됨(모델이 생각함)인지를 명시합니다. 판단된 결과를 사실로 제시하지 마세요.
종료 코드는 차단 항목이 있을 때만 1이므로 CI 게이트로 작동합니다.
의도와 비교
비디오가 무엇이어야 했는지 작성한 다음 비교하세요:
{
"duration_seconds": 30,
"duration_tolerance": 0.5,
"aspect": "16:9",
"transitions": [
{"type": "hard_cut", "at": 5.0},
{"type": "crossfade", "at": 15.0, "duration": 1.0}
],
"checks": [
{"name": "no_black", "description": "선언되지 않은 블랙 프레임 없음"},
{"name": "loudness", "description": "-14 LUFS ± 1"},
{"name": "first_frame_black", "description": "첫 프레임이 블랙이 아님"}
]
}
의도를 통한 audit은 차이 보고서를 생성합니다: 예상 전환이 없는 경우, 찾을 수 없는 장면, 예상치 못한 블랙 갭, 누락된 오디오 길이. 각 불일치에는 근거가 포함됩니다 — 의도가 정확히 일치하지 않을 때 ~ 접두사가 붙은 부동소수점 허용 오차로 처리합니다.
스크린샷 없음 — screenshot
웹 사이트를 비디오로 렌더링하는 것은 아닙니다. screenshot은 정적 PNG/JPEG용입니다. 비디오 관련 질문에는 사용하지 마세요. 비디오의 프레임이 필요하면 stills를 사용하세요.