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.
Fetch
Extract
Dedup
Text
Audio
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.
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.
# Keyframes + deduplication only, without speech transcription
pip install claude-real-video
# Add Whisper speech transcription
pip install "claude-real-video[whisper]"| Operating system | ffmpeg installation command |
|---|---|
| macOS | brew install ffmpeg |
| Linux | sudo apt install ffmpeg (or your distribution's package manager) |
| Windows | winget 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.
pip install claude-real-video
mkdir -p ~/.claude/skills && cp -r skills/claude-real-video ~/.claude/skills/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 type | Suggested flags | Reason |
|---|---|---|
| YouTube tutorial / talk (mostly speech) | --lang en --grid | Images change little; --grid further reduces frame inputs |
| Short videos / Reels / TikTok (fast cuts) | --dedup-window 6 --grid | Fast cuts often return to a shot; a larger comparison window avoids sending it twice |
| Image analysis without transcripts | --no-transcribe --report | Save Whisper processing time and inspect each frame decision |
| Your own login-restricted content | --cookies-from-browser chrome | Read the local browser login state without manually exporting cookies |
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
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.
$ You ›
https://youtu.be/XXXXXXXXXXX Find their pricing strategy in this launch event,
and save the results to my notes folder.
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
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/)
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.
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.
Video analysis limitations
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).