Claude video analysis with local preprocessing

Document type
Field manual
Updated
Reading time
11 min

claude-real-video setup, scene-aware keyframes, deduplication and Whisper transcripts. Review CLI flags, HN feedback and Claude Code skill integration.

SourceOpen original report
Document details
huangchihhungleo/claude-real-video

claude-real-video is an open-source Python CLI that extracts scene-change keyframes instead of fixed-interval samples, uses a sliding window for pixel-level deduplication and transcribes speech. Everything runs locally and produces a folder any LLM can read. It reached the Hacker News front page three days after launch and supports Claude Code skill integration; this manual covers installation, flags, HN objections and a complete analysis workflow.

GitHub Stars
923
Frames retained in the demo clip
26/58
--grid image compression factor
9x
License
MIT

01Tool overview

Preprocessing tools for LLM video analysis

Most AI tools do not directly analyze video images; when you paste a YouTube link into ChatGPT, it reads the transcript, not the images. Claude does not accept video files. Even Gemini, which supports video natively, requires uploading the whole video to Google's servers and samples at a fixed 1fps; it still misses fast cuts.

claude-real-video (CLI command crv) runs entirely locally. Given a URL or local file, it extracts images at scene changes instead of fixed intervals, removes frames with almost unchanged pixels and transcribes the audio track. It packages the results into a folder any LLM can read: keyframe JPGs, a transcript and a MANIFEST.txt summary.

At launch on Hacker News, the author said: "I was frustrated that no LLM actually 'sees' a video: Claude does not accept video files, ChatGPT reads only transcripts, and Gemini samples at a fixed 1fps." The tool itself only extracts and deduplicates frames locally. You decide whether to send the frames to an LLM and which model to use.

  1. Fetch

  2. Extract

  3. Dedup

  4. Text

  5. Audio

  6. Manifest

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.

— claude-real-video README, measured comparison of the same demo clip

02Installation

Python package and ffmpeg installation

The core package is pure Python and installs with pip. Speech transcription requires the [whisper] extra, while ffmpeg / ffprobe must be installed separately with the system package manager because pip cannot install them. Python 3.10 or later is required, and macOS, Windows and Linux are supported.

bash
# Keyframes + deduplication only, without speech transcription
pip install claude-real-video

# Add Whisper speech transcription
pip install "claude-real-video[whisper]"
Operating systemffmpeg installation command
macOSbrew install ffmpeg
Linuxsudo apt install ffmpeg (or your distribution's package manager)
Windowswinget install Gyan.FFmpeg, choco install ffmpeg, or download from gyan.dev and add bin\ to PATH

Claude Code skill installation

If you use Claude Code, install it as a skill. When you paste a video link into a conversation, Claude decides whether to call crv to extract and analyze frames, without a manual command.

bash
pip install claude-real-video
mkdir -p ~/.claude/skills && cp -r skills/claude-real-video ~/.claude/skills/

03Flag reference

Flags for six processing stages

crv flags correspond to Fetch → Extract → Dedup → Text → Audio → Manifest. The table groups flags by stage. You can run crv <url> without installing [whisper] or adding flags; in most cases, you only need --grid and --why.

Fetch · 01

<url-or-path>

Video source

YouTube, Instagram and TikTok links go through yt-dlp; local file paths are copied directly for processing.

Fetch · 02

--cookies

Authenticated content access

Pass a Netscape-format cookie file to read login-restricted videos you are authorized to access.

Fetch · 03

--cookies-from-browser

Browser login state

Read an existing chrome / safari / firefox / edge login session without manually exporting cookies.

Extract · 04

--scene

Scene sensitivity

The default is 0.30. Lower values loosen the scene-change threshold and retain more frames.

Extract · 05

--fps-floor

Sampling floor

By default, keep at least one frame every 1 second so slow text or chart changes in static scenes are not skipped entirely.

Extract · 06

--max-frames

Frame count cap

The default is 150. Limit long-video output to avoid producing thousands of images that exceed the LLM context.

Dedup · 07

--dedup-threshold

Deduplication threshold

The default is 8%. Frames with pixel changes below this percentage are discarded as duplicates; higher values retain fewer frames.

Dedup · 08

--dedup-window

Comparison window

By default, compare the previous 4 retained frames. An A-B-A interview cut does not send the same shot again.

Dedup · 09

--grid

3×3 contact sheets

Pack consecutive keyframes into grids so the model reads images in sequence, with fewer separate images and roughly 9 times fewer image inputs.

Text · 10

--lang / --whisper-model

Speech transcription

Prefer existing subtitles; run Whisper only when none exist. Models from tiny to large trade speed for accuracy.

Text · 11

--no-transcribe

Skip transcription

Disable transcription when only images are needed, saving Whisper processing time.

Audio · 12

--keep-audio

Full audio track

Save audio.m4a so models that accept audio, such as GPT-4o and Gemini, can use music and vocal tone; a transcript contains text only.

Manifest · 13

--why

Analysis focus

Write the viewing purpose into MANIFEST.txt to direct the analysis toward a specific observation instead of a general summary.

Manifest · 14

--kb

Knowledge base storage

Save analysis as dated Markdown in your notes folder, where it is not overwritten with crv-out.

Manifest · 15

--viewer

Local viewer

Generate viewer.html with the video, keyframe grid and transcript together. Double-click to open it without a network connection or extra installation.

Manifest · 16

--report

Decision visualization

Keep discarded frames in dropped/ and generate report.html showing the percentage difference behind each keep/discard decision for parameter tuning.

Video types and flag combinations

Video typeSuggested flagsReason
YouTube tutorial / talk (mostly speech)--lang en --gridImages change little; --grid further reduces frame inputs
Short videos / Reels / TikTok (fast cuts)--dedup-window 6 --gridFast cuts often return to a shot; a larger comparison window avoids sending it twice
Image analysis without transcripts--no-transcribe --reportSave Whisper processing time and inspect each frame decision
Your own login-restricted content--cookies-from-browser chromeRead the local browser login state without manually exporting cookies

04User discussion · Hacker News

Four technical discussions within three days of launch

Author cortexosmain posted on Hacker News. The same thread (#48766005) contains both support and objections. The author responded to the following four discussions.

Claude in the name, with no vendor affiliation

zitterbewegung and walrus01 suggested removing "Claude" from the name because the tool is a general-purpose video preprocessor. The author replied: "Took this — pip install llm-real-video works now, same tool. Kept the original repo name so existing links don't break."

Source · HN #48766005 · zitterbewegung, walrus01, cortexosmain

Local processing ends at frame extraction

bonoboTP said the wording "stays on your machine" can mislead. Once frames are pasted into Claude, they go to Anthropic. The tool processes locally, but the user decides whether to send results to an LLM; it cannot guarantee confidentiality afterward.

Source · HN #48766005 · bonoboTP

Differences between keyframes and video

octember said: "keyframes are not videos. Motion, object permanence, are not things Claude can infer from a set of images." An ordered set of still images can replace a transcript plus visual summary, but cannot establish the physical continuity of motion.

Source · HN #48766005 · octember

Model choice and cost

fzysingularity described frame-by-frame viewing with Claude as "terribly expensive", using far more tokens than video-native Gemini or local VLMs. The author replied that the tool preprocesses video for models without native video input: Claude, ChatGPT web and local models. Gemini already accepts video natively at 1fps and does not need this conversion.

Source · HN #48766005 · fzysingularity, cortexosmain

05Usage example

Claude Code skill example

Paste a YouTube product-launch link into Claude Code to identify its pricing strategy. After installing skills/claude-real-video, Claude decides to call crv without a manual command.

~/projects/research · claude code · claude-real-video v0.5.2


$ You ›
  https://youtu.be/XXXXXXXXXXX Find their pricing strategy in this launch event,
  and save the results to my notes folder.


# [matched skill: claude-real-video · Video link detected]
# [loaded ~/.claude/skills/claude-real-video/SKILL.md]


claude: Claude ›
  I cannot read the video file directly. I'll use crv to convert it to keyframes + a transcript first.


> crv "https://youtu.be/XXXXXXXXXXX" -o crv-out --grid \
      > --why "find the pricing strategy" --kb ~/notes


# [Fetch]    yt-dlp downloading · 480p is enough to analyze the visuals
# [Extract]  Scene detection + fps-floor=1.0 · Captured 71 candidate frames
# [Dedup]    threshold=8% window=4 · 71 → 24 frames
# [Text]     No embedded captions · Run Whisper base instead · lang=auto → en
# [Manifest] MANIFEST.txt includes the --why focus · crv-out/grids/ 3 three-by-three contact sheets


ok: crv-out/frames/*.jpg  +  transcript.txt  +  MANIFEST.txt
ok: ~/notes/2026-07-06-pricing-strategy.md written


$ You › (Claude reads MANIFEST.txt and grids/)


# [Read MANIFEST.txt: transcript + per-frame timestamps]
# [Read crv-out/grids/grid_02.jpg: 3×3 contact sheet]


claude: Claude ›
  Found it. At 08:42, the slide changes to a pricing comparison table,
  and the transcript mentions "three subscription tiers, a twenty-percent discount for annual billing".
  At 11:15, another table shows add-on plans; the transcript does not cover the details,
  so I recommend checking the close-up in crv-out/frames/frame_0114.jpg directly.


ok: Saved to ~/notes/2026-07-06-pricing-strategy.md with two timestamped screenshot references.

        

This tool is for everything that can't [ingest video natively] — Claude, ChatGPT web, local models — it turns the video into frames + transcript on your machine so any of them can read it.

— cortexosmain,Hacker News #48766005

Purposes of the three flags

Claude cannot read video files itself. --why sets the focus to "find the pricing strategy" when reading MANIFEST.txt; --grid provides contact sheets in sequence instead of separate images; --kb moves the result out of crv-out and into your notes. The three flags separately determine what to analyze, how to view it and where to store the result.

06Boundaries and limitations

Video analysis limitations

07Next steps

Python API and batch processing

crv is a standalone command and an importable Python package. Single-video analysis can extend to batch processing, your own knowledge base and general uses without an LLM.

Advanced uses

1. Tune parameters visually with --report. When choosing --scene and --dedup-threshold, add --report to generate report.html. Compare the percentage difference in each decision, then adjust parameters.

2. Call from Python. Use from claude_real_video import process instead of the CLI to obtain objects such as frame_count and transcript_path for batch scripts or data pipelines.

3. Install a persistent Claude Code skill. Copy skills/claude-real-video into ~/.claude/skills/. When you paste video links afterward, Claude decides whether to call crv without a manual command each time.

4. Use --keep-audio with audio-capable models. Transcripts omit tone, music and ambient sound. For downstream models accepting audio, such as GPT-4o or Gemini, add this flag to send the full audio track.

5. Consider the paid version for filming-technique analysis. The free version covers frames, transcripts and manifests. Camera-movement classification, editing rhythm and audio-emotion timelines belong to the separate paid crv Pro, outside this open-source CLI.

Three further readings

① README.md: Complete flag reference, the technical comparison "Why not fixed-interval sampling" and Python API examples. ② skills/claude-real-video/SKILL.md: Full Claude Code skill integration steps. ③ Hacker News #48766005: Launch discussion, including naming, privacy wording and cost objections, with the author's individual replies.

Hi HN! I built this because I was frustrated that no LLM actually "sees" a video — Claude won't accept video files, ChatGPT reads the transcript only, and Gemini samples at a fixed 1fps (missing fast cuts, over-sampling static slides).

— cortexosmain, claude-real-video author, Hacker News launch post