FFmpeg Video Conversion

Basic Conversion

Convert to MP4 (H.264)

1# High quality
2ffmpeg -i input.avi -c:v libx264 -preset slow -crf 18 -c:a aac -b:a 192k output.mp4
3
4# Medium quality (default)
5ffmpeg -i input.avi -c:v libx264 -crf 23 output.mp4
6
7# Fast encoding
8ffmpeg -i input.avi -c:v libx264 -preset ultrafast -crf 23 output.mp4

Convert to WebM (VP9)

1# High quality
2ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
3
4# Two-pass encoding (better quality)
5ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 1 -f null /dev/null
6ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 2 -c:a libopus output.webm

Convert to H.265/HEVC

1# Better compression than H.264
2ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac -b:a 128k output.mp4
3
4# Hardware acceleration (NVIDIA)
5ffmpeg -i input.mp4 -c:v hevc_nvenc -preset slow -crf 23 output.mp4

Quality Settings

CRF (Constant Rate Factor)

Lower = better quality, larger file

CRFQualityUse Case
18-22Very highArchival, professional
23-28GoodGeneral use, streaming
29-35LowerSmall files, previews
1# Set CRF
2ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

Bitrate Control

1# Constant bitrate
2ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 2M -bufsize 4M output.mp4
3
4# Variable bitrate with target
5ffmpeg -i input.mp4 -c:v libx264 -b:v 2M output.mp4
6
7# Two-pass encoding (best quality for target bitrate)
8ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f null /dev/null
9ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4

Codec Options

H.264 (libx264)

 1# Presets: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
 2ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 output.mp4
 3
 4# Profile (for compatibility)
 5ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline -level 3.0 output.mp4
 6# Profiles: baseline, main, high
 7
 8# Tune (optional optimization)
 9ffmpeg -i input.mp4 -c:v libx264 -tune film output.mp4
10# Tunes: film, animation, grain, stillimage, fastdecode, zerolatency

H.265/HEVC (libx265)

1# Basic
2ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
3
4# With preset
5ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 28 output.mp4
6
7# 10-bit encoding (better quality)
8ffmpeg -i input.mp4 -c:v libx265 -pix_fmt yuv420p10le -crf 28 output.mp4

VP9 (libvpx-vp9)

1# Single pass
2ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm
3
4# Two-pass (recommended)
5ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 1 -f null /dev/null && \
6ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 2 output.webm

Resolution & Frame Rate

Change Resolution

 1# Scale to width (maintain aspect ratio)
 2ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4
 3
 4# Scale to height
 5ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4
 6
 7# Specific resolution
 8ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4
 9
10# Scale with high-quality algorithm
11ffmpeg -i input.mp4 -vf scale=1280:720:flags=lanczos output.mp4

Change Frame Rate

1# Set frame rate
2ffmpeg -i input.mp4 -r 30 output.mp4
3
4# Convert to 60fps (interpolation)
5ffmpeg -i input.mp4 -filter:v "minterpolate='fps=60'" output.mp4
6
7# Reduce frame rate (drop frames)
8ffmpeg -i input.mp4 -r 24 output.mp4

Audio Codecs

AAC

1# Default quality
2ffmpeg -i input.mp4 -c:a aac -b:a 192k output.mp4
3
4# High quality
5ffmpeg -i input.mp4 -c:a aac -b:a 256k output.mp4

Opus (best for WebM)

1ffmpeg -i input.mp4 -c:a libopus -b:a 128k output.webm

MP3

1ffmpeg -i input.mp4 -c:a libmp3lame -b:a 192k output.mp4

Copy audio (no re-encoding)

1ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4

Container Formats

MP4

1# Standard MP4
2ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
3
4# MP4 with faststart (web streaming)
5ffmpeg -i input.avi -c:v libx264 -c:a aac -movflags +faststart output.mp4

MKV

1# Matroska (supports multiple audio/subtitle tracks)
2ffmpeg -i input.mp4 -c copy output.mkv

WebM

1# For web (VP9 + Opus)
2ffmpeg -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm

AVI

1ffmpeg -i input.mp4 -c:v mpeg4 -q:v 5 -c:a libmp3lame output.avi

Hardware Acceleration

NVIDIA (NVENC)

1# H.264
2ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset slow output.mp4
3
4# H.265
5ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -preset slow output.mp4

Intel Quick Sync (QSV)

1ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv -preset slow output.mp4

AMD (AMF)

1ffmpeg -i input.mp4 -c:v h264_amf -quality quality output.mp4

Copy Streams (No Re-encoding)

1# Copy both video and audio
2ffmpeg -i input.mp4 -c copy output.mkv
3
4# Copy video, re-encode audio
5ffmpeg -i input.mp4 -c:v copy -c:a aac -b:a 192k output.mp4
6
7# Copy audio, re-encode video
8ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4

Useful Flags

 1# Overwrite output without asking
 2-y
 3
 4# Don't overwrite
 5-n
 6
 7# Limit output file size (approximate)
 8-fs 100M
 9
10# Set metadata
11-metadata title="My Video" -metadata author="Name"
12
13# Verbose output
14-v verbose
15
16# Quiet (only errors)
17-v quiet
18
19# Show progress
20-progress pipe:1

Quick Reference

TaskCommand
Convert to MP4ffmpeg -i input.avi -c:v libx264 -crf 23 output.mp4
High qualityffmpeg -i input.avi -c:v libx264 -crf 18 output.mp4
Small fileffmpeg -i input.avi -c:v libx264 -crf 28 output.mp4
WebMffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 output.webm
H.265ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
Scale to 720pffmpeg -i input.mp4 -vf scale=-2:720 output.mp4
Copy streamsffmpeg -i input.mp4 -c copy output.mkv

Tips

  • Use -crf for variable bitrate (recommended)
  • Use -b:v for constant bitrate (streaming)
  • Use -preset slow for better compression (slower encoding)
  • Use -preset ultrafast for quick encoding (larger files)
  • Add -movflags +faststart for MP4 web streaming
  • Use hardware acceleration for faster encoding on supported hardware

Related Snippets