{
  "markdown": "# claude-real-video\n\n[![PyPI](https://img.shields.io/pypi/v/claude-real-video)](https://pypi.org/project/claude-real-video/) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue)](https://pypi.org/project/claude-real-video/) [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![HN front page](https://img.shields.io/badge/Hacker%20News-front%20page-orange)](https://news.ycombinator.com/item?id=48766005)\n\n[![LLM Real Video — Give Your LLM Eyes (60-second film)](https://img.youtube.com/vi/sw6_8E-57w4/maxresdefault.jpg)](https://youtu.be/sw6_8E-57w4)\n\n**▶ [The 60-second pixel film — sound on](https://youtu.be/sw6_8E-57w4)** ([mp4 on GitHub](https://github.com/HUANGCHIHHUNGLeo/claude-real-video/releases/download/v0.7.16/crv-999-film-60s.mp4)) · an AI agent searches \"how can an LLM truly understand video?\", finds a key, and unlocks vision.\n\n[![crv 60s demo](https://raw.githubusercontent.com/HUANGCHIHHUNGLeo/claude-real-video/master/docs/crv-demo-poster.jpg)](https://github.com/HUANGCHIHHUNGLeo/claude-real-video/releases/download/v0.7.15/crv-demo-60s.mp4)\n\n60-second real demo — real install, real run, real viewer.\n\n**Let Claude — or any LLM — actually watch a video.**\n\n```bash\npip install \"claude-real-video[whisper]\"\nnpx skills add HUANGCHIHHUNGLeo/claude-real-video   # one command, installs the skill into Claude Code, Cursor, Codex, Copilot, Gemini CLI & 50+ agent hosts\n```\n\nClaude Code plugin marketplace (enable auto-update in /plugin → Marketplaces if you want it):\n\n```\n/plugin marketplace add HUANGCHIHHUNGLeo/claude-real-video\n/plugin install claude-real-video@claude-real-video\n```\n\nThen paste a video link into your agent and ask about it. (CLI-only use? `crv \"<url>\"` works with just the pip install.)\n\n> **Naming:** crv is the short name for claude-real-video (the PyPI package). The paid add-on, **crv Pro**, is sold on Capafy under the listing name \"llm-real-video Pro\".\n\n![demo](https://raw.githubusercontent.com/HUANGCHIHHUNGLeo/claude-real-video/master/docs/demo.gif)\n\n> ▶ **New: the 40-second film** — [*my AI agent learned to watch videos (and stopped working)*](https://youtu.be/xFqPtcju_xo)\n\n> Same 58-second clip: fixed 1 fps sampling = **58 frames**. crv keeps the **26 that actually differ** — and `--grid` packs them into **3 contact sheets**. Fewer tokens, nothing missed.\n\n> **This free version lets your AI *see* the video.** [crv Pro](https://leoaido.com/crv-pro/) lets it *understand* it — how it was shot (cut rhythm, camera moves) plus a timestamped timeline of what frames can't show: gestures, expressions, voice pitch shifts, emotion, sound events. One-time price $29 — [get it on Capafy](https://capafy.ai/agent/llm-real-video-pro-let-any-llm-watch-videos/5451082151) or [buy with card via Lemon Squeezy](https://leoaido.lemonsqueezy.com/checkout/buy/ff552000-adc0-49f1-8eec-5e8ada1905a1).\n\nMost AI tools don't really *see* a video. Paste a YouTube link into ChatGPT and it\nreads the **transcript**, not the picture. Claude won't take a video file at all.\nEven Gemini, which *can* read video natively, has to send it up to Google and\nsamples frames at a **fixed interval** (1 fps by default), so fast cuts slip past.\n\n`claude-real-video` does it differently, and **the processing runs locally**: point it at a URL or a\nfile, and it pulls the frames that *actually matter* (every scene change, not a\nfixed quota), throws away the near-duplicates, transcribes the audio, and hands\nyou a clean folder any LLM can read. All the processing happens on your own machine — what gets sent anywhere is only the frames/text *you* choose to paste into an LLM afterwards.\n\n```bash\ncrv \"https://www.youtube.com/watch?v=...\"\n# → crv-out/frames/*.jpg  +  frames.json (per-frame timestamps)  +  transcript.txt/.json  +  MANIFEST.txt\n```\n\nThen drop the frames + `MANIFEST.txt` into Claude / ChatGPT / Gemini and ask away.\n\n**No terminal needed** — run `crv-web` and a local page opens (Traditional Chinese / Simplified Chinese / English): paste a YouTube or Reels link or a file path, click Analyze, open the result viewer. Video analysis and output generation run on your machine — the source video never gets uploaded. (If you then paste the extracted frames or transcript into a cloud LLM, that data goes to that provider.)\n\nWant to eyeball what the model will see first? Add `--viewer` — it writes a local `viewer.html` (video + keyframe grid + transcript) you can double-click open. No network, no extra installs.\n\n**Only part of a video matters** (a 10-minute screen share inside a 90-minute call): `--from 28:00 --to 43:00`. ffmpeg seeks instead of decoding the whole file, Whisper only hears the window, and the frame budget is spent inside it — but every timestamp crv reports is still a source timecode you can quote to a colleague.\n\n**The meaning is small text** (a terminal, a spreadsheet, an IDE): `--frame-width 1600`. Frame *selection* is the hard part and crv already does it; at 640px on a 1920-wide screen recording the right moment gets found and then the detail that made it worth finding is thrown away.\n\n**Slow-changing content** (animation tutorials, gradual morphs, slow pans): add `--adaptive` — frames are picked against their rolling neighbourhood instead of a fixed threshold, so a 2-3s squash-and-stretch that never spikes any single frame still gets captured.\n\n**Text-heavy content** (lecture slides, screen recordings, talking-head explainers): add `--text-anchors` — extra frames are forced at subtitle-cue timestamps, so each spoken segment gets a matching visual even when the scene barely changes. Needs a sidecar `.srt`/`.vtt` or an embedded subtitle track — captions burned into the pixels can't be detected. At most one forced frame per second; scene detection is untouched.\n\n**Multi-speaker content** (interviews, podcasts, meetings): add `--speakers` — every transcript line gets a speaker label (`[SPEAKER_00]`, `[SPEAKER_01]`, …) so the model can follow who said what. Runs a local diarization model (45 MB, downloads once, no account or token needed). Install with `pip install \"claude-real-video[speakers]\"`.\n\nNot doing LLM work? It also works as a **general-purpose video keyframe extractor** —\nscene-change detection + dedup, no ML models to download.\n\n**Using Claude Code — or any coding agent?** One command installs the skill\n(works with Claude Code, Cursor, Codex, Copilot, Gemini CLI and other\n[agentskills.io](https://agentskills.io)-compatible hosts):\n\n```bash\npip install \"claude-real-video[whisper]\"\nnpx skills add HUANGCHIHHUNGLeo/claude-real-video\n```\n\nThen just paste a video link into your agent and ask about it.\n\n<details>\n<summary>Manual install (clone + copy)</summary>\n\n```bash\ngit clone https://github.com/HUANGCHIHHUNGLeo/claude-real-video.git\nmkdir -p ~/.claude/skills && cp -r claude-real-video/skills/claude-real-video ~/.claude/skills/\n```\n\n</details>\n\n**Tell it *why* you're watching, and keep what it finds:**\n\n```bash\ncrv \"https://youtu.be/...\" --why \"find the pricing strategy\" --kb ~/notes\n```\n\n`--why` makes the analysis focus on what you care about instead of a generic summary;\n`--kb` saves the result as a dated note in your own notes folder, so it doesn't die in `crv-out`.\n\n**New in 0.10.x** — analyse only the part that matters:\n\n```bash\ncrv long-meeting.mp4 --from 28:00 --to 43:00\n```\n\n`--from` / `--to` cut a window out of a long video: ffmpeg seeks instead of decoding\nthe whole file, the transcript and frame budget follow the window, and every reported\ntimestamp is still a source timecode you can quote back to the original.\n\n---\n\n## Measured numbers\n\nReal run on a 3-minute 640x360 video (benchmark/jfk-rice.mp4), Mac mini M4, local CPU, frames + dedup only (`--no-transcribe`). Image tokens estimated with Anthropic's `(width x height) / 750` — 307 tokens/frame at 640x360.\n\n| Mode | Frames kept | Wall time | Est. image tokens |\n|------|------------|-----------|-------------------|\n| default (scene-change + 1s floor) | 170 (from 180 extracted) | 23.5 s | ~52k |\n| `--max-frames 80` | 80 | 23.4 s | ~25k |\n| `--adaptive` (catches slow morphs) | 270 | 36.8 s | ~83k |\n\n**Dedup v0.7.16 — small-subject fast action no longer disappears.** A percentage comparator is structurally blind to a subject that covers <1% of the frame (it can never change 8% of the pixels). Found in a user's 2,181-video batch run; fixed with a third \"action channel\". Synthetic repro — static 1280x720 shot, a 40x90 px subject (0.4% of frame) moves fast only in the last 10 of 65 frames:\n\n| | Frames kept | Action frames survived |\n|---|---|---|\n| v0.7.15 | 2 | 1 / 10 |\n| v0.7.16 | 11 | **10 / 10** — full trajectory |\n\n## Why not just sample frames?\n\nMost \"let an LLM watch a video\" scripts (and Gemini's own pipeline) grab frames\nat a **fixed interval** — e.g. one per second. That over-samples a static\nscreencast and under-samples a fast-cut reel. `claude-real-video` is smarter:\n\n| | fixed-interval sampling | **claude-real-video** |\n|---|---|---|\n| Frame selection | every N seconds | **scene-change detection** + density floor |\n| Repeated shots (A-B-A cuts) | sent again every time | **sliding-window dedup** sends each shot once |\n| Static slide (10 min) | ~600 near-identical frames | **collapses to 1** (dedup) |\n| Fast-cut reel | misses frames between samples | catches each visual change |\n| Audio | often ignored | Whisper transcript w/ language detect |\n| Where the processing happens | often in someone's cloud | **on your machine** (you choose what to share with an LLM afterwards) |\n| Input | usually local file only | **URL (yt-dlp) or local file** |\n\nYou feed the model *fewer, more meaningful* frames — cheaper context, better\nunderstanding.\n\n---\n\n## Install\n\n```bash\npip install \"claude-real-video[whisper]\"   # recommended: frames + dedup + audio transcription\npip install claude-real-video              # core only (frames + dedup)\n```\n\npip extras never install themselves — without `[whisper]` there is **no speech-to-text**\n(videos that ship their own subtitles still get a transcript).\n\n### System requirement: ffmpeg\n\n`ffmpeg` / `ffprobe` are used for frame extraction and audio, and aren't\npip-installable. Install them once:\n\n| OS | command |\n|---|---|\n| **macOS** | `brew install ffmpeg` |\n| **Linux** | `sudo apt install ffmpeg` (or your distro's package manager) |\n| **Windows** | `winget install Gyan.FFmpeg` — or `choco install ffmpeg` — or [download a build](https://www.gyan.dev/ffmpeg/builds/) and add its `bin\\` folder to your `PATH` |\n\nVerify it's on your `PATH`:\n\n```bash\nffmpeg -version\n```\n\nTranscription uses the `whisper` CLI (installed by the `[whisper]` extra, or\n`pip install openai-whisper`). Whisper also relies on ffmpeg.\n\n**Faster + hallucination-proof transcripts (recommended):** install the `[fast]`\nextra and crv automatically switches to\n[faster-whisper](https://github.com/SYSTRAN/faster-whisper) — same models, same\noutput files, several times faster, and gated by Silero VAD (voice-activity\ndetection): music-only or silent audio yields an honest \"no speech\" note instead\nof whisper's classic invented caption. No new flags to learn:\n\n```bash\npip install 'claude-real-video[fast]'\n```\n\nIf both are installed, faster-whisper wins; if it ever fails, crv falls back\nto the `whisper` CLI on its own.\n\n**Apple Silicon (M1–M4): GPU transcription.** Install the `[mlx]` extra and crv\nruns Whisper on the Mac's GPU through\n[mlx-whisper](https://github.com/ml-explore/mlx-examples/tree/main/whisper) —\na 21-minute talk that takes ~6 minutes on faster-whisper finishes in about a\nminute on an M4, with the same transcript. The Silero VAD gate still runs\nfirst, so music or silence never turns into invented captions; if the gate or\nmlx cannot run, crv drops back to faster-whisper, then the CLI. Contributed by\n[@blazejp83](https://github.com/blazejp83) (#28).\n\n```bash\npip install 'claude-real-video[mlx]'\n```\n\nWorks on **macOS, Windows, and Linux** — Python 3.10+.\n\n---\n\n## Usage\n\n```bash\n# A YouTube / Instagram / TikTok / ... link\ncrv \"https://www.instagram.com/reel/XXXX/\"\n\n# A local file, English transcript, output to ./out\ncrv lecture.mp4 -o out --lang en\n\n# Frames only, no transcription\ncrv clip.mp4 --no-transcribe\n\n# A login-gated video (your own / authorised use): pass a Netscape cookie file\ncrv \"https://...\" --cookies cookies.txt\n```\n\n`python -m claude_real_video ...` works as an alias for `crv` too.\n\n### Options\n\n| flag | default | meaning |\n|---|---|---|\n| `-o, --out` | `crv-out` | output directory |\n| `--overwrite` | off | replace a previous analysis living in the output directory (without this, a non-empty output dir is refused to avoid mixing videos) |\n| `--scene` | `0.30` | scene-change sensitivity (lower = more frames) |\n| `--fps-floor` | `1.0` | at least one frame every N seconds |\n| `--from` / `--to` | whole file | analyse only part of a video (`90`, `1:30`, `0:01:30.5`). Reported timestamps stay **source** timecodes — a window shifts the analysis, not the clock — and the frame budget plus the transcript follow the window instead of the whole file |\n| `--frame-width` | `640` | width of extracted frames, aspect kept. Raise it when the meaning *is* small text (terminals, spreadsheets, dense dashboards); larger frames multiply output size and model cost |\n| `--max-frames` | auto: `clamp(150, window×1.5, 600)` | hard cap on total frames (explicit value always wins) |\n| `--adaptive` | off | adaptive scene detection: catches slow morphs (2-3s squash/stretch, gradual pans) a fixed threshold misses, by comparing each frame against its rolling neighbourhood |\n| `--text-anchors` | off | force extra frames at subtitle-cue timestamps (sidecar `.srt`/`.vtt` or embedded track) — for videos where meaning changes faster than pixels; at most one forced frame per second |\n| `--speakers` | off | label every transcript line with the speaker (`[SPEAKER_00]` …) via local diarization — needs `pip install \"claude-real-video[speakers]\"`, 45 MB model downloads once |\n| `--lang` | `auto` | Whisper language (`en`, `zh`, `auto`, ...) |\n| `--whisper-model` | `base` | Whisper model for transcription (`tiny`/`base`/`small`/`medium`/`large`/`turbo` — base is fast; **want sharper transcripts? `--whisper-model turbo` is one flag away**: a pruned large-v3 — much faster than `large` with a minor quality trade-off, one-time 1.6GB download, ~6GB memory) |\n| `--dedup-threshold` | `8` | % of pixels that must change for a frame to count as new; higher = fewer frames (the settled-local detector's gate scales with it too) |\n| `--dedup-window` | `4` | compare against the last N kept frames — a shot the model already saw doesn't come back after a cutaway (`1` = consecutive-only) |\n| `--report` | off | keep dropped frames in `./dropped` + write `report.html` visualising every keep/drop decision |\n| `--no-transcribe` | off | skip audio |\n| `--keep-audio` | off | also save the **full soundtrack** (`audio.m4a`) so audio models can *hear* it |\n| `--viewer` | off | also write `viewer.html` — browse the video, keyframes and transcript in one local page (double-click to open) |\n| `--grid` | off | also tile the kept frames into 3x3 contact sheets (`./grids`) — consecutive frames side by side help the model follow motion and progression |\n| `--why` | – | why you're watching, e.g. `--why \"find the pricing strategy\"` — written into `MANIFEST.txt` so the model analyses with that lens instead of a generic summary |\n| `--kb` | – | also save the analysis as a dated markdown note into this folder (your Obsidian vault, notes dir, ...) — so it joins your knowledge base instead of dying in `crv-out` |\n| `--cookies` | – | Netscape cookie file for login-gated sources |\n| `--cookies-from-browser` | – | read login cookies straight from your own browser — `chrome`, `safari`, `firefox` or `edge` (your own account only) |\n\n---\n\n### What `--grid` output looks like\n\nOne contact sheet = nine consecutive keyframes, in order, filenames on each cell — the model reads a sequence, not scattered stills:\n\n![contact sheet example](https://raw.githubusercontent.com/HUANGCHIHHUNGLeo/claude-real-video/master/docs/grid_example.jpg)\n\n\n## Memory — ask across everything you've watched\n\nEvery analysis is indexed locally (transcript lines + on-screen text, with timestamps),\nso a question can span your whole library instead of one output folder:\n\n```bash\ncrv-ask \"pricing strategy\"   # → which video, which second, the exact line\ncrv-ask 定價                  # CJK works — trigram FTS with a substring fallback\ncrv-ask --list               # everything you've watched, newest first\ncrv-ask --stats              # where the index lives, how big it is\ncrv-ask --prune 200          # keep the newest 200 videos, reclaim the space\n```\n\nRe-running the same source with the same options doesn't re-process — crv says\n\"already watched\" and points at the existing analysis (0.04s vs several seconds\nmeasured). Different options, or `--overwrite`, re-analyse as usual.\n\nEverything stays local: one SQLite file at `~/.crv/memory.db` (override with\n`CRV_MEMORY_DB`), user-only permissions, no embeddings, no network. The first time\nanything is indexed, crv prints one line saying so. Don't want it at all?\n`CRV_NO_MEMORY=1`.\n\n## MCP server (Claude Desktop / Cursor / any MCP client)\n\ncrv also ships as an MCP server, so MCP clients can ask for a video to be\nwatched directly — same local pipeline, zero cloud. Five tools: `watch_video`,\n`get_frames`, `search_memory` (ask across every watched video), `list_watched`\n(check before re-watching), and `get_transcript` (words only — no frames, so a\nlong talk doesn't cost image tokens).\n\n```bash\npip install 'claude-real-video[mcp]'\n```\n\nClaude Code:\n\n```bash\nclaude mcp add crv -- crv-mcp\n```\n\nClaude Desktop — add to `claude_desktop_config.json`:\n\n```json\n{ \"mcpServers\": { \"crv\": { \"command\": \"crv-mcp\" } } }\n```\n\nTools: `watch_video(source, max_frames, language, transcribe)` returns the\ntimestamped transcript plus the first batch of keyframes as images;\n`get_frames(source, start_index, count)` pages through the rest. Analyses are\ncached under `~/.cache/crv-mcp`, so follow-up questions about the same video\nare instant.\n\nmcp-name: io.github.HUANGCHIHHUNGLeo/claude-real-video\n\nVerified end-to-end on Claude Code (the model described a test video's frames\ncorrectly through the tool). Claude Desktop and Cursor speak the same MCP\nstdio protocol — config above; open an issue if anything misbehaves.\n\n## Use it from Python\n\n```python\nfrom claude_real_video import process\n\nr = process(\"https://youtu.be/...\", \"out\", lang=\"en\")\nprint(r.frame_count, r.transcript_path)\n```\n\n---\n\n## How it works\n\n1. **Fetch** — `yt-dlp` for URLs (optional cookies), or copy a local file.\n2. **Extract** — one chronological `ffmpeg select` pass grabs every scene change\n   *plus* a density floor (at least one frame every `--fps-floor` seconds), so\n   fast cuts and slow screencasts are both covered.\n3. **Dedup** — three channels against a **sliding window** of the last\n   `--dedup-window` kept frames, so an A-B-A cutaway doesn't re-send a shot the\n   model has already seen. A *global* channel measures real pixel difference\n   (downscaled RGB, not a perceptual hash — hashes go blind on flat colours and\n   equal-luma hue changes); `--dedup-threshold` is the % of it that must change.\n   A *settled-local* channel (v0.7.4) catches what the global one can't see:\n   thin pen strokes, caption/text-card swaps and small UI updates that average\n   out to ~0% globally. It looks, on a finer signature, for a region that\n   differs strongly from every recent kept frame (with 1px shift tolerance, so\n   film grain and frame jitter don't trigger) *and* is no longer changing — a\n   settled new state, not motion mid-flight — with a cooldown so continuous\n   motion that pauses every second (a waving flag, drifting smoke) can't keep\n   re-firing. The final frame is evaluated even if still in motion (so a video's closing state is never lost), but it must clear both contrast gates like any other frame. `--report` writes `report.html` showing every keep/drop decision\n   with its diff % (settled-local keeps are labelled), for tuning.\n4. **Text** — if the video **already has subtitles** (a sidecar `.srt`/`.vtt` next to a\n   local file, or an embedded subtitle track), those are used as the transcript —\n   faster and more accurate than re-transcribing. Only when there are no subtitles\n   does it fall back to **Whisper** on the audio (skipped cleanly if there's no audio).\n5. **Audio** *(optional, `--keep-audio`)* — save the **full original soundtrack**\n   (`audio.m4a`: music + speech + effects, copied losslessly when possible). The\n   transcript only has the *words*; the audio file lets a model that can listen\n   (Gemini, GPT-4o, …) actually *hear* the music and tone.\n6. **Timestamps** — every kept frame's source-video time survives the whole\n   pipeline (extraction → dedup → `--max-frames` thinning → renaming) and is\n   written to `frames.json` (`file` / `timestamp_sec` / `timestamp` /\n   `selection_reason`). Cite visual evidence as `frame_012 @ 00:03:41`, align\n   frames with `transcript.json` segments, or feed the map to a video-RAG\n   pipeline. In `viewer.html`, click any keyframe → \"play video from here\".\n7. **Manifest** — `MANIFEST.txt` summarises everything for the model.\n\nSo the model can **see** (key frames), **read** (transcript) and — with `--keep-audio` —\n**hear** (full soundtrack) the video. The transcript is plain text any model can read;\nthe tool **doesn't burn subtitles into the video** — burning is a presentation choice,\nnot something needed to make a video AI-readable.\n\n---\n\n## Notes\n\n- Only download content you have the right to. The `--cookies` option is for\n  your own, authorised access — don't ship credentials in a repo.\n- Use one output folder per video. Re-running into a folder that already holds\n  an analysis is refused (so two videos never mix); pass `--overwrite` to replace it.\n\n## crv Pro — understand *how* a video was shot\n\nThe free tool gives your AI keyframes and a transcript — enough to know **what** a video is about. **crv Pro adds everything else: how it's shot, how it's cut, how it's spoken, what it feels like.** All computed on your machine, written as plain text any LLM can read.\n\n- **Camera & pacing (`--motion`)** — every shot auto-labelled: static, pan, tilt, zoom, handheld. Full shot table: per-shot duration, cuts per minute, pacing across open/middle/close. High-motion shots get 0.2s-apart burst frames.\n- **Sound & emotion (`--senses`)** — voice emotion, tone curves and audio events (laughter, SFX, ambience) timestamped segment by segment. Vocals and music auto-separated: emotion reads the clean voice, music gets its own BPM + energy track. No-dialogue footage (MVs, film) falls back to reading mood from color and light.\n- **Interactive viewer (`--viewer`)** — one self-contained web page per analysis: the video, a clickable event timeline that jumps to the second, a transcript that highlights along with playback. EN / 繁中 / 简中.\n- **Two reports, one flag (`--ai-report`)** — with your own API key: one report on how it's shot, one on what it says.\n- **Breakdown report (`--breakdown`)** — hook analysis, pacing curve, camera language, and a rubric your own LLM completes into a full teardown.\n- **Memory across your library (`crv-pro-ask`)** — search everything Pro has watched by what the camera and the voice did: `--camera zoom` (every zoom you've ever watched), `--track emotion --label angry`, `--rhythm` (cuts/min ranked). The free `crv-ask` searches words; these search measurements the free edition never takes.\n\nOne-time price **$29**:\n\n- **Buy on Capafy** (instant download, license key included): https://capafy.ai/agent/llm-real-video-pro-let-any-llm-watch-videos/5451082151\n- **Buy with credit card** (Lemon Squeezy checkout, instant download): https://leoaido.lemonsqueezy.com/checkout/buy/ff552000-adc0-49f1-8eec-5e8ada1905a1\n- Product page & demo: https://leoaido.com/crv-pro/\n\n---\n\n**Following the build?** I'm documenting the road from open-source tool to first paying customer, in public — [@LeoAidoAI on X](https://x.com/LeoAidoAI).\n\n## FAQ\n\n### What is the best tool to let an LLM watch or analyze a video?\n\nIt depends on what \"watch\" means for you. If you just want one answer about one clip and don't mind uploading it, a hosted multimodal model (e.g. Gemini) is the shortest path. If you want **any** LLM — Claude, GPT, Gemini or a local model — to analyze video **reproducibly and locally**, you want a preprocessing pipeline: scene-aware keyframes + a timestamped transcript, handed to the model as evidence it can cite. That pipeline is exactly what `claude-real-video` does, in one command, with nothing leaving your machine. Uniform frame sampling (1 fps) either misses cuts or floods the context window; scene-aware extraction keeps the frames that carry information.\n\n### How can I make Claude understand a video?\n\nClaude cannot ingest video files directly. The working approach:\n\n```bash\npip install \"claude-real-video[fast]\"\nnpx skills add HUANGCHIHHUNGLeo/claude-real-video   # or install via the Claude Code plugin marketplace\n```\n\nThen in Claude Code: `Analyze this video: /path/to/video.mp4`. The skill extracts scene-aware keyframes, a timestamped transcript (`transcript.json`), a frame→timestamp map (`frames.json`) and a `MANIFEST.txt` that tells the model how to read the folder — so Claude can cite `frame_012 @ 00:03:41` instead of guessing.\n\n### What is claude-real-video?\n\nAn MIT-licensed Python CLI (`crv`) that turns a video into what an LLM can actually read: scene-aware keyframes (with real source timestamps that survive dedup and renaming), sliding-window deduplication so small-subject motion isn't thrown away, and local Whisper transcription with optional speaker labels. Works with YouTube URLs or local files, runs 100% locally. It exists because subtitles alone are not watching — models that only read the transcript hallucinate everything visual.\n\n## Who makes this\n\nBuilt by Leo Huang — a one-person company running on AI.\nI post what actually breaks and what works while building tools like this:\nhttps://x.com/LeoAidoAI\n\n## License\n\nMIT\n",
  "bytes": 26210,
  "sha": "03ebd6adbaf8bcd3b1bb228a936d0e3e285251c632989583f5ea4b90b95c0a90",
  "repo_slug": "huangchihhungleo/claude-real-video",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_huangchihhungleo_claude_real_v_0bb1ba2f/readme"
}