Author: Andrew Gyakobo
This is a comprehensive Python program designed to teach you FFmpeg through practical examples, covering both CLI usage and the Python ffmpeg-python library. Also do visit this medium page for more information
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpegmacOS:
brew install ffmpegWindows:
- Download from ffmpeg.org
- Extract and add to PATH
pip install ffmpeg-python pillow numpyfrom ffmpeg_masterclass import FFmpegMasterclass
# Initialize
mc = FFmpegMasterclass(output_dir="./my_output")
# Run demos with your video files
mc.demo_cli_basic_conversion('my_video.mp4')
mc.demo_ffmpeg_python_probe('my_video.mp4')
mc.demo_create_gif('my_video.mp4', start=10, duration=5)- Demo 1-3: Direct CLI command execution from Python
- Learn how to construct ffmpeg commands programmatically
- Understand input/output options, codecs, and bitrates
- Demo 4-9: Pythonic approach to ffmpeg
- Method chaining and filter application
- Probing media metadata
- Video concatenation and overlays
- Demo 10-16: Professional video processing techniques
- Frame extraction and video creation from images
- HLS streaming preparation
- Audio visualization
- Watermarking
ffmpeg [global_options] [input_options] -i input_file [output_options] output_fileVideo Codecs:
libx264- H.264 (most compatible)libx265- H.265/HEVC (better compression)libvpx-vp9- VP9 (WebM)libaom-av1- AV1 (future-proof)
Audio Codecs:
aac- AAC (most compatible)libmp3lame- MP3libopus- Opus (high quality)flac- FLAC (lossless)
CRF (Constant Rate Factor):
- Range: 0-51 (lower = better quality)
- Recommended: 18-28
- Example:
-crf 23
Bitrate:
- Video:
-b:v 2M(2 Mbps) - Audio:
-b:a 192k(192 kbps)
Presets (encoding speed):
ultrafast,superfast,veryfast,faster,fastmedium(default)slow,slower,veryslow
# Scaling
-vf "scale=1280:720" # Fixed size
-vf "scale=1280:-1" # Auto height
-vf "scale=-1:720" # Auto width
-vf "scale=iw/2:ih/2" # Half size
# Cropping
-vf "crop=w:h:x:y" # Custom crop
-vf "crop=1280:720:0:0" # From top-left
# Rotation
-vf "rotate=90*PI/180" # Rotate 90°
-vf "transpose=1" # Rotate 90° clockwise
-vf "transpose=2" # Rotate 90° counter-clockwise
-vf "hflip" # Horizontal flip
-vf "vflip" # Vertical flip
# Color Adjustment
-vf "eq=contrast=1.5:brightness=0.1"
-vf "hue=h=30:s=1.5"
-vf "colorbalance=rs=0.5:gs=0.2:bs=-0.3"
# Blur & Sharpen
-vf "boxblur=5:1" # Blur
-vf "unsharp=5:5:1.0:5:5:0.0" # Sharpen
# Stabilization
-vf "deshake"
-vf "vidstabdetect" # Step 1 of 2-pass stabilization
-vf "vidstabtransform" # Step 2 of 2-pass stabilization
# Fade Effects
-vf "fade=in:0:30" # Fade in, 30 frames
-vf "fade=out:150:30" # Fade out at frame 150
# Text Overlay
-vf "drawtext=text='Hello':fontsize=24:fontcolor=white:x=10:y=10"
-vf "drawtext=textfile=subs.txt:fontsize=24:fontcolor=white"
# Framerate
-vf "fps=30" # Set to 30 fps
-vf "fps=fps=24000/1001" # NTSC framerate# Volume
-af "volume=2.0" # Double volume
-af "volume=0.5" # Half volume
-af "volume=10dB" # Increase by 10dB
# Normalization
-af "loudnorm" # EBU R128 normalization
-af "dynaudnorm" # Dynamic audio normalization
# Fade
-af "afade=in:st=0:d=2" # Fade in, 2 seconds
-af "afade=out:st=10:d=3" # Fade out at 10s, 3 sec duration
# Equalization
-af "equalizer=f=1000:width_type=h:width=200:g=10"
# Tempo (without pitch change)
-af "atempo=1.5" # 1.5x speed
-af "atempo=0.75" # 0.75x speed
# Remove silence
-af "silenceremove=start_periods=1:stop_periods=1:detection=peak"# Combine multiple filters
-vf "scale=1280:720,eq=contrast=1.2,unsharp=5:5:1.0"
# Multiple inputs/outputs
-filter_complex "[0:v]scale=1280:720[v1];[1:v]scale=640:480[v2];[v1][v2]hstack"
# Picture-in-picture
-filter_complex "[1:v]scale=iw/4:ih/4[pip];[0:v][pip]overlay=W-w-10:H-h-10"
# Side-by-side comparison
-filter_complex "[0:v][1:v]hstack"
# Grid layout (2x2)
-filter_complex "[0:v][1:v][2:v][3:v]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0"# Using ffmpeg-python
import ffmpeg
ffmpeg.input('input.avi').output('output.mp4').run()# Using CLI
ffmpeg -i input.avi output.mp4# High compression
ffmpeg.input('large.mp4').output(
'compressed.mp4',
vcodec='libx264',
crf=28,
preset='slow'
).run()# From 30s to 45s (15s duration)
ffmpeg.input('input.mp4', ss=30, t=15).output(
'segment.mp4',
codec='copy' # No re-encoding
).run()# Extract frame at 10 seconds
ffmpeg.input('video.mp4', ss=10).output(
'thumb.jpg',
vframes=1
).run()ffmpeg -i video.mp4 -vf "subtitles=subs.srt" output.mp4video = ffmpeg.input('video_only.mp4')
audio = ffmpeg.input('audio_only.mp3')
ffmpeg.output(video.video, audio.audio, 'merged.mp4').run()ffmpeg.input('recording.mp4').filter('fps', fps=10).filter(
'scale', 720, -1
).output('demo.gif').run()from pathlib import Path
import ffmpeg
for video in Path('.').glob('*.avi'):
output = video.with_suffix('.mp4')
ffmpeg.input(str(video)).output(
str(output),
vcodec='libx264',
crf=23
).run()# No re-encoding (fastest)
ffmpeg -i input.mp4 -ss 10 -t 30 -c copy output.mp4NVIDIA GPU:
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4Intel Quick Sync:
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4Apple VideoToolbox:
ffmpeg -i input.mp4 -c:v h264_videotoolbox output.mp4ffmpeg -i input.mp4 -threads 8 output.mp4# Pass 1
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f null /dev/null
# Pass 2
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4ffmpeg -formats # List formats
ffmpeg -codecs # List codecs
ffmpeg -encoders # List encoders
ffmpeg -decoders # List decoders
ffmpeg -filters # List filtersffmpeg -i input.mp4 # Show file info without converting
ffprobe input.mp4 # Detailed media information"Unknown encoder"
- Your ffmpeg build doesn't include that encoder
- Install a full build or use alternative codec
"Invalid data found"
- File is corrupted
- Use
-err_detect ignore_errto try anyway
"Cannot find a matching stream"
- Specify stream mapping:
-map 0:v -map 0:a
MIT
Feel free to add more examples and demos! The goal is to create the most comprehensive FFmpeg learning resource.