乐闻世界logo
搜索文章和话题

How to use FFmpeg for video compression and quality optimization? How to use CRF, preset, and tune parameters?

2月18日 11:03

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

FormatCompression RatioQualityCompatibilityUse Case
H.264 (AVC)MediumHighExcellentGeneral video
H.265 (HEVC)HighHighGood4K/8K video
VP9HighHighGoodWeb video
AV1Very HighHighFairNext-generation video
MPEG-4LowMediumGoodLegacy 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

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium -vf scale=1280:-1 -c:a aac -b:a 128k output.mp4

Network Transmission

bash
ffmpeg -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

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 192k output.mp4

Mobile Devices

bash
ffmpeg -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

  1. Choose appropriate CRF value: Between 18-28, adjust based on quality requirements
  2. Use appropriate preset: Balance encoding time and compression efficiency
  3. Adjust resolution: Choose appropriate resolution based on target device
  4. Optimize audio: Don't ignore audio compression
  5. Test different parameters: Find the parameter combination that best suits your needs
  6. 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.

标签:FFmpeg