From claude-commands
Extracts frames from videos using ffmpeg and inspects UI states to verify test outcomes. Useful for reviewing video evidence of UI flows.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-commands:video-frame-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Claude Code is multimodal: `Read` on a JPEG/PNG renders it visually.
Claude Code is multimodal: Read on a JPEG/PNG renders it visually.
ffmpeg extracts frames → Read individual frames at key timestamps = video review without Gemini or any API.
No external tools needed beyond ffmpeg (already at /opt/homebrew/bin/ffmpeg).
# 1 FPS into a frames/ directory
ffmpeg -i test.webm -vf fps=1 /tmp/review/frames/frame_%04d.jpg
# Scene-change only (cheaper, catches state transitions)
ffmpeg -i test.webm -vf "select='gt(scene,0.4)'" -vsync vfr /tmp/review/scene/scene_%04d.jpg
# Contact sheet (quick visual overview, all frames tiled)
ffmpeg -i test.webm -vf "fps=1,scale=320:-1,tile=4x4" /tmp/review/contact_sheet.jpg
Don't read every frame. Sample strategically:
| Frame | Purpose |
|---|---|
| frame_0001 | Loading state — blank? error? |
| frame_0005 | First meaningful UI state |
| frame_0010, 0020 | Early flow |
| frame_0030–0050 | Mid-flow — key interactions |
| frame_0060–0080 | Late flow |
| frame_last | Final state — did it succeed? |
Read the contact sheet first for a spatial overview, then dive into specific frames.
[CHARACTER CREATION - No Character Built]The test_full_lifecycle_video (101.76s) was reported "pass" because ffprobe confirmed a valid .webm file. Frame review revealed every GM response was [CHARACTER CREATION - No Character Built] — the game never actually worked. Character creation data was never persisted before the session started.
File existence + duration ≠ test passed. Frame content is the ground truth.
1. ffmpeg extract 1FPS frames to /tmp/review/frames/
2. Read contact sheet for overview
3. Read frame_0001 (load state)
4. Read frame_0005 (first UI)
5. Read frames at 25%, 50%, 75%, 100% of total count
6. Read any frames around timestamps of interest from server logs
7. Report what actually happened on screen
Reading ~10 JPEG frames locally costs nothing beyond Claude context. For 34 test videos, batch the review: extract all frames, then sweep through contact sheets first to triage which videos need deep frame inspection.
npx claudepluginhub jleechanorg/claude-commands --plugin claude-commandsExtracts frames from videos/images, renders Remotion to MP4/stills/GIF, checks specs like resolution/fps/codec, and visually verifies quality via ffmpeg/ffprobe shell toolkit.
Decomposes videos into meaningful keyframes using ffmpeg scene detection filter. Extracts images on scene changes (threshold 0.01), timestamps from logs, supports MP4/MOV/WEBM/AVI/MKV. Adjusts sensitivity; warns on low frame counts indicating static videos.
Extracts video frames via FFmpeg for scroll-animations, sprite sheets, and AI training datasets. Includes frame extraction, resizing, quality optimization, and scroll-driven playback setup.