Video compression is one of the core functions of FFmpeg. Proper compression strategies can significantly reduce file size while maintaining video quality.
Video Compression Basics
Compression Principles
Video compression is mainly achieved through:
- Spatial compression: Reduce redundant information within frames
- Temporal compression: Utilize similarity between frames
- Encoding optimization: Use efficient encoding algorithms
Common Encoding Format Comparison
| Format | Compression Ratio | Quality | Compatibility | Use Case |
|---|---|---|---|---|
| H.264 (AVC) | Medium | High | Excellent | General video |
| H.265 (HEVC) | High | High | Good | 4K/8K video |
| VP9 | High | High | Good | Web video |
| AV1 | Very High | High | Fair | Next-generation video |
| MPEG-4 | Low | Medium | Good | Legacy devices |
H.264 Encoding Parameter Optimization
CRF (Constant Rate Factor)
CRF is the core parameter controlling video quality. Lower values mean higher quality and larger files.
bash# High quality (larger file) ffmpeg -i input.mp4 -c:v libx264 -crf 18 output.mp4 # Default quality (recommended) ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 # Medium quality ffmpeg -i input.mp4 -c:v libx264 -crf 26 output.mp4 # Low quality (smaller file) ffmpeg -i input.mp4 -c:v libx264 -crf 30 output.mp4
Preset Selection
Preset controls the balance between encoding speed and compression efficiency.
bash# Ultra fast speed (low compression) ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 output.mp4 # Very fast ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -crf 23 output.mp4 # Faster ffmpeg -i input.mp4 -c:v libx264 -preset faster -crf 23 output.mp4 # Fast ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 output.mp4 # Medium (recommended) ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4 # Slow (high compression) ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 output.mp4 # Slower ffmpeg -i input.mp4 -c:v libx264 -preset slower -crf 23 output.mp4 # Very slow (highest compression) ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 23 output.mp4
Tune Parameter
Tune parameter optimizes for specific types of content.
bash# Film content ffmpeg -i input.mp4 -c:v libx264 -tune film output.mp4 # Animation content ffmpeg -i input.mp4 -c:v libx264 -tune animation output.mp4 # Fast action content ffmpeg -i input.mp4 -c:v libx264 -tune fastdecode output.mp4 # Low latency streaming ffmpeg -i input.mp4 -c:v libx264 -tune zerolatency output.mp4 # Still image content ffmpeg -i input.mp4 -c:v libx264 -tune stillimage output.mp4
Bitrate Control
CBR (Constant Bitrate)
Constant bitrate, suitable for streaming.
bash# 2Mbps CBR ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 2M -minrate 2M -bufsize 4M output.mp4 # 5Mbps CBR ffmpeg -i input.mp4 -c:v libx264 -b:v 5M -maxrate 5M -minrate 5M -bufsize 10M output.mp4
VBR (Variable Bitrate)
Variable bitrate, suitable for local storage.
bash# Target 2Mbps, max 4Mbps ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 4M -bufsize 8M output.mp4 # Use CRF and max bitrate ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M output.mp4
Two-Pass Encoding
Two-pass encoding provides better compression efficiency.
bash# First pass: analysis ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f null /dev/null # Second pass: encoding ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4
Resolution Optimization
Adjust Resolution
bash# Downscale to 720p ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 output.mp4 # Downscale to 480p ffmpeg -i input.mp4 -vf scale=854:480 -c:v libx264 -crf 23 output.mp4 # Maintain aspect ratio ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -crf 23 output.mp4 # Scale by ratio ffmpeg -i input.mp4 -vf scale=iw*0.5:ih*0.5 -c:v libx264 -crf 23 output.mp4
Frame Rate Adjustment
bash# Reduce to 24fps ffmpeg -i input.mp4 -r 24 -c:v libx264 -crf 23 output.mp4 # Reduce to 15fps ffmpeg -i input.mp4 -r 15 -c:v libx264 -crf 23 output.mp4 # Keep original frame rate ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
H.265 (HEVC) Encoding
H.265 provides higher compression efficiency than H.264.
bash# H.265 encoding ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4 # H.265 two-pass encoding ffmpeg -i input.mp4 -c:v libx265 -b:v 1M -pass 1 -f null /dev/null ffmpeg -i input.mp4 -c:v libx265 -b:v 1M -pass 2 output.mp4 # H.265 preset ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 28 output.mp4
Audio Compression
Audio Encoding Optimization
bash# AAC encoding (recommended) ffmpeg -i input.mp4 -c:a aac -b:a 128k output.mp4 # High quality AAC ffmpeg -i input.mp4 -c:a aac -b:a 192k output.mp4 # Low quality AAC ffmpeg -i input.mp4 -c:a aac -b:a 96k output.mp4 # MP3 encoding ffmpeg -i input.mp4 -c:a libmp3lame -b:a 128k output.mp4 # Opus encoding (high quality) ffmpeg -i input.mp4 -c:a libopus -b:a 64k output.opus
Compression Strategy Recommendations
Compression Parameters for Different Scenarios
Social Media Sharing
bashffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium -vf scale=1280:-1 -c:a aac -b:a 128k output.mp4
Network Transmission
bashffmpeg -i input.mp4 -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -preset fast -c:a aac -b:a 96k output.mp4
Local Storage
bashffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 192k output.mp4
Mobile Devices
bashffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset medium -vf scale=854:480 -c:a aac -b:a 96k output.mp4
Compression Effect Evaluation
Quality Assessment Tools
bash# View PSNR (Peak Signal-to-Noise Ratio) ffmpeg -i input.mp4 -i output.mp4 -lavfi psnr -f null - # View SSIM (Structural Similarity) ffmpeg -i input.mp4 -i output.mp4 -lavfi ssim -f null - # View file size ls -lh input.mp4 output.mp4 # View bitrate ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 output.mp4
Best Practices
- Choose appropriate CRF value: Between 18-28, adjust based on quality requirements
- Use appropriate preset: Balance encoding time and compression efficiency
- Adjust resolution: Choose appropriate resolution based on target device
- Optimize audio: Don't ignore audio compression
- Test different parameters: Find the parameter combination that best suits your needs
- Use two-pass encoding: Get better compression results when time allows
Video compression requires finding a balance between quality, file size, and encoding time. It is recommended to choose an appropriate compression strategy based on the specific application scenario.