video-audio
Audio processing for video files using FFmpeg. Loudness normalization to streaming standards (LUFS), noise reduction, audio…
Video analysis and inspection using FFprobe and FFmpeg. Reads metadata, codec info, resolution, bitrate, duration, HDR status, keyframe structure, audio loudness, scene boundaries, and quality metrics (VMAF, SSIM, PSNR). Use when user says "analyze", "inspect", "info",
$ npx -y skills add AgriciDaniel/claude-video --skill video-analyze --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/video-analyzeContext preview
The summary Claude sees to decide when to auto-load this skill.
Video analysis and inspection using FFprobe and FFmpeg. Reads metadata, codec info, resolution, bitrate, duration, HDR status, keyframe structure, audio loudness, scene boundaries, and quality metrics (VMAF, SSIM, PSNR). Use when user says "analyze", "inspect", "info",
name: claude-video-analyze description: > Video analysis and inspection using FFprobe and FFmpeg. Reads metadata, codec info, resolution, bitrate, duration, HDR status, keyframe structure, audio loudness, scene boundaries, and quality metrics (VMAF, SSIM, PSNR). Use when user says "analyze", "inspect", "info", "metadata", "quality", "VMAF", "SSIM", "PSNR", "scene detect", "keyframes", "HDR", "bitrate", "ffprobe", or "what codec". allowed-tools: - Bash - Read
All analysis operations are **read-only** and safe to auto-execute without confirmation.
**Full metadata dump** (resolution, codec, duration, bitrate, audio, chapters):
ffprobe -v error -print_format json -show_format -show_streams -show_chapters "$INPUT"
**One-liner summary** (human-readable):
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height,r_frame_rate,bit_rate,pix_fmt \ -show_entries format=duration,size,bit_rate,format_name -of default "$INPUT"
**Resolution**:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$INPUT"
**Duration** (seconds):
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 "$INPUT"
**Codec**:
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$INPUT"
**Framerate**:
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=nw=1:nk=1 "$INPUT"
**Bitrate** (video stream):
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=nw=1:nk=1 "$INPUT"
**Pixel format**:
ffprobe -v error -select_streams v:0 -show_entries stream=pix_fmt -of default=nw=1:nk=1 "$INPUT"
**Audio info**:
ffprobe -v error -select_streams a -show_entries stream=codec_name,channels,sample_rate,bit_rate -of json "$INPUT"
ffprobe -v quiet -select_streams v:0 -show_entries stream=color_transfer,color_primaries,color_space \ -of default=nw=1 "$INPUT"
| color_transfer | Meaning | |---------------|---------| | smpte2084 | HDR10 / Dolby Vision | | arib-std-b67 | HLG | | bt709 | SDR | | Unknown/empty | Likely SDR |
**List all keyframe timestamps**:
ffprobe -v error -select_streams v:0 -skip_frame nokey \ -show_entries frame=pkt_pts_time -of csv=p=0 "$INPUT"
**Count keyframes**:
ffprobe -v error -select_streams v:0 -skip_frame nokey \ -show_entries frame=pkt_pts_time -of csv=p=0 "$INPUT" | wc -l
**GOP structure** (I/P/B frame distribution):
ffprobe -v error -select_streams v:0 -show_entries frame=pict_type -of csv=p=0 "$INPUT" | \ sort | uniq -c | sort -rn
**FFmpeg native** (fast, basic):
ffmpeg -i "$INPUT" -vf "scdet=s=1:t=14" -f null - 2>&1 | grep "lavfi.scd.time"
**PySceneDetect** (professional-grade, 5 algorithms):
# Adaptive detection (recommended for most content) scenedetect -i "$INPUT" detect-adaptive -t 3.0 list-scenes # Content-aware detection scenedetect -i "$INPUT" detect-content -t 27.0 list-scenes # Save scene images and split video scenedetect -i "$INPUT" detect-adaptive -t 3.0 save-images split-video list-scenes
ffmpeg -i "$INPUT" -af loudnorm=I=-14:TP=-1.5:LRA=11:print_format=json -f null - 2>&1 | tail -12
Returns: `input_i` (integrated loudness), `input_tp` (true peak), `input_lra` (loudness range).
Compares distorted (encoded) vs reference (original):
ffmpeg -i distorted.mp4 -i reference.mp4 \ -lavfi "libvmaf=model=version=vmaf_v0.6.1:log_fmt=json:log_path=vmaf_results.json" -f null -
| VMAF Score | Quality | |-----------|---------| | 93-100 | Excellent (indistinguishable from source) | | 80-93 | Good (minor artifacts visible on close inspection) | | 60-80 | Fair (noticeable quality loss) | | <60 | Poor |
# All three metrics at once ffmpeg -i distorted.mp4 -i reference.mp4 \ -lavfi "libvmaf=feature=name=psnr:feature=name=float_ssim:log_fmt=json:log_path=quality.json" -f null -
| Metric | Good | Excellent | |--------|------|-----------| | PSNR | >30 dB | >40 dB | | SSIM | >0.95 | >0.98 |
Encode at multiple CRF values, measure VMAF for each, find the quality-size sweet spot:
for CRF in 18 20 22 24 26 28 30; do
ffmpeg -y -i "$INPUT" -c:v libx264 -crf $CRF -preset medium "/tmp/crf_test_${CRF}.mp4"
SIZE=$(stat -c%s "/tmp/crf_test_${CRF}.mp4")
VMAF=$(ffmpeg -i "/tmp/crf_test_${CRF}.mp4" -i "$INPUT" \
-lavfi "libvmaf=log_fmt=json:log_path=/tmp/vmaf_${CRF}.json" -f null - 2>&1 | \
grep -oP 'VMAF score: \K[\d.]+')
echo "CRF $CRF: ${SIZE} bytes, VMAF: $VMAF"
rm -f "/tmp/crf_test_${CRF}.mp4" "/tmp/vmaf_${CRF}.json"
done**Average bitrate**:
ffprobe -v error -show_entries format=bit_rate -of default=nw=1:nk=1 "$INPUT" | awk '{printf "%.1f Mbps\n", $1/1000000}'**Per-frame bitrate** (for variable bitrate analysis):
ffprobe -v error -select_streams v:0 -show_entries packet=size,pts_time -of csv=p=0 "$INPUT" | head -100
ffprobe -v error -print_format json -show_chapters "$INPUT"
For a full video report, run all of the above and format the output. Key sections: 1. File info (name, size, container format) 2. Video stream (codec, resolution, framerate, bitrate, pixel format, HDR status) 3. Audio stream(s) (codec, channels, sample rate, bitrate, loudness) 4. Chapters (if present) 5. Keyframe structure (GOP length, keyframe interval) 6. Recommendations (codec efficiency, loudness compliance, compatibility issues)
Load `references/analyze.
AI-powered video production suite for Claude Code. Edit, transcode, caption, analyze, generate, and create promo videos: all from your terminal.
Audio processing for video files using FFmpeg. Loudness normalization to streaming standards (LUFS), noise reduction, audio…
Speech-to-text transcription and animated subtitle generation using Whisper and FFmpeg. Creates word-by-word animated captions…
Programmatic video creation using Remotion (React-based). Generates title cards, data visualizations, motion graphics, branded…
Video downloading via yt-dlp with format selection, quality control, subtitle download, audio-only extraction, and playlist…
Video editing operations using FFmpeg: trimming, cutting, splitting, concatenation, speed changes, cropping, scaling, rotation,…
AI-powered audio enhancement for video using Demucs v4 (source separation, isolate vocals/drums/bass/other, 7GB VRAM),…