This README documents the most useful FFmpeg command line commands and settings for processing video and images. It includes recommended parameters for different formats, resolutions, and compression options.
MP4 (H.264) is widely supported and offers good quality/size balance.
# Basic MP4 compression with reasonable quality
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# High-quality MP4 compression
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -profile:v high -level 4.0 -c:a aac -b:a 192k output-hq.mp4
# Lower file size MP4 compression
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset faster -c:a aac -b:a 96k output-compressed.mp4
# Compress video with 2-pass encoding for better quality at specific bitrate
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -f mp4 /dev/null && \
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 2 -c:a aac -b:a 128k output.mp4MP4 Settings Explained:
-c:v libx264: Uses H.264 video codec-crf: Constant Rate Factor (quality setting, range 0-51)- 18-23: High quality
- 23-28: Standard quality
- 28-35: Lower quality
-preset: Encoding speed (slower = better compression)- Options: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
-profile:v: H.264 profile (baseline, main, high)-c:a aac: Audio codec-b:a: Audio bitrate
WebM (VP9) offers better compression than MP4 but with slightly less support.
# Standard WebM compression
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -deadline good -c:a libopus -b:a 128k output.webm
# High quality WebM
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 24 -b:v 0 -deadline best -row-mt 1 -c:a libopus -b:a 192k output-hq.webm
# Smaller file size WebM
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 36 -b:v 0 -deadline good -c:a libopus -b:a 96k -cpu-used 4 output-compressed.webm
# Two-pass encoding for WebM (better quality at target size)
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 1 -deadline good -row-mt 1 -f webm /dev/null && \
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 2 -deadline good -row-mt 1 -c:a libopus -b:a 128k output.webmWebM Settings Explained:
-c:v libvpx-vp9: Uses VP9 video codec-crf: Quality control (0-63, lower is better)-b:v 0: Allows CRF to control the quality-deadline: Encoding speed/quality balance (realtime, good, best)-row-mt 1: Enables row-based multithreading-cpu-used: Speed setting (0-5, higher is faster)-c:a libopus: Opus audio codec (better than Vorbis)
# Resize to specific dimensions (maintaining aspect ratio)
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
# Resize to specific width, maintain aspect ratio
ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4
# Resize to specific height, maintain aspect ratio
ffmpeg -i input.mp4 -vf "scale=-1:720" output.mp4
# Resize to 50% of original dimensions
ffmpeg -i input.mp4 -vf "scale=iw*0.5:ih*0.5" output.mp4
# Resize for common resolutions
ffmpeg -i input.mp4 -vf "scale=1920:1080" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output-1080p.mp4
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output-720p.mp4
ffmpeg -i input.mp4 -vf "scale=854:480" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output-480p.mp4# Convert MOV to MP4
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Convert MKV to MP4
ffmpeg -i input.mkv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Convert MP4 to WebM
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm
# Convert AVI to MP4
ffmpeg -i input.avi -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Extract audio from video
ffmpeg -i input.mp4 -vn -c:a aac -b:a 192k output.aac
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 4 output.mp3# Change frame rate
ffmpeg -i input.mp4 -filter:v fps=fps=30 -c:v libx264 -crf 23 -preset medium -c:a copy output.mp4
# Slow motion (half speed)
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" -c:v libx264 -crf 23 -preset medium -c:a aac -af "atempo=0.5" output.mp4
# Fast motion (double speed)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -c:v libx264 -crf 23 -preset medium -c:a aac -af "atempo=2.0" output.mp4# Convert JPG to PNG
ffmpeg -i input.jpg output.png
# Convert PNG to JPG
ffmpeg -i input.png -q:v 2 output.jpg
# Convert to WebP
ffmpeg -i input.jpg -q:v 70 output.webp
# Convert multiple images (with sequence number)
ffmpeg -i image%d.jpg output%d.png
# Create animated GIF from images
ffmpeg -framerate 10 -pattern_type glob -i "*.jpg" -vf "scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif# Resize image to specific dimensions
ffmpeg -i input.jpg -vf scale=800:600 output.jpg
# Resize image maintaining aspect ratio (width fixed)
ffmpeg -i input.jpg -vf scale=800:-1 output.jpg
# Resize image maintaining aspect ratio (height fixed)
ffmpeg -i input.jpg -vf scale=-1:600 output.jpg
# Resize to percentage of original
ffmpeg -i input.jpg -vf "scale=iw*0.5:ih*0.5" output.jpg# Compress JPEG with quality control
ffmpeg -i input.jpg -q:v 2 output.jpg # High quality (scale 2-31, lower is better)
ffmpeg -i input.jpg -q:v 5 output.jpg # Medium quality
ffmpeg -i input.jpg -q:v 10 output.jpg # Lower quality
# Compress PNG
ffmpeg -i input.png -compression_level 9 output.png # Maximum compression
# Compress WebP
ffmpeg -i input.jpg -q:v 75 output.webp # Quality scale 0-100
ffmpeg -i input.jpg -q:v 50 output.webp # More compression, less quality
# Create AVIF image (high compression, good quality)
ffmpeg -i input.jpg -c:v libaom-av1 -crf 30 -still-picture 1 output.avif# Crop video (format: width:height:x_offset:y_offset)
ffmpeg -i input.mp4 -vf "crop=1280:720:0:0" output.mp4# Two-pass video stabilization
ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 -f null -
ffmpeg -i input.mp4 -vf vidstabtransform=smoothing=30:input="transforms.trf" output.mp4# Extract single frame as thumbnail
ffmpeg -i input.mp4 -ss 00:00:15 -frames:v 1 thumbnail.jpg
# Create thumbnails at intervals
ffmpeg -i input.mp4 -vf "fps=1/10" thumb%04d.jpg # One frame every 10 seconds# Add image watermark
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
# Add text watermark
ffmpeg -i input.mp4 -vf "drawtext=text='Copyright 2025':fontcolor=white:fontsize=24:x=10:y=10" output.mp4# Cut video clip (from 00:01:30 to 00:02:30)
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:30 -c:v copy -c:a copy output.mp4
# Fast seeking (less accurate but quicker)
ffmpeg -ss 00:01:30 -i input.mp4 -to 00:02:30 -c:v copy -c:a copy output.mp4# Create a list file (list.txt)
# file 'input1.mp4'
# file 'input2.mp4'
# file 'input3.mp4'
# Concatenate video files
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4# Extract audio from video
ffmpeg -i input.mp4 -vn -c:a aac -b:a 192k output.aac# Replace audio in video
ffmpeg -i input.mp4 -i audio.mp3 -c:v copy -map 0:v:0 -map 1:a:0 -shortest output.mp4
# Merge audio and video
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest output.mp4