Concatenate video clips from one or more directories into a single sequential montage using ffmpeg. Supports hard cut, crossfade, and fade-to-black transitions. Videos only (images skipped). Use when combining multiple video clips into a single output file.
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Concatenate video clips into a single montage with configurable transitions.
# Windows (winget)
winget install Gyan.FFmpeg
# Windows (choco)
choco install ffmpeg
# Verify
ffmpeg -version
ffprobe -version# Simple hard cut montage from one directory
python scripts/montage_maker.py ./clips
# Combine clips from multiple directories with crossfade
python scripts/montage_maker.py ./intro ./main ./outro -t crossfade -d 1.0
# Fade-to-black between clips, custom output path
python scripts/montage_maker.py ./clips -t fade-to-black -d 0.5 -o final_montage.mp4
# Sort by modification date, force 1920x1080
python scripts/montage_maker.py ./clips --sort modified -r 1920x1080
# Random order montage
python scripts/montage_maker.py ./clips --sort random -o shuffled.mp4
# Preview ffmpeg command without executing
python scripts/montage_maker.py ./clips -t crossfade --dry-run
# JSON output for pipeline integration
python scripts/montage_maker.py ./clips -jHuman-readable:
Montage Maker
=============
Scanning 1 directory...
Found 4 video clips
Clips:
1. intro.mp4 (5.2s, 1920x1080)
2. scene1.mp4 (12.4s, 1920x1080)
3. scene2.mp4 (8.7s, 1920x1080)
4. outro.mp4 (3.1s, 1920x1080)
Transition: crossfade (1.0s)
Target resolution: 1920x1080
Output: ./montage.mp4
Building montage... done (14.3s)
Output: montage.mp4 (26.4s, 15.2 MB)JSON:
{
"status": "success",
"output": "montage.mp4",
"clip_count": 4,
"duration": 26.4,
"file_size": 15938470,
"transition": "crossfade",
"transition_duration": 1.0,
"resolution": "1920x1080",
"clips": [
{"path": "clips/intro.mp4", "duration": 5.2},
{"path": "clips/scene1.mp4", "duration": 12.4},
{"path": "clips/scene2.mp4", "duration": 8.7},
{"path": "clips/outro.mp4", "duration": 3.1}
]
}| Format | Extensions | Notes |
|---|---|---|
| MP4 | .mp4, .m4v | Most common, recommended output |
| MKV | .mkv | Matroska container |
| AVI | .avi | Legacy format |
| MOV | .mov | Apple QuickTime |
| WebM | .webm | Web-optimized |
| FLV | .flv | Flash video |
| WMV | .wmv | Windows Media |
| Mode | Flag | Description |
|---|---|---|
| Hard cut | -t none | Direct concatenation, no transition (default). Uses fast copy-mode when all clips share codec/resolution |
| Crossfade | -t crossfade | Smooth blend between clips. Clips overlap by transition duration |
| Fade-to-black | -t fade-to-black | Each clip fades out then next fades in through black. No overlap between clips |
python scripts/montage_maker.py DIRECTORIES... [OPTIONS]
Positional:
directories One or more directories containing video files
Options:
-o, --output FILE Output file path (default: ./montage.mp4)
-t, --transition TYPE none|crossfade|fade-to-black (default: none)
-d, --duration SECS Transition duration in seconds (default: 1.0)
-r, --resolution WxH Force output resolution (default: auto-detect most common)
--sort ORDER alphabetical|modified|random (default: alphabetical)
-j, --json Output result as JSON
-q, --quiet Suppress progress output
--dry-run Show ffmpeg command without executingalphabetical sorts by filename, modified sorts by file modification time, random shuffles.If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.