ffmpeg
Guide for using FFmpeg - a comprehensive multimedia framework for video/audio encoding, conversion, streaming, and filtering. Use when processing media files, converting formats, extracting audio, creating streams, applying filters, or optimizing video/audio quality.
Best use case
ffmpeg is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Guide for using FFmpeg - a comprehensive multimedia framework for video/audio encoding, conversion, streaming, and filtering. Use when processing media files, converting formats, extracting audio, creating streams, applying filters, or optimizing video/audio quality.
Teams using ffmpeg should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/ffmpeg/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How ffmpeg Compares
| Feature / Agent | ffmpeg | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Guide for using FFmpeg - a comprehensive multimedia framework for video/audio encoding, conversion, streaming, and filtering. Use when processing media files, converting formats, extracting audio, creating streams, applying filters, or optimizing video/audio quality.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# FFmpeg Skill
FFmpeg is a comprehensive open-source multimedia framework that handles video, audio, and other multimedia files and streams. It provides command-line tools and libraries for recording, converting, and streaming audio and video.
## When to Use This Skill
Use this skill when:
- Converting media files between formats (MP4, MKV, WebM, AVI, etc.)
- Encoding/decoding video with different codecs (H.264, H.265, VP9, AV1)
- Processing audio files (AAC, MP3, FLAC, Opus)
- Live streaming to platforms (Twitch, YouTube, RTMP servers)
- Creating HLS/DASH adaptive streams
- Extracting audio from video files
- Applying video/audio filters (scale, crop, denoise, volume)
- Screen recording and capture
- Optimizing video quality and file size
- Batch processing media files
- Analyzing media file properties
## Core Components
### Command-Line Tools
**ffmpeg**: Primary tool for transcoding, conversion, and streaming
**ffprobe**: Media analysis and inspection tool
**ffplay**: Minimalist multimedia player for testing
### Libraries
- **libavcodec**: Encoding/decoding codecs
- **libavformat**: Container formats and I/O
- **libavfilter**: Audio/video filtering framework
- **libavutil**: Utility functions
- **libswscale**: Video scaling and color conversion
- **libswresample**: Audio resampling and mixing
## Common Video Codecs
### Modern Codecs
**H.264 (libx264)**: Most widely supported, excellent compression/quality balance
- Best for: Universal compatibility, streaming, web video
- Quality range: CRF 17-28 (lower = better quality)
**H.265/HEVC (libx265)**: 25-50% better compression than H.264
- Best for: 4K video, file size reduction
- Slower encoding, limited browser support
**VP9**: Royalty-free, WebM format
- Best for: YouTube, open-source projects
- Good quality/compression, Chrome/Firefox support
**AV1 (libaom-av1, libsvtav1)**: Next-generation codec, best compression
- Best for: Future-proofing, ultimate quality/size ratio
- Very slow encoding (improving with SVT-AV1)
### Legacy Codecs
- MPEG-4 (Xvid/DivX)
- MPEG-2
- VP8
## Common Audio Codecs
**AAC**: Industry standard, excellent quality
**MP3**: Universal compatibility, good quality
**Opus**: Best quality at low bitrates, ideal for voice/streaming
**FLAC**: Lossless compression, archival quality
**Vorbis**: Open-source, good quality
**AC-3/DTS**: Surround sound formats
## Container Formats
**MP4**: Universal compatibility, streaming-friendly
**MKV (Matroska)**: Feature-rich, supports multiple tracks/subtitles
**WebM**: Web-optimized (VP8/VP9 + Vorbis/Opus)
**AVI**: Legacy format, broad compatibility
**MOV**: Apple QuickTime format
**TS**: Transport stream for broadcasting
**FLV**: Flash video (legacy streaming)
## Basic Operations
### Format Conversion
Simple format conversion without re-encoding:
```bash
ffmpeg -i input.mkv -c copy output.mp4
```
Convert with specific codecs:
```bash
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
```
### Quality-Based Encoding (CRF)
Constant Rate Factor - best for quality-focused encoding:
```bash
# H.264 encoding (CRF 23 = default, 17-28 recommended range)
ffmpeg -i input.mkv -c:v libx264 -preset slow -crf 22 -c:a copy output.mp4
# H.265 encoding (higher compression)
ffmpeg -i input.mkv -c:v libx265 -preset medium -crf 24 -c:a copy output.mp4
# VP9 encoding (WebM)
ffmpeg -i input.mkv -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
```
**CRF Scale:**
- 0 = Lossless (huge file size)
- 17-18 = Visually lossless
- 20-23 = High quality (recommended)
- 24-28 = Medium quality
- 30+ = Low quality
- 51 = Worst quality
**Presets** (speed vs compression):
- ultrafast, superfast, veryfast, faster, fast
- medium (default)
- slow, slower, veryslow (better compression)
- placebo (not recommended - minimal gains)
### Bitrate-Based Encoding (Two-Pass)
For targeting specific file sizes:
```bash
# Pass 1 (analysis)
ffmpeg -y -i input.mkv -c:v libx264 -b:v 2600k -pass 1 -an -f null /dev/null
# Pass 2 (encoding)
ffmpeg -i input.mkv -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4
```
### Audio Extraction
Extract audio without re-encoding:
```bash
ffmpeg -i video.mp4 -vn -c:a copy audio.m4a
```
Extract and convert to MP3:
```bash
ffmpeg -i video.mp4 -vn -q:a 0 audio.mp3
```
Extract with specific bitrate:
```bash
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 192k audio.mp3
```
### Video Scaling/Resizing
Scale to specific dimensions:
```bash
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
```
Scale maintaining aspect ratio:
```bash
# Width 1280, height auto-calculated
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
# Height 720, width auto-calculated
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
```
Scale to half resolution:
```bash
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
```
### Trimming/Cutting Video
Cut without re-encoding (fast but less precise):
```bash
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:03:00 -c copy output.mp4
```
Cut with re-encoding (precise):
```bash
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:01:30 -c:v libx264 -c:a aac output.mp4
```
Parameters:
- `-ss`: Start time (HH:MM:SS or seconds)
- `-to`: End time
- `-t`: Duration (instead of end time)
### Concatenation
**Method 1: Concat demuxer (same codec/format)**
Create `concat.txt`:
```
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
```
Run:
```bash
ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4
```
**Method 2: Concat filter (different formats)**
```bash
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4
```
## Advanced Filtering
### Video Filters
**Multiple filters (chain with comma):**
```bash
ffmpeg -i input.mp4 -vf "scale=1280:720,hqdn3d" output.mp4
```
**Denoise:**
```bash
ffmpeg -i input.mp4 -vf hqdn3d output.mp4
```
**Deinterlace:**
```bash
ffmpeg -i input.mp4 -vf yadif output.mp4
```
**Crop:**
```bash
# Crop to 1280x720 from top-left (0,0)
ffmpeg -i input.mp4 -vf "crop=1280:720:0:0" output.mp4
# Auto-detect and remove black borders
ffmpeg -i input.mp4 -vf "cropdetect" output.mp4
```
**Rotate:**
```bash
# Rotate 90 degrees clockwise
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# Rotate 180 degrees
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" output.mp4
```
**Watermark/Logo:**
```bash
ffmpeg -i video.mp4 -i logo.png \
-filter_complex "overlay=10:10" output.mp4
```
**Speed adjustment:**
```bash
# 2x speed
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
# 0.5x speed (slow motion)
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output.mp4
```
### Audio Filters
**Volume adjustment:**
```bash
# Increase volume by 10dB
ffmpeg -i input.mp4 -af "volume=10dB" output.mp4
# Set to 50% volume
ffmpeg -i input.mp4 -af "volume=0.5" output.mp4
```
**Normalize audio:**
```bash
ffmpeg -i input.mp4 -af loudnorm output.mp4
```
**Crossfade between audio:**
```bash
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0][1]acrossfade=d=5" output.mp3
```
**Mix multiple audio tracks:**
```bash
ffmpeg -i input1.mp3 -i input2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" output.mp3
```
## Streaming
### RTMP Streaming (Twitch/YouTube)
**Basic stream:**
```bash
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast \
-maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 \
-c:a aac -b:a 128k -ar 44100 \
-f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
```
**Screen capture + stream (Linux):**
```bash
ffmpeg -f x11grab -s 1920x1080 -framerate 30 -i :0.0 \
-f pulse -ac 2 -i default \
-c:v libx264 -preset veryfast -tune zerolatency \
-maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
```
**Screen capture (Windows DirectShow):**
```bash
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix" \
-c:v libx264 -preset ultrafast -tune zerolatency \
-maxrate 750k -bufsize 3000k \
-f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
```
**Important streaming parameters:**
- `-re`: Read input at native frame rate (real-time)
- `-tune zerolatency`: Optimize for low latency
- `-g 50`: Keyframe every 50 frames (2 seconds @ 25fps)
- `-maxrate`: Maximum bitrate
- `-bufsize`: Rate control buffer (typically 2x maxrate)
### HLS Streaming
Generate adaptive HLS stream:
```bash
ffmpeg -i input.mp4 \
-c:v libx264 -preset fast -crf 22 -g 48 -sc_threshold 0 \
-c:a aac -b:a 128k \
-f hls -hls_time 6 -hls_playlist_type vod \
-hls_segment_filename "segment_%03d.ts" \
playlist.m3u8
```
**Multi-bitrate HLS:**
```bash
ffmpeg -i input.mp4 \
-map 0:v -map 0:a -map 0:v -map 0:a \
-c:v libx264 -crf 22 -c:a aac -b:a 128k \
-b:v:0 2000k -s:v:0 1280x720 -b:v:1 5000k -s:v:1 1920x1080 \
-var_stream_map "v:0,a:0 v:1,a:1" \
-master_pl_name master.m3u8 \
-f hls -hls_time 6 -hls_list_size 0 \
stream_%v/index.m3u8
```
### UDP/RTP Streaming
**UDP stream:**
```bash
ffmpeg -re -i input.mp4 -c copy -f mpegts udp://192.168.1.100:1234
```
**RTP audio stream:**
```bash
ffmpeg -re -i audio.mp3 -c:a libopus -f rtp rtp://192.168.1.100:5004
```
## Hardware Acceleration
### NVIDIA NVENC
```bash
# H.264 with NVENC
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset fast -crf 22 output.mp4
# H.265 with NVENC
ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -preset fast -crf 24 output.mp4
```
### Intel QuickSync (QSV)
```bash
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
-c:v h264_qsv -preset fast -global_quality 22 output.mp4
```
### AMD VCE
```bash
ffmpeg -hwaccel auto -i input.mp4 \
-c:v h264_amf -quality balanced -rc cqp -qp 22 output.mp4
```
## Media Analysis
### Inspect media file
```bash
# Detailed information
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# Human-readable format
ffprobe input.mp4
# Get duration
ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 input.mp4
# Get resolution
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height \
-of csv=s=x:p=0 input.mp4
# Get bitrate
ffprobe -v error -show_entries format=bit_rate \
-of default=noprint_wrappers=1:nokey=1 input.mp4
```
## Batch Processing
### Bash loop for batch conversion
```bash
# Convert all MKV files to MP4
for file in *.mkv; do
ffmpeg -i "$file" -c:v libx264 -crf 22 -c:a aac "${file%.mkv}.mp4"
done
# Resize all videos to 720p
for file in *.mp4; do
ffmpeg -i "$file" -vf scale=-1:720 "720p_${file}"
done
```
### Parallel processing with GNU Parallel
```bash
# Install: sudo apt-get install parallel
# Process multiple files in parallel
ls *.mkv | parallel ffmpeg -i {} -c:v libx264 -crf 22 -c:a aac {.}.mp4
```
## Common Patterns
### Create GIF from video
```bash
# High quality GIF
ffmpeg -i input.mp4 -vf "fps=15,scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
# Simple GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif
```
### Extract frames as images
```bash
# Extract all frames
ffmpeg -i input.mp4 frame_%04d.png
# Extract 1 frame per second
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
# Extract single frame at 5 seconds
ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 frame.png
```
### Create video from images
```bash
# From numbered images
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -crf 22 -pix_fmt yuv420p output.mp4
# From pattern
ffmpeg -framerate 24 -pattern_type glob -i '*.png' -c:v libx264 output.mp4
```
### Add subtitles
```bash
# Burn subtitles into video
ffmpeg -i video.mp4 -vf subtitles=subtitles.srt output.mp4
# Embed subtitle track (soft subtitles)
ffmpeg -i video.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
```
### Remove audio
```bash
ffmpeg -i input.mp4 -an -c:v copy output.mp4
```
### Replace audio
```bash
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
```
### Create thumbnail
```bash
# Single thumbnail at 5 seconds
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 -vf scale=320:-1 thumb.jpg
# Multiple thumbnails (one per minute)
ffmpeg -i input.mp4 -vf fps=1/60,scale=320:-1 thumb_%03d.jpg
```
## Performance Optimization
### Speed vs Quality Trade-offs
**Fast encoding (real-time processing):**
```bash
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 output.mp4
```
**Balanced (default):**
```bash
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 22 output.mp4
```
**High quality (archival):**
```bash
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 18 output.mp4
```
### Multi-threading
FFmpeg automatically uses multiple CPU cores. Override with:
```bash
ffmpeg -threads 8 -i input.mp4 -c:v libx264 output.mp4
```
## Best Practices
1. **Use CRF for quality-focused encoding** - Better than bitrate for most use cases
2. **Two-pass for size targets** - When file size is critical
3. **Copy streams when possible** - Use `-c copy` to avoid re-encoding
4. **Choose appropriate presets** - Balance speed vs compression
5. **Match output to source** - Don't upscale or use higher quality than source
6. **Test short clips first** - Verify settings before batch processing
7. **Hardware acceleration** - Use GPU encoding for faster processing
8. **Audio matters** - Don't neglect audio codec/bitrate choices
9. **Use filters efficiently** - Chain multiple filters with commas
10. **Verify output** - Always check quality after encoding
## Common Parameters Reference
### Video Parameters
- `-c:v` or `-vcodec`: Video codec
- `-b:v`: Video bitrate (e.g., `2M`, `2500k`)
- `-crf`: Constant Rate Factor (0-51)
- `-preset`: Encoding speed/quality (ultrafast to veryslow)
- `-tune`: Encoding optimization (film, animation, zerolatency)
- `-pix_fmt`: Pixel format (yuv420p for compatibility)
- `-r`: Frame rate (e.g., `30`, `60`)
- `-g`: GOP size (keyframe interval)
### Audio Parameters
- `-c:a` or `-acodec`: Audio codec
- `-b:a`: Audio bitrate (e.g., `128k`, `192k`)
- `-ar`: Audio sample rate (e.g., `44100`, `48000`)
- `-ac`: Audio channels (1=mono, 2=stereo)
- `-q:a`: Audio quality for VBR (0=best for MP3)
### General Parameters
- `-i`: Input file
- `-y`: Overwrite output without asking
- `-n`: Never overwrite output
- `-t`: Duration to encode
- `-ss`: Start time offset
- `-to`: End time
- `-vf`: Video filters
- `-af`: Audio filters
- `-map`: Stream selection
- `-metadata`: Set metadata
- `-f`: Force format
## Troubleshooting
### "Unknown encoder" errors
Install codec libraries:
```bash
# Ubuntu/Debian
sudo apt-get install ffmpeg libx264-dev libx265-dev libvpx-dev
# Check available encoders
ffmpeg -encoders
```
### Output compatibility issues
Use safe defaults for maximum compatibility:
```bash
ffmpeg -i input.mkv -c:v libx264 -profile:v high -level 4.0 \
-pix_fmt yuv420p -c:a aac -b:a 128k output.mp4
```
### Performance issues
- Use hardware acceleration (`-hwaccel`)
- Choose faster presets (`-preset fast`)
- Reduce resolution with scale filter
- Use multiple threads explicitly
### Quality issues
- Lower CRF value (18-22 for high quality)
- Use slower preset (`-preset slow`)
- Use two-pass encoding for better bitrate distribution
- Match or exceed source bitrate
## Resources
- Official Documentation: https://ffmpeg.org/documentation.html
- FFmpeg Wiki: https://trac.ffmpeg.org/
- Codec Guides: https://trac.ffmpeg.org/wiki/Encode
- Filter Documentation: https://ffmpeg.org/ffmpeg-filters.html
- GitHub Repository: https://github.com/ffmpeg/ffmpeg
- Community Examples: https://trac.ffmpeg.org/wiki/
## Implementation Checklist
When using FFmpeg:
- [ ] Verify FFmpeg installation (`ffmpeg -version`)
- [ ] Check available codecs for your use case
- [ ] Test encoding settings on short clip first
- [ ] Choose appropriate codec for target platform
- [ ] Set quality level (CRF or bitrate)
- [ ] Configure audio codec and bitrate
- [ ] Apply necessary filters (scale, crop, etc.)
- [ ] Consider hardware acceleration if available
- [ ] Verify output quality and file size
- [ ] Test output compatibility on target devices
- [ ] Document settings for reproducibility
- [ ] Create batch scripts for repetitive tasksRelated Skills
ffmpeg-usage
ffmpeg recipes and best practices: convert, concatenate, merge, resize, compress, GIF creation, audio extraction, subtitles, optimize for social platforms.
ffmpeg-media
FFmpeg media processing. Video/audio transcoding, stream manipulation, and filter graphs.
bgo
Automates the complete Blender build-go workflow, from building and packaging your extension/add-on to removing old versions, installing, enabling, and launching Blender for quick testing and iteration.
mcp-create-declarative-agent
Skill converted from mcp-create-declarative-agent.prompt.md
MCP Architecture Expert
Design and implement Model Context Protocol servers for standardized AI-to-data integration with resources, tools, prompts, and security best practices
mathem-shopping
Automatiserar att logga in på Mathem.se, söka och lägga till varor från en lista eller recept, hantera ersättningar enligt policy och reservera leveranstid, men lämnar varukorgen redo för manuell checkout.
math-modeling
本技能应在用户要求"数学建模"、"建模比赛"、"数模论文"、"数学建模竞赛"、"建模分析"、"建模求解"或提及数学建模相关任务时使用。适用于全国大学生数学建模竞赛(CUMCM)、美国大学生数学建模竞赛(MCM/ICM)等各类数学建模比赛。
matchms
Mass spectrometry analysis. Process mzML/MGF/MSP, spectral similarity (cosine, modified cosine), metadata harmonization, compound ID, for metabolomics and MS data processing.
managing-traefik
Manages Traefik reverse proxy for local development. Use when routing domains to local services, configuring CORS, checking service health, or debugging connectivity issues.
managing-skills
Install, find, update, and manage agent skills. Use when the user wants to add a new skill, search for skills that do something, check if skills are up to date, or update existing skills. Triggers on: install skill, add skill, get skill, find skill, search skill, update skill, check skills, list skills.
manage-agents
Create, modify, and manage Claude Code subagents with specialized expertise. Use when you need to "work with agents", "create an agent", "modify an agent", "set up a specialist", "I need an agent for [task]", or "agent to handle [domain]". Covers agent file format, YAML frontmatter, system prompts, tool restrictions, MCP integration, model selection, and testing.
maintainx-automation
Automate Maintainx tasks via Rube MCP (Composio). Always search tools first for current schemas.