| name | media-compress |
| description | Compress and convert images and videos using ffmpeg. Use when the user wants to reduce file size, change format, resize, or optimize media files. Handles common formats like JPG, PNG, WebP, MP4, MOV, WebM. Triggers on phrases like "compress image", "compress video", "reduce file size", "convert to webp/mp4", "resize image", "make image smaller", "batch compress", "optimize media". |
Media Compression Skill
Compress and convert images and videos with intelligent defaults. Supports single files and batch processing.
Supported Formats
Images: JPG, PNG, WebP, BMP, TIFF, GIF → JPG, PNG, WebP
Videos: MP4, MOV, AVI, MKV, WebM, FLV, WMV, M4V → MP4
Prerequisites
ffmpeg must be installed:
Verify installation: ffmpeg -version
Quick Start
Image Compression
python scripts/compress_image.py photo.jpg --max-size 200kb
python scripts/compress_image.py photo.png --width 800 --output photo_small.jpg
python scripts/compress_image.py photo.jpg --format webp
python scripts/compress_image.py ./photos --output ./compressed --quality 80
python scripts/compress_image.py photo.jpg --max-size 500kb --preview
python scripts/compress_image.py photo.jpg --max-size 500kb --backup
Video Compression
python scripts/compress_video.py video.mp4 --output video_small.mp4
python scripts/compress_video.py video.mp4 --height 720
python scripts/compress_video.py video.mp4 --target-size 50mb
python scripts/compress_video.py video.mp4 --crf 28
python scripts/compress_video.py ./videos --output ./compressed --height 480
python scripts/compress_video.py video.mp4 --height 720 --preview
python scripts/compress_video.py video.mp4 --height 720 --backup
Common Use Cases
1. Upload to Website (Image)
Most websites need images under 500KB:
python scripts/compress_image.py photo.jpg --max-size 500kb --format webp
2. Email Attachment (Image)
Email often has 25MB limit:
python scripts/compress_image.py scan.pdf.jpg --max-size 5mb --quality 90
3. Social Media Video
Platforms prefer 720p, smaller files:
python scripts/compress_video.py clip.mov --height 720 --crf 23 --preset fast
4. Archive Old Videos
Maximum compression for storage:
python scripts/compress_video.py old_video.avi --crf 28 --preset slow --height 480
5. Convert Format Only
Keep quality, just change format:
python scripts/compress_image.py image.png --format jpg --quality 95
python scripts/compress_video.py video.mov --output video.mp4 --crf 18
Parameters Reference
Image (compress_image.py)
| Parameter | Description | Default |
|---|
input | Input file or directory (required) | - |
--output, -o | Output file or directory | Auto-generated |
--max-size | Target max file size (e.g., 500kb, 2mb) | None |
--quality, -q | JPEG/WebP quality (1-100) | 85 |
--width, -w | Max width in pixels | Original |
--height | Max height in pixels | Original |
--format, -f | Output format: jpg, png, webp | Original format |
--no-strip | Keep metadata (default: remove) | False |
--preview, -p | Preview mode: show settings without compressing | False |
--backup, -b | Keep backup of original file | False |
Video (compress_video.py)
| Parameter | Description | Default |
|---|
input | Input file or directory (required) | - |
--output, -o | Output file or directory | Auto-generated |
--crf | Quality 0-51 (lower=better). 18=visually lossless, 23=default, 28=smaller | 23 |
--preset | Encoding speed: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow | medium |
--height | Max height (480, 720, 1080) | Original |
--target-size | Approximate target size (e.g., 50mb, 1gb) | None |
--fps | Limit frame rate (e.g., 30, 24) | Original |
--audio-bitrate | Audio quality (e.g., 128k, 192k) | 128k |
--preview, -p | Preview mode: show settings without compressing | False |
--backup, -b | Keep backup of original file | False |
Quality Guidelines
Images
- 90-95: High quality, minimal compression artifacts
- 85: Sweet spot (default) - good quality, significant size reduction
- 70-80: Acceptable for web, smaller files
- 50-60: Low quality, visible artifacts
Videos (CRF)
- 17-18: Visually lossless, archival quality
- 20-22: High quality, professional use
- 23: Default, good balance (recommended)
- 28: Smaller files, acceptable quality
- 35+: Low quality, preview/draft only
Presets
- ultrafast: Fastest encoding, largest files
- fast: Quick results, slightly larger
- medium: Default balance
- slow: Better compression, smaller files
- veryslow: Maximum compression, smallest files
Batch Processing
When input is a directory:
- All supported files are processed
- Output directory structure mirrors input
- Progress shown for each file
- Original and compressed sizes displayed
Example:
$ python scripts/compress_image.py ./vacation_photos --output ./compressed --max-size 500kb
找到 24 个图像文件
[1/24] 处理: IMG_001.jpg
✓ 2847.3KB → 456.2KB (84.0% 减少)
[2/24] 处理: IMG_002.png
✓ 1532.1KB → 298.5KB (80.5% 减少)
...
Troubleshooting
"ffmpeg not found"
Install ffmpeg first:
sudo apt update && sudo apt install ffmpeg
brew install ffmpeg
"Permission denied"
Make scripts executable:
chmod +x scripts/*.py
Quality too low
Increase quality setting:
python scripts/compress_image.py photo.jpg --quality 90
python scripts/compress_video.py video.mp4 --crf 20
File not smaller
- Try lower quality or smaller dimensions
- Some files are already optimally compressed
- Use
--max-size to force target size
Batch processing stops
Check that all files in directory are valid images/videos. Corrupt files may cause errors.
Advanced Tips
- Strip metadata for privacy (default behavior)
- Use WebP for best web compression
- 720p height is usually enough for mobile viewing
- CRF 23 + preset slow gives great results for archiving
- Test with one file before batch processing
References