Communitygithub.com

ItachiDevv/llvideo

Comprenez une vidéo avec son contexte — ce qui se passe, quand, qui dit quoi, ce qui est affiché à l'écran.

Qu'est-ce que llvideo ?

llvideo est un agent d'audit et d'analyse vidéo en ligne de commande conçu pour les développeurs et les flux de production d'IA. Contrairement aux modèles qui résument du texte, il extrait des preuves structurées (scènes, timings, légendes, transparences et même des métriques comme les images noires ou le silence) directement à partir de fichiers vidéo ou d'URL YouTube, puis vous fournit les images réelles pour que vous puissiez les vérifier vous-même. Sa force réside dans la séparation de l'observation de l'interprétation — vous n'êtes pas un intermédiaire, vous êtes un analyste qui raisonne à partir d'un index typé. La boîte à outils comprend l'indexation vidéo, le découpage à la trame près, l'extraction d'images, la transcription mot-par-mot, la détection de transitions et de mouvements de caméra, l'audit audio/vidéo automatisé (images noires, blocages, volume R128, pics d'écrêtage), la comparaison avec une description de projet (Remotion, HyperFrames, brag), et même la génération de plans supplémentaires avec Grok. Les vérifications sont locales pour les métriques de niveau fichier (ffmpeg) et utilisent des API tierces pour l'analyse sémantique. Le résultat est un rapport objectif, avec des marqueurs indiquant s'il est mesuré ou estimé, et il vous demande toujours d'examiner les images par vous-même avant de rendre un verdict.

Compatible avec~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ItachiDevv/llvideo/tree/HEAD/skills/llvideo

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait llvideo ?

Vous ne pouvez pas regarder une vidéo. Un modèle natif-vidéo le peut. Cette compétence place un tel modèle derrière une CLI, lui fait renvoyer des preuves structurées au lieu d'un texte en prose, puis vous transmet les images réelles afin que vous formiez votre propre jugement.

Cette distinction est le cœur du propos. Si vous relaidez le résumé d'un modèle, vous n'êtes qu'un intermédiaire. Si vous raisonnez à partir d'un index typé et le confirmez par les pixels que vous avez observés, vous êtes l'analyste.

Vérification de la configuration

llvideo providers

Nécessite ffmpeg dans le PATH et une clé API. GEMINI_API_KEY gère tout. OPENROUTER_API_KEY coûte environ la moitié du prix, mais n'a pas de point d'accès de téléchargement, donc il ne fonctionne qu'avec des URL et de petits clips — et OpenRouter exige 1,00 $ de crédit acheté avant d'accepter toute requête vidéo, même sur les modèles :free.

Les clés sont d'abord lues depuis l'environnement. Par défaut, elles lisent également un fichier KEY=value à ~/.itachi-api-keys, qui est simplement une commodité pour garder les clés hors de votre profil shell — les variables d'environnement suffisent.


La boucle à suivre

1. Commencez toujours par le gratuit

llvideo probe VIDEO      # durée, codec, résolution, estimation de tokens — ne coûte rien
llvideo plan VIDEO       # ce que cela coûtera et comment cela sera traité — ne coûte rien

plan vous indique le taux d'échantillonnage, si un transcodage est nécessaire, le nombre de tokens et l'estimation en dollars. Lisez-le avant de dépenser.

2. Indexez la vidéo

llvideo index VIDEO
llvideo index VIDEO --json        # pour l'analyse
llvideo index VIDEO --verify 3    # lorsque le texte à l'écran est important — voir ci-dessous

Renvoie des scènes avec des horodatages, le texte à l'écran, les actions, la parole, les moments clés et une liste explicite des incertitudes. Il écrit également une planche contact.

3. REGARDEZ LA PLANCHE CONTACT. Cette étape n'est pas optionnelle.

La sortie de index se termine par un chemin. Lisez cette image avec votre propre vision avant de répondre à l'utilisateur. C'est une image qui couvre toute la chronologie pour environ 600 à 1 600 tokens. Vous êtes bon marché pour l'ancrage et cher pour l'erreur.

Tout ce que vous affirmez doit être l'un des éléments suivants :

  • quelque chose que vous avez vu vous-même dans une image,
  • une mesure ffmpeg, ou
  • une citation de transcription.

Toute autre chose doit être attribuée : "l'index indique…". Ne blanchissez jamais une supposition d'un modèle dans votre propre voix.

4. Allez plus loin là où cela compte

llvideo clip VIDEO --start 02:10 --end 02:40 --fps 4 -q "le logo s'anime-t-il proprement ?"
llvideo stills VIDEO --at 02:14,02:19 --width 1920   # pleine résolution, regardez-les vous-même
llvideo sheet VIDEO --at 01:00,01:05,01:10 --tile 768 --cols 2   # texte UI dense

Le découpage est précis à la trame et coûte quelques centaines de tokens. Utilisez-le librement.


La meilleure vue pour comprendre — timeline

llvideo timeline VIDEO
llvideo timeline VIDEO --transcribe    # minutage de la parole mot à mot

index renvoie scenes, speech et audio_events sous forme de trois tableaux distincts. Chacun est précis, mais rien ne les relie — donc "un gros plan du tableau de bord" et "il dit que la portée est erronée" se trouvent dans des listes différentes, et le fait qu'ils se produisent au même moment vous est laissé à reconstruire.

Cette co-occurrence est le contexte. Un plan signifie quelque chose de différent selon ce qui est dit dessus. timeline entrelace tout sur une seule piste :

00:10-00:18  (8,0s)   *CLÉ*
    plan   gros plan du conducteur
    voir   La caméra revient sur le conducteur alors qu'une station-service éclairée passe devant la fenêtre
    fait   Le véhicule dépasse l'auvent illuminé
    dit    "La station-service apparaît à neuf secondes du clip."
    entendre   Bourdonnement d'ambiance intérieur de la voiture
    pourquoi   L'auvent de la station-service passe directement derrière le conducteur

Utilisez ceci plutôt que index lorsque la question porte sur le sens plutôt que sur l'inventaire.

--transcribe fusionne une transcription locale mot à mot au lieu de la parole du modèle. Les horodatages audio du modèle dérivent d'environ une seconde, ce qui est suffisant pour attacher une ligne au mauvais plan lors d'un cut rapide. La parole est attribuée au temps qu'elle chevauche le plus, pas au premier qu'elle touche, donc une ligne chevauchant un cut atterrit là où elle a été principalement prononcée.

Il signale la couverture et nomme toute plage de durée pour laquelle rien n'a été dit. Une timeline avec des trous a manqué quelque chose, et le dire vaut mieux que présenter un compte rendu partiel comme complet.

Les questions de suivi sont gratuites

L'index est mis en cache pendant 48 heures en fonction de l'identité du contenu et des paramètres d'échantillonnage. Mesuré : une deuxième timeline sur la même vidéo est passée de 12,5 s et 0,02 $ à 0,4 s et rien. Demandez autant de questions que nécessaire — itérer est la façon dont la compréhension se construit, et cela ne devrait rien coûter après le premier passage. --no-cache force une nouvelle exécution.


Réparer ce que vous avez trouvé — fix

La plupart des constats d'audit n'ont pas besoin d'être regénérés. Une mauvaise loudness, un pic écrêté, une image noire en début ou fin — ce sont des opérations ffmpeg déterministes qui ne coûtent rien et ne peuvent pas halluciner.

llvideo audit render.mp4        # trouver
llvideo fix render.mp4          # réparer -> render_fixed.mp4

Réparé automatiquement : loudness intégrée (loudnorm à deux passes vers −14 LUFS), écrêtage de pic vrai (maintenu à −1,0 dBFS), et premières/dernières images noires ou blanches — rognées en mesurant où le noir se termine réellement, pas en supposant un nombre d'images.

Délibérément NON réparé, chacun avec une raison indiquée :

constatpourquoi pas
trou noir au milieu de la timelineune décision de montage, pas un défaut à supprimer silencieusement
gelune image figée peut être intentionnelle — raccourcissez-la dans la timeline
faible résolutionl'upscaling invente des détails qui n'ont jamais été capturés
marge de sécuritéla disposition est un choix de composition ; déplacez l'élément, ne recadrez pas
durée / formatdéfini au moment du rendu ; rogner pour correspondre couperait du contenu

fix ré-audite ensuite et signale les comptes avant/après, car prétendre qu'une réparation a fonctionné sans re-mesurer est l'habitude que cet outil existe pour briser. Mesuré sur un rendu délibérément cassé : 5 majeurs + 1 mineur sont devenus 1 majeur + 1 mineur, et les deux restants étaient les deux qui nécessitent une décision humaine.

Il n'écrase jamais la source. La sortie va dans <nom>_fixed.mp4 sauf si vous passez --out.


Génération de clips supplémentaires — gen

De courts clips qui s'insèrent dans une timeline construite ailleurs : un plan d'établissement, du b-roll, de la texture, un logo. Pas des films entiers.

llvideo gen "slow aerial push over a misty pine forest at dawn" --seconds 5
llvideo gen "logo settles into frame" --image logo.png --seconds 3    # image-to-video
llvideo gen "same scene, colder grade" --video clip.mp4 --seconds 5   # vidéo-to-vidéo
llvideo gen-image "weathered wood title card" --out title.png

Fonctionne sur Grok Imagine via votre XAI_API_KEY existante. Notez qu'il s'agit du Grok de xAI, pas de Groq — une entreprise différente. 1 à 15 secondes par pas d'une seconde, ce qui est plus flexible que les 4/6/8 fixes de Veo.

résolutioncoût mesuré
480p0,05 $/s
720p0,07 $/s
1080p~0,11 $/s (extrapolé, non mesuré)

Ces tarifs proviennent du champ d'usage de l'API elle-même sur des travaux réels, pas de la documentation. Tout ce qui dépasse 1,00 $ nécessite --yes.

Chaque clip est audité à son arrivée, et ce n'est pas de la décoration. Les propres valeurs par défaut de Grok produisent 848×480 à environ -21 LUFS — les deux sont signalés par l'auditeur. gen utilise par défaut 720p pour cette raison. Ensuite, regardez-le vous-même :

llvideo sheet clip.mp4

--audio passe à grok-imagine-video-1.5, qui génère une bande-son. L'audio généré a tendance à revenir faible ; attendez-vous à un constat de loudness et normalisez en post si le clip va à côté d'autre matériel.


Auditer une vidéo que vous avez CRÉÉE — spec + --from-project

C'est toute la boucle. HyperFrames, brag et Remotion savent déjà ce qu'ils voulaient construire, donc personne ne devrait écrire manuellement une spécification d'intention :

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

Ou extrayez la spécification seule pour l'inspecter ou la modifier :

llvideo spec ./project --out intent.json

D'où vient l'intention et à quel point lui faire confiance :

SourceCe qui est extraitConfiance
index.html d'HyperFramesdébut/fin de scène depuis data-start / data-duration, texte à l'écran depuis le DOMexact
STORYBOARD.md d'HyperFramestype et durée de transition par image (transition_in)intention de l'auteur
braglit le projet HyperFrames qu'il construit sous composition/ ; croise le nombre de scènes et le total de brag-plan.mdexact + vérification croisée
.tsx de Remotion<Sequence from= durationInFrames=> ÷ fps ; <TransitionSeries.Transition presentation=>exact pour les littéraux et N * fps ; les valeurs calculées sont ignorées, pas devinées

Tout ce qui ne peut pas être lu statiquement est signalé comme une note plutôt que supposé — une durée springTiming ou un from={computeIt()} est marqué et exclu.

Pourquoi cela existe. check d'HyperFrames valide la timeline de composition cherchée dans Chrome headless. La porte de livraison de brag s'arrête aux captures d'écran pré-rendu. Remotion n'a pas de porte équivalente du tout. Aucun d'eux ne regarde le MP4 exporté, donc un bug d'encodeur, un rendu obsolète, ou des images perdues à l'exportation partent inaperçus. C'est ce créneau que cela comble — et c'est pourquoi audit vaut la peine d'être exécuté même lorsque les propres vérifications du projet réussissent.

Un fondu au noir demandé par la spécification n'est pas signalé comme un défaut d'image noire. Seul le noir non déclaré est un constat.


Transitions, caméra et rythme — craft

Pour les questions "comment est ce cut", "quelles transitions sont utilisées", "analysez le montage", "que fait la caméra", "pourquoi cela semble rapide" — utilisez craft, pas index.

llvideo craft VIDEO
llvideo craft VIDEO -q "le cut à 00:14 tombe-t-il sur le temps ?"

index échantillonne toute la vidéo à 1 ips, ce qui est bien pour ce qui se passe et inutile pour comment c'est monté : un cut sec occupe une seule image, donc à 1 ips vous voyez les plans de chaque côté et jamais la transition. craft fonctionne différemment :

  1. Un premier passage local gratuit évalue chaque image et trouve les transitions candidates. Cela capture les fondus doux qu'un détecteur normal ne peut pas voir — un crossfade d'une seconde culmine autour de 0,025, alors que la détection de scène se déclenche à 0,12.
  2. Chaque candidat est ensuite réexaminé à 8 ips dans une fenêtre serrée, afin que le modèle voie la transition se produire image par image.
  3. La luminosité à travers chaque fenêtre est mesurée avec ffmpeg, ce qui est ce qui sépare un fondu au noir d'un crossfade. Sans cela, le modèle appelle un fondu au noir un crossfade ; avec cela, il est correct.

Renvoie une liste de plans (taille, mouvement de caméra, composition), une liste de transitions (type, durée exacte, pourquoi le cut atterrit là), des statistiques de rythme, la couleur et l'éclairage.

Vérifié sur une vidéo avec des transitions connues — 4/4 types corrects, durées à 0,2 s près :

construitdétecté
cut sec, instantanéhard_cut, instantané
crossfade, 1,0 scrossfade, 1,0 s
fondu au noir, 0,6 sfade_to_black, 0,5 s
wipe gauche, 0,8 swipe, 0,63 s

Et sur un plan continu à main levée contenant un whip pan, il a correctement signalé un plan et zéro transition plutôt que d'inventer un cut.

Un mouvement de caméra n'est pas un cut. Un whip pan, un tilt rapide ou un rack focus ressemble exactement à un montage à basse fréquence d'images. craft est conçu pour les distinguer ; index ne l'est pas. Si une question porte sur le montage, utilisez craft.

Drapeaux : --zoom-fps 12 pour un montage très rapide · --max-windows 12 pour des montages plus chargés · --no-zoom pour sauter le passage rapproché (moins cher, beaucoup moins précis).


Le texte à l'écran est le mode d'échec. Prenez-le au sérieux.

Un modèle lira un texte flou avec confiance et se trompera. Mesuré sur des séquences réelles — le même tableau de bord de voiture flou de mouvement, demandé trois fois :

requête 1 :  "642"   "55 F"   "330 mi"
requête 2 :  "23,9"  "65 F"   "330"
requête 3 :  "6:42"  "55 F"   "330 mi"

Rien dans aucune réponse unique ne signale le problème. Par conséquent, ne vous fiez pas à une seule réponse :

llvideo index VIDEO --verify 3

Cela exécute la requête trois fois et signale quelles lectures sont stables (identiques à chaque exécution) et lesquelles sont INSTABLES. Traitez les lectures instables comme "un affichage est présent mais illisible". Si une lecture instable est importante, exportez une image en pleine résolution et lisez-la vous-même :

llvideo stills VIDEO --at 00:11 --width 1920

Utilisez --verify 3 chaque fois que la réponse sera utilisée : messages d'erreur dans un enregistrement d'écran, chiffres sur un tableau de bord, code à l'écran, prix, noms. Chaque exécution supplémentaire coûte à peu près la même chose que la première — quelques centimes.


Auditer un rendu — audit

Après avoir fabriqué une vidéo (Remotion, HyperFrames, brag, ffmpeg, Veo), vous ne l'avez jamais vue. Vérifiez-la avant de l'expédier :

llvideo audit out.mp4                      # vérifications mesurées gratuites uniquement
llvideo audit out.mp4 --craft              # plus transitions et caméra
llvideo audit out.mp4 --spec intent.json   # plus un différentiel par rapport à ce que vous avez demandé

Les vérifications gratuites attrapent les bugs qui sont réellement expédiés. Aucun modèle, aucun token, aucun réseau :

  • première ou dernière image noire ou blanche — le défaut d'exportation le plus courant, un off-by-one sur la timeline
  • trous noirs et étendues figées à l'intérieur du corps
  • loudness EBU R128 et écrêtage de pic vrai, par rapport à la cible de plateforme -14 LUFS
  • trous de silence, et "la piste audio est effectivement vide"
  • fréquence d'images, résolution, débit binaire déclarés vs implicites
  • détail lumineux appuyé contre le bord de l'image (indice de marge de titre)

Vérifié : attrape 5 défauts sur 5 délibérément plantés, et renvoie PROPRE avec zéro constats sur des séquences professionnelles réelles. Il ne crie pas au loup.

Chaque constat indique s'il est mesuré (ffmpeg l'a dit, avec le nombre) ou jugé (un modèle le pense). Ne présentez jamais un constat jugé comme un fait.

Le code de sortie est 1 uniquement lorsqu'il y a un bloqueur, donc il fonctionne comme une porte CI.

Différentiel par rapport à l'intention

Écrivez ce que la vidéo était censée être, puis différenciez :

{
  "duration_seconds": 30,
  "duration_tolerance": 0.5,
  "aspect": "16:9",
  "transitions": [
    {
      "time_seconds": 10.0,
      "type": "crossfade",
      "duration_seconds": 1.0
    }
  ],
  "on_screen_text": [
    {
      "time_seconds": 2.0,
      "text": "Welcome"
    }
  ]
}
llvideo audit out.mp4 --spec intent.json

Signale les écarts et les omissions. Chaque écart est mesuré — par exemple, "la loudness réelle est -18,3 LUFS, contre l'intention -14 LUFS" — et non pas "peut-être un peu faible". Les éléments intentionnels manquants dans le rendu sont listés. Les éléments présents dans le rendu mais pas dans l'intention sont également listés.


Workflow complet : de l'intention au rendu vérifié

Tout son sens lorsqu'il est enchaîné :

# 1. Extrayez l'intention
llvideo spec ./mon-projet --out intent.json

# 2. Construisez (avec votre outil habituel)
brag render mon-projet mon-projet/sortie.mp4

# 3. Auditez l'intention
llvideo audit mon-projet/sortie.mp4 --spec intent.json --craft

# 4. Si échoué, réparez
llvideo fix mon-projet/sortie.mp4

# 5. Regardez la fiche technique
llvideo sheet mon-projet/sortie_fixed.mp4

--craft sur un audit passe les résultats à craft en toile de fond. --spec passe la spécification lue de l'audit (toute source de projet supportée). La sortie JSON unique peut être canalisée vers tout ; regardez la fiche technique avec vos yeux.


Voir le contexte de la séquence générée

Après la génération, obtenez un plan de tournage de ce qui vient d'être fait :

llvideo timeline clip.mp4

Même chose : regardez la planche contact d'abord.


Ce que ce n'est pas

Ce n'est pas un éditeur vidéo, pas un synthétiseur de scènes entières, pas un lecteur vidéo, pas un outil de sous-titrage pour les humains. C'est un pont entre un LLM qui ne peut pas regarder une vidéo et les preuves dont il a besoin pour raisonner correctement à son sujet. La valeur est dans l'interface — déterministe, vérifiable et économique.

Conseils généraux

  • Regardez toujours la planche contact. C'est votre meilleur ancrage.
  • Utilisez --verify 3 pour tout texte à l'écran avant d'agir.
  • Pour les questions de montage, utilisez craft, pas index.
  • Utilisez --transcribe lorsque la synchronisation parole/plan est importante.
  • L'audit gratuit attrape la plupart des bugs d'exportation réels. Exécutez-le toujours.
  • Un constat d'audit "mesuré" est un fait. Un constat "jugé" est une supposition.
  • La mise en cache dure 48 heures. Utilisez-la : posez plusieurs questions à partir d'un seul index.
  • La spécification d'intention se trouve dans votre projet. Vous n'avez pas besoin de l'écrire.

Skills associés