Analyze video files by detecting scene boundaries and generating structured production metadata as JSON. Use when asked to analyze scenes in a video, detect scene changes, generate scene-level metadata (camera angles, color tone, tempo, transitions, text overlays), catalog visual assets, or produce a structured JSON breakdown of video content. Includes bundled videx script for frame extraction (requires ffmpeg/ffprobe). Outputs analysis.json with per-scene content summaries, production/direction tags, and a cross-scene asset library.
Detect scene boundaries in video files and generate structured JSON with content summaries, production tags, and a visual asset library per scene.
Requires ffmpeg and ffprobe. Verify:
ffmpeg -version && ffprobe -version
If missing, inform the user and stop.
This skill bundles its own videx script at scripts/videx (relative to SKILL.md). Resolve the full path:
VIDEX="$(dirname "$(realpath "<path-to-SKILL.md>")")/scripts/videx"
Two-pass process:
analysis.json + conversation summaryffprobe -v error -show_entries format=duration,size -show_entries stream=codec_name,width,height,r_frame_rate -of default=noprint_wrappers=1 <video>
Record duration, resolution, fps for the output JSON.
Choose interval based on duration:
| Duration | Interval | Command |
|----------|----------|---------|
| < 5 min | 2s | $VIDEX overview <video> 2 320 0.5 |
| 5-30 min | 5s | $VIDEX overview <video> 5 320 0.5 |
| > 30 min | 10s | $VIDEX overview <video> 10 320 0.5 |
Use triplet=0.5 (wider spread) to make transitions visible.
Read every _b (center) frame chronologically using the Read tool. Read in batches of 20-30 if many frames.
For timestamps where the _b frame looks like a transition (blur, blend, fade), also read the _a and _c frames.
Compare consecutive _b frames. A scene boundary exists when:
Heuristic: when uncertain, prefer splitting. Users can merge; they cannot split what was missed.
Record for each boundary:
The first frame always starts Scene 1. The last sample point ends the final scene (use video duration).
Show the user a scene list before proceeding:
Scene 1: 0:00 - 0:04 (cut)
Scene 2: 0:04 - 0:07 (dissolve)
...
Ask if they want to adjust boundaries or proceed.
For each scene, extract at 1280px:
$VIDEX range <video> <start>-<end> --triplet=0.2
Short scenes (< 2s): add --fps=5
Long scenes (> 30s): default 2fps is fine.
Read all extracted frames for the scene. Determine:
Content summary: 2-4 sentences. Subjects, actions, setting, props, visible text.
Production tags:
| Tag | Values |
|-----|--------|
| camera_angle | eye-level, low-angle, high-angle, bird's-eye, dutch-angle, over-the-shoulder, pov |
| shot_size | extreme-wide, wide, medium-wide, medium, medium-close-up, close-up, extreme-close-up |
| camera_movement | static, pan-left, pan-right, tilt-up, tilt-down, zoom-in, zoom-out, dolly-in, dolly-out, tracking, handheld, crane, steadicam |
| color_tone | warm, cool, neutral, desaturated, high-contrast, low-contrast, monochrome, neon, pastel, earth-tones |
| lighting | natural, artificial, high-key, low-key, backlit, side-lit, top-lit, silhouette, mixed |
| tempo | static, slow, moderate, fast, frenetic |
Text overlay:
placement: none, lower-third, centered, top, full-screen, watermarkcontent: actual text visible, or nullTransitions:
in: how scene begins (none for first scene)out: how scene ends (none for last scene)If a tag changes mid-scene, use the dominant value and note the change in notes.
While analyzing scenes, catalog every distinct visual asset across the entire video. For each asset, record:
| Field | Description |
|-------|-------------|
| id | Kebab-case unique identifier (e.g., student-summer, logo-brand) |
| type | character, background, icon, ui-screen, photo, product, logo, decoration, text-graphic, effect |
| label | Human-readable one-line description with key visual traits |
| style | anime-illustration, flat-design, realistic-photo, 3d-render, hand-drawn, typography, mixed |
| appears_in | Array of scene numbers where this asset appears |
Guidelines:
student-summer, student-winter)label should be concise but include enough detail to identify the asset (color, pose, size, distinguishing features)See references/schema.md for the full type reference and examples.
Assemble the complete JSON per the schema in references/schema.md.
Write to: ./videx-out/<video-name>/analysis.json
After writing JSON, provide:
camera_movement: static../videx-out/<video-name>/
├── overview/ (Pass 1)
├── range_*/ (Pass 2)
└── analysis.json (final output)
Generate or edit images via Gemini 3 Pro Image (Nano Banana Pro).
Batch-generate images via OpenAI Images API. Random prompt sampler + `index.html` gallery.
Generate spectrograms and feature-panel visualizations from audio with the songsee CLI.
Extract frames or short clips from videos using ffmpeg.
Search GIF providers with CLI/TUI, download results, and extract stills/sheets.
Category:media-generate