| name | cli-ffmpeg |
| description | Covers effective use of FFmpeg for video/audio conversion, trimming, filtering, streaming, and multimedia processing. Activates when the user wants to convert media files, trim video, create GIFs, extract audio, add subtitles, encode for web, or do any audio/video manipulation.
|
FFmpeg — Multimedia Framework
Repo: https://github.com/FFmpeg/FFmpeg
Complete multimedia framework for recording, converting, and streaming audio
and video. Supports hundreds of formats and codecs. The Swiss Army knife of
media processing.
When to Activate
Manual triggers:
- "Convert this video to..."
- "Trim/clip this video"
- "Extract audio from video"
- "Create a GIF from video"
- "Compress this video"
- "Add subtitles"
Auto-detect triggers:
- User has a media file and wants to change its format, size, or content
- User mentions encoding, bitrate, codec, resolution, or framerate
- User wants to batch process video or audio files
- User needs to extract frames or create a thumbnail
Key Commands
Basic Conversion
ffmpeg -i input.mp4 output.mkv
ffmpeg -i input.mov output.mp4
ffmpeg -i input.mp4 -c copy output.mkv
ffmpeg -i input.mp4 output.gif
Inspect Media (ffprobe)
ffprobe input.mp4
ffprobe -v quiet -print_format json -show_streams input.mp4
ffprobe -v quiet -show_format input.mp4
Codec Selection
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
ffmpeg -i input.mp4 -c:v libx265 -c:a aac output.mp4
ffmpeg -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm
ffmpeg -i input.mp4 -c:v copy -c:a mp3 output.mp4
Trimming and Cutting
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:30 output.mp4
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:00 output.mp4
ffmpeg -ss 00:01:30 -i input.mp4 -t 30 output.mp4
ffmpeg -i input.mp4 -ss 10 -to 40 -c copy output.mp4
Bitrate and Quality
ffmpeg -i input.mp4 -b:v 1M output.mp4
ffmpeg -i input.mp4 -crf 23 output.mp4
ffmpeg -i input.mp4 -b:a 128k output.mp3
ffmpeg -i input.mp4 -vn -b:a 192k output.mp3
Resolution and Framerate
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
ffmpeg -i input.mp4 -vf scale=1920:-1 output.mp4
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
ffmpeg -i input.mp4 -r 30 output.mp4
ffmpeg -i input.mp4 -r 24 -vf fps=24 output.mp4
Stream Selection (-map)
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 output.mp4
ffmpeg -i input.mkv -map 0 -map -0:s output.mp4
ffmpeg -i input.mkv -vn output.mp3
ffmpeg -i input.mp4 -an output.mp4
Advanced Patterns
High-Quality GIF from Video
ffmpeg -i input.mp4 -ss 5 -t 4 -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i input.mp4 -i palette.png -ss 5 -t 4 \
-filter_complex "fps=15,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif
Batch Conversion
for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -c:a aac "${f%.mkv}.mp4"; done
fd -e mkv | while read f; do
ffmpeg -i "$f" -c:v libx264 -c:a aac "${f%.mkv}.mp4"
done
Video Concatenation
printf "file '%s'\n" *.mp4 > filelist.txt
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
ffmpeg -i "concat:part1.ts|part2.ts" -c copy output.ts
Video Filters (-vf)
ffmpeg -i input.mp4 -vf crop=640:480:100:50 output.mp4
ffmpeg -i input.mp4 -vf rotate=PI/4 output.mp4
ffmpeg -i input.mp4 -vf transpose=1 output.mp4
ffmpeg -i input.mp4 -vf hflip output.mp4
ffmpeg -i input.mp4 -vf vflip output.mp4
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" output.mp4
ffmpeg -i input.mp4 -vf unsharp output.mp4
ffmpeg -i input.mp4 -vf "hue=s=0" output.mp4
Add Text Overlay
ffmpeg -i input.mp4 -vf \
"drawtext=text='Hello World':fontsize=48:fontcolor=white:x=(w-text_w)/2:y=h-50" \
output.mp4
ffmpeg -i input.mp4 -vf \
"drawtext=text='%{pts\:hms}':fontsize=24:fontcolor=white:x=10:y=10" \
output.mp4
Add Subtitles
ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
ffmpeg -i input.mp4 -vf subtitles=subtitles.srt output.mp4
Extract Frames / Create Thumbnails
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
ffmpeg -i input.mp4 -ss 00:01:00 -frames:v 1 thumb.jpg
ffmpeg -i input.mp4 -vf "thumbnail,scale=320:-1" -frames:v 1 thumb.jpg
Thumbnail Sprite Sheet
ffmpeg -i input.mp4 -vf "fps=1/10,scale=160:-1,tile=5x5" sprite.jpg
Audio Filters (-af)
ffmpeg -i input.mp3 -af "volume=2.0" output.mp3
ffmpeg -i input.mp3 -af "loudnorm" output.mp3
ffmpeg -i input.mp3 -af "afade=t=in:st=0:d=3" output.mp3
ffmpeg -i input.mp3 -af "silenceremove=1:0:-50dB" output.mp3
ffmpeg -i input.mp4 -af "equalizer=f=1000:width_type=o:width=2:g=10" output.mp4
Complex Filter Graph (-filter_complex)
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=W-w-10:H-h-10" \
output.mp4
ffmpeg -i left.mp4 -i right.mp4 \
-filter_complex "[0:v][1:v]hstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" \
-map "[v]" -map "[a]" output.mp4
ffmpeg -i main.mp4 -i overlay.mp4 \
-filter_complex "[1:v]scale=320:180[pip];[0:v][pip]overlay=W-w-10:H-h-10" \
output.mp4
Screen Recording (macOS)
ffmpeg -f avfoundation -list_devices true -i ""
ffmpeg -f avfoundation -i "1:0" -r 30 -c:v libx264 -preset ultrafast screen.mp4
Streaming to RTMP
ffmpeg -i input.mp4 -c:v libx264 -preset fast -b:v 3000k \
-c:a aac -b:a 128k -f flv rtmp://live.twitch.tv/app/STREAM_KEY
Hardware Acceleration
ffmpeg -hwaccel videotoolbox -i input.mp4 -c:v h264_videotoolbox output.mp4
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4
Compress for Web
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k -movflags +faststart output.mp4
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 \
-c:a libopus -b:a 96k output.webm
Format Coverage
| Category | Formats |
|---|
| Video containers | MP4, MKV, WebM, AVI, MOV, TS, FLV, OGV |
| Video codecs | H.264, H.265/HEVC, VP8, VP9, AV1, MPEG-2, ProRes |
| Audio containers | MP3, AAC, FLAC, WAV, OGG, M4A, OPUS |
| Image sequences | PNG, JPEG, TIFF, BMP, WebP |
| Subtitles | SRT, ASS, WebVTT, MOV_TEXT |
Chaining with Other Skills
- cli-imagemagick: Extract frames with FFmpeg (
-vf fps=1), then batch-process them with ImageMagick (resize, watermark, color correct)
- fd: Use
fd -e mp4 to find all video files, pipe into a shell loop with FFmpeg for batch conversion
- fzf (cli-fzf): Use
fd -e mp4 | fzf to interactively select a video file before running an FFmpeg command