Was macht llvideo?
Du kannst kein Video ansehen. Ein video-natives Modell kann das. Dieses Skill stellt eines hinter eine CLI, lässt es strukturierte Beweise statt Prosa zurückgeben und übergibt dir dann echte Frames, damit du dir selbst ein Urteil bilden kannst.
Diese Unterscheidung ist der ganze Punkt. Wenn du die Zusammenfassung eines Modells weitergibst, bist du ein Mittelsmann. Wenn du über einen typisierten Index nachdenkst und ihn anhand von Pixeln bestätigst, die du dir angesehen hast, bist du der Analyst.
Setup-Check
llvideo providers
Benötigt ffmpeg im PATH und einen API-Schlüssel. GEMINI_API_KEY erledigt alles. OPENROUTER_API_KEY ist etwa halb so teuer, hat aber keinen Upload-Endpunkt, daher nur URL und kleine Clips – und OpenRouter erfordert $1,00 an gekauftem Guthaben, bevor es eine Videoanfrage akzeptiert, auch bei :free-Modellen.
Schlüssel werden zuerst aus der Umgebung gelesen. Als Fallback wird auch eine KEY=value-Datei unter ~/.itachi-api-keys gelesen, was nur eine Annehmlichkeit ist, um Schlüssel aus deinem Shell-Profil fernzuhalten – Umgebungsvariablen reichen aus.
Der Kreislauf, dem du folgen solltest
1. Beginne immer kostenlos
llvideo probe VIDEO # Dauer, Codec, Auflösung, Token-Schätzung – kostet nichts
llvideo plan VIDEO # Was es kosten wird und wie es gehandhabt wird – kostet nichts
plan gibt dir die Abtastrate an, ob eine Transcodierung erforderlich ist, die Token-Anzahl und die Dollar-Schätzung. Lies es, bevor du Geld ausgibst.
2. Indiziere das Video
llvideo index VIDEO
llvideo index VIDEO --json # zum Parsen
llvideo index VIDEO --verify 3 # wenn Bildschirmtext wichtig ist – siehe unten
Gibt Szenen mit Zeitstempeln, Bildschirmtext, Aktionen, Sprache, Schlüsselmomente und eine explizite Liste von uncertainties zurück. Es schreibt auch ein Kontaktblatt.
3. SCHAU DIR DAS KONTAKTBLATT AN. Dieser Schritt ist nicht optional.
Die index-Ausgabe endet mit einem Pfad. Lies dieses Bild mit deiner eigenen Sehkraft, bevor du dem Benutzer antwortest. Es ist ein Bild, das die gesamte Timeline für etwa 600–1.600 Token abdeckt. Du bist billig, um zu erden, und teuer, um falsch zu liegen.
Alles, was du behauptest, sollte eines der folgenden sein:
- etwas, das du selbst in einem Frame gesehen hast,
- eine ffmpeg-Messung, oder
- ein Transkript-Zitat.
Alles andere muss zugeschrieben werden: "der Index berichtet...". Gib niemals eine Schätzung eines Modells als deine eigene Stimme aus.
4. Gehe tiefer, wo es darauf ankommt
llvideo clip VIDEO --start 02:10 --end 02:40 --fps 4 -q "animiert sich das Logo sauber?"
llvideo stills VIDEO --at 02:14,02:19 --width 1920 # volle Auflösung, sieh sie dir selbst an
llvideo sheet VIDEO --at 01:00,01:05,01:10 --tile 768 --cols 2 # dichter UI-Text
Clipping ist frame-genau und kostet ein paar hundert Token. Verwende es frei.
Die beste Ansicht zum Verstehen – timeline
llvideo timeline VIDEO
llvideo timeline VIDEO --transcribe # wortgenaues Sprechzeit-Timing
index gibt scenes, speech und audio_events als drei separate Arrays zurück. Jedes ist genau, aber nichts verbindet sie – daher liegen „eine Nahaufnahme des Armaturenbretts“ und „er sagt, die Reichweite sei falsch“ in verschiedenen Listen, und die Tatsache, dass sie im selben Moment stattfinden, bleibt dir zur Rekonstruktion überlassen.
Diese Gleichzeitigkeit ist der Kontext. Eine Einstellung bedeutet etwas anderes, je nachdem, was darüber gesagt wird. timeline fügt alles auf einer Spur zusammen:
00:10-00:18 (8.0s) *KEY*
shot Nahaufnahme, die dem Fahrer zugewandt ist
see Die Kamera kehrt zum Fahrer zurück, als eine beleuchtete Tankstelle am Fenster vorbeigleitet
does Das Fahrzeug fährt an der beleuchteten Überdachung vorbei
says "Die Tankstelle erscheint bei neun Sekunden im Clip."
hear Leises Innenraum-Ambiente des Autos
why Das Tankstellendach zieht direkt hinter dem Fahrer vorbei
Verwende dies anstelle von index, wenn es um die Bedeutung geht und nicht um die Bestandsaufnahme.
--transcribe fügt ein lokales wortgenaues Transkript ein anstelle der Sprachausgabe des Modells. Die Audio-Zeitstempel des Modells weichen etwa eine Sekunde ab, was ausreicht, um bei einem schnellen Schnitt eine Zeile der falschen Einstellung zuzuordnen. Sprache wird dem Takt zugeordnet, den sie am meisten überlappt, nicht dem ersten, den sie berührt, sodass eine Zeile, die einen Schnitt überspannt, dort landet, wo sie hauptsächlich gesprochen wurde.
Es berichtet Coverage und benennt jeden Zeitabschnitt, über den nichts gesagt wurde. Eine Timeline mit Lücken hat etwas übersehen, und das zu sagen ist besser, als eine unvollständige Darstellung als vollständig zu präsentieren.
Folge-fragen sind kostenlos
Der Index wird 48 Stunden lang basierend auf der Inhaltsidentität und den Abtasteinstellungen zwischengespeichert. Gemessen: Eine zweite timeline desselben Videos sank von 12,5 s und 0,02 $ auf 0,4 s und nichts. Stelle so viele Fragen, wie du brauchst – Iteration ist der Weg, wie Verständnis aufgebaut wird, und sie sollte nach dem ersten Durchlauf nichts kosten. --no-cache erzwingt einen neuen Durchlauf.
Reparieren, was du gefunden hast – fix
Die meisten Audit-Ergebnisse erfordern keine Neuerstellung. Falsche Lautstärke, ein beschnittener Peak, ein schwarzer Frame am Anfang oder Ende – das sind deterministische ffmpeg-Operationen, die nichts kosten und nicht halluzinieren können.
llvideo audit render.mp4 # finde es
llvideo fix render.mp4 # repariere es -> render_fixed.mp4
Automatisch repariert: Integrierte Lautstärke (Zwei-Pass-loudnorm auf −14 LUFS), True-Peak-Clipping (gehalten bei −1,0 dBFS) und schwarze oder weiße erste/letzte Frames – beschnitten durch Messen, wo das Schwarz tatsächlich endet, nicht durch Annahme einer Frame-Anzahl.
Bewusst NICHT repariert, jeweils mit einem genannten Grund:
| Befund | Grund gegen Reparatur |
|---|---|
| schwarze Lücke in der Timeline | eine redaktionelle Entscheidung, kein Fehler, der stillschweigend gelöscht werden sollte |
| Einfrieren | ein gehaltener Frame kann beabsichtigt sein – verkürze ihn in der Timeline |
| niedrige Auflösung | Hochskalieren erfindet Details, die nie aufgezeichnet wurden |
| Sicherheitsrand | Layout ist eine kompositorische Entscheidung; verschiebe das Element, schneide nicht |
| Dauer / Seitenverhältnis | zum Zeitpunkt des Renderings festgelegt; Zuschneiden würde Inhalt entfernen |
fix prüft danach erneut und berichtet Vorher/Nachher-Zahlen, denn zu behaupten, eine Reparatur habe funktioniert, ohne erneut zu messen, ist die Gewohnheit, die dieses Tool brechen soll. Gemessen an einem absichtlich defekten Render: 5 große + 1 kleine Mängel wurden zu 1 großen + 1 kleinen Mängel, und die beiden verbleibenden waren die beiden, die eine menschliche Entscheidung erfordern.
Es überschreibt niemals die Quelle. Die Ausgabe geht an <name>_fixed.mp4, es sei denn, du übergibst --out.
Generieren ergänzender Clips – gen
Kurze Clips, die in eine anderweitig erstellte Timeline passen: eine Einstellung zur Einführung, B-Roll, Textur, ein Logo-Sting. Keine ganzen Filme.
llvideo gen "langsamer Luftaufschwung über einem nebligen Kiefernwald bei Sonnenaufgang" --seconds 5
llvideo gen "Logo rückt in den Rahmen" --image logo.png --seconds 3 # Bild-zu-Video
llvideo gen "gleiche Szene, kältere Farbgebung" --video clip.mp4 --seconds 5 # Video-zu-Video
llvideo gen-image "verwitterte Holz-Titelkarte" --out title.png
Läuft auf Grok Imagine über deinen vorhandenen XAI_API_KEY. Beachte, dass dies xAIs Grok ist, nicht Groq – ein anderes Unternehmen. 1 bis 15 Sekunden in Ein-Sekunden-Schritten, was flexibler ist als Veos feste 4/6/8.
| Auflösung | gemessene Kosten |
|---|---|
| 480p | 0,05 $/s |
| 720p | 0,07 $/s |
| 1080p | ~0,11 $/s (hochgerechnet, nicht gemessen) |
Diese Preise stammen aus dem eigenen Nutzungsfeld der API bei echten Aufträgen, nicht aus der Dokumentation. Alles über 1,00 $ benötigt --yes.
Jeder Clip wird bei Ankunft geprüft, und das ist keine Dekoration. Groks eigene Standardeinstellungen produzieren 848x480 bei etwa -21 LUFS – beides wird vom Prüfer beanstandet. gen standardmäßig auf 720p aus diesem Grund. Dann sieh es dir selbst an:
llvideo sheet clip.mp4
--audio wechselt zu grok-imagine-video-1.5, das einen Soundtrack generiert. Generierte Audio-Elemente kommen tendenziell leise zurück; erwarte einen Lautstärke-Befund und normalisiere in der Nachbearbeitung, wenn der Clip neben anderes Material gesetzt wird.
Prüfen eines Videos, das du ERSTELLT hast – spec + --from-project
Das ist der ganze Kreislauf. HyperFrames, brag und Remotion wissen bereits, was sie bauen wollten, daher sollte niemand manuell eine Absichtsspezifikation schreiben:
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
Oder extrahiere die Spezifikation separat, um sie zu inspizieren oder zu bearbeiten:
llvideo spec ./project --out intent.json
Wo die Absicht herkommt und wie sehr ihr zu vertrauen ist:
| Quelle | Was wird extrahiert | Vertrauen |
|---|---|---|
HyperFrames index.html | Szenenstart/-ende von data-start / data-duration, Bildschirmtext aus dem DOM | exakt |
HyperFrames STORYBOARD.md | Übergangstyp und -dauer pro Frame (transition_in) | verfasste Absicht |
| brag | liest das HyperFrames-Projekt, das es unter composition/ erstellt; kreuzprüft Szenenanzahl und Gesamtanzahl von brag-plan.md | exakt + Kreuzprüfung |
Remotion .tsx | <Sequence from= durationInFrames=> ÷ fps; <TransitionSeries.Transition presentation=> | exakt für Literale und N * fps; berechnete Werte werden übersprungen, nicht geschätzt |
Alles, was nicht statisch gelesen werden kann, wird als Hinweis gemeldet, nicht angenommen – eine springTiming-Dauer oder ein from={computeIt()} wird markiert und ausgeschlossen.
Warum es dies gibt. HyperFrames check validiert die gesuchte Kompositions-Timeline in headless Chrome. brags Auslieferungs-Gate stoppt bei Pre-Render-Snapshots. Remotion hat überhaupt kein entsprechendes Gate. Keines von ihnen betrachtet die exportierte MP4, daher bleibt ein Encoder-Fehler, ein alter Render oder verworfene Frames beim Export unbemerkt ausgeliefert. Diese Lücke wird hiermit geschlossen – und das ist der Grund, warum audit es wert ist, ausgeführt zu werden, selbst wenn die eigenen Prüfungen des Projekts bestanden werden.
Ein Schwarz-Einblendung, die die Spezifikation verlangte, wird nicht als schwarzer Frame-Fehler gemeldet. Nur nicht deklariertes Schwarz ist ein Befund.
Übergänge, Kamera und Tempo – craft
Für „Wie ist dieser Schnitt“, „Welche Übergänge werden verwendet“, „Analysiere den Schnitt“, „Was macht die Kamera“, „Warum fühlt sich das schnell an“ – verwende craft, nicht index.
llvideo craft VIDEO
llvideo craft VIDEO -q "trifft der Schnitt bei 00:14 den Takt?"
index tastet das gesamte Video mit 1 fps ab, was für was passiert in Ordnung und für wie es geschnitten ist nutzlos ist: Ein harter Schnitt belegt einen einzigen Frame, daher siehst du bei 1 fps die Aufnahmen auf beiden Seiten, aber nie den Übergang. craft arbeitet anders:
- Ein kostenloser lokaler Durchlauf bewertet jeden Frame und findet Kandidaten für Übergänge. Dies erfasst weiche Überblendungen, die ein normaler Detektor nicht kann – eine 1-Sekunden-Überblendung hat einen Spitzenwert von etwa 0,025, wo die Szenenerkennung bei 0,12 auslöst.
- Jeder Kandidat wird dann in einem 8-fps engen Fenster erneut untersucht, sodass das Modell den Übergang Frame für Frame sieht.
- Die Helligkeit durch jedes Fenster wird mit ffmpeg gemessen, was eine Schwarz-Einblendung von einer Überblendung unterscheidet. Ohne dies würde das Modell eine Schwarz-Einblendung als Überblendung bezeichnen; damit ist es korrekt.
Gibt Einstellungsliste (Größe, Kamerabewegung, Komposition), Übergangsliste (Typ, genaue Dauer, warum der Schnitt dort sitzt), Tempostatistiken, Farbe und Beleuchtung zurück.
Verifiziert an einem Video mit bekannten Übergängen – 4/4 Typen korrekt, Dauern innerhalb von 0,2 s:
| erstellt | erkannt |
|---|---|
| harter Schnitt, sofort | hard_cut, sofort |
| Überblendung, 1,0 s | crossfade, 1,0 s |
| Schwarz-Einblendung, 0,6 s | fade_to_black, 0,5 s |
| Wisch nach links, 0,8 s | wipe, 0,63 s |
Und bei einer durchgehenden Handheld-Aufnahme mit einer Peitsche-Schwenkung berichtete es korrekt eine Einstellung und null Übergänge, anstatt einen Schnitt zu erfinden.
Eine Kamerabewegung ist kein Schnitt. Ein Peitsche-Schwenk, schneller Neigen oder Ziehen der Schärfe sieht bei niedrigen Bildraten genau wie ein Schnitt aus. craft ist gebaut, um sie zu unterscheiden; index ist es nicht. Wenn eine Frage den Schnitt betrifft, verwende craft.
Flags: --zoom-fps 12 für sehr schnelle Schnitte · --max-windows 12 für geschäftigere Schnitte · --no-zoom zum Überspringen des nahen Durchlaufs (günstiger, viel weniger genau).
Bildschirmtext ist der Fehlermodus. Nimm ihn ernst.
Ein Modell liest unscharfen Text selbstbewusst und liegt falsch. Gemessen an echtem Filmmaterial – dasselbe bewegungsunscharfe Auto-Armaturenbrett, dreimal gefragt:
Aufruf 1: "642" "55 F" "330 mi"
Aufruf 2: "23.9" "65 F" "330"
Aufruf 3: "6:42" "55 F" "330 mi"
Nichts in einer einzelnen Antwort kennzeichnet das Problem. Verlasse dich also nicht auf eine einzelne Antwort:
llvideo index VIDEO --verify 3
Dies führt die Abfrage dreimal aus und berichtet, welche Messwerte stabil (in jedem Durchlauf identisch) und welche INSTABIL sind. Behandle instabile Messwerte als „ein Display ist vorhanden, aber nicht lesbar“. Wenn ein instabiler Messwert wichtig ist, exportiere ein Standbild in voller Auflösung und lies es selbst:
llvideo stills VIDEO --at 00:11 --width 1920
Verwende --verify 3, wenn die Antwort umgesetzt wird: Fehlermeldungen in einem Screencast, Zahlen auf einem Armaturenbrett, Code auf dem Bildschirm, Preise, Namen. Jeder zusätzliche Durchlauf kostet etwa so viel wie der erste – Centbeträge.
Prüfen eines Renderings – audit
Nachdem du ein Video erstellt hast (Remotion, HyperFrames, brag, ffmpeg, Veo), hast du es noch nie gesehen. Überprüfe es vor der Lieferung:
llvideo audit out.mp4 # nur kostenlose gemessene Prüfungen
llvideo audit out.mp4 --craft # plus Übergänge und Kamera
llvideo audit out.mp4 --spec intent.json # plus ein Diff gegen das, was du verlangt hast
Die kostenlosen Prüfungen fangen die Fehler, die tatsächlich ausgeliefert werden. Kein Modell, keine Token, kein Netzwerk:
- schwarzer oder weißer erster/letzter Frame – der mit Abstand häufigste Exportfehler, ein Off-by-one auf der Timeline
- schwarze Lücken und eingefrorene Abschnitte innerhalb des Körpers
- EBU R128 Lautstärke und True-Peak-Clipping, gegen das -14 LUFS Plattform-Ziel
- Stillelücken und „die Tonspur ist praktisch leer“
- deklarierte vs. implizierte Bildrate, Auflösung, Bitrate
- helle Details dicht am Bildschirmrand (Titelsicherer Hinweis)
Verifiziert: Fangt 5 von 5 absichtlich platzierten Fehlern und gibt SAUBER ohne Befund auf echtem professionellem Material zurück. Es schreit nicht „Wolf“.
Jeder Befund gibt an, ob er gemessen (ffmpeg hat es gesagt, mit der Zahl) oder beurteilt (ein Modell denkt so) ist. Gib niemals einen beurteilten Befund als Tatsache aus.
Der Exit-Code ist nur 1, wenn es einen Blockierer gibt, daher funktioniert es als CI-Gate.
Diff gegen Absicht
Schreibe, was das Video sein sollte, und erstelle dann einen Diff:
{
"duration_seconds": 30,
"duration_tolerance": 0.5,
"aspect": "16:9",
"transitions": [
…