FFMPEG Commands
FFMPEG is a powerful multimedia framework for recording, converting, and streaming audio and video.
Installation
Linux
bash
# Ubuntu/Debian
sudo apt update
sudo apt install ffmpeg
# RHEL/CentOS
sudo yum install ffmpeg
# Arch Linux
sudo pacman -S ffmpegmacOS
bash
# Using Homebrew
brew install ffmpegWindows
Download from ffmpeg.org or use:
powershell
# Using Chocolatey
choco install ffmpeg
# Using Scoop
scoop install ffmpegJoining Videos
Concatenate Videos (Same Format)
Method 1: Using concat demuxer (from README)
Create input file listing all videos:
input.txt:
text
file '01.mp4'
file '02.mp4'
file '03.mp4'bash
# Join videos
ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4Method 2: Using concat filter
bash
# Join two videos
ffmpeg -i video1.mp4 -i video2.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4Method 3: Using concat protocol (for similar files)
bash
ffmpeg -i "concat:video1.mp4|video2.mp4|video3.mp4" -c copy output.mp4Join Videos of Different Formats
bash
# Re-encode to common format
ffmpeg -i video1.avi -i video2.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4Adding Audio to Video
Replace Video Audio with Music (from README)
bash
# Take video from first input, audio from second
ffmpeg -i video.mp4 -i music.mp4 \
-map 0:v -map 1:a \
-c:v copy -c:a copy \
-shortest \
video_with_music.mp4Explanation:
-map 0:v: Use video stream from first input (video.mp4)-map 1:a: Use audio stream from second input (music.mp4)-c:v copy: Copy video without re-encoding-c:a copy: Copy audio without re-encoding-shortest: End output when shortest input ends
Add Audio to Video Without Audio
bash
# Add music to silent video
ffmpeg -i video.mp4 -i music.mp3 \
-c:v copy -c:a aac -shortest \
output.mp4Mix Audio Tracks
bash
# Mix original audio with background music
ffmpeg -i video.mp4 -i music.mp3 \
-filter_complex "[0:a][1:a]amerge=inputs=2[a]" \
-map 0:v -map "[a]" -c:v copy -c:a aac -shortest \
output.mp4Video Conversion
Change Format
bash
# MP4 to AVI
ffmpeg -i input.mp4 output.avi
# AVI to MP4
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
# MOV to MP4
ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4
# MKV to MP4
ffmpeg -i input.mkv -c copy output.mp4Change Codec
bash
# Change video codec to H.264
ffmpeg -i input.mp4 -c:v libx264 -c:a copy output.mp4
# Change audio codec to AAC
ffmpeg -i input.mp4 -c:v copy -c:a aac output.mp4
# Change both codecs
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4Change Resolution
bash
# Scale to 720p
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
# Scale to 1080p
ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4
# Scale maintaining aspect ratio
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
# Scale to half size
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4Video Trimming and Cutting
Cut Video Segment
bash
# Cut from 00:01:00 for 30 seconds
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -c copy output.mp4
# Cut from start to specific time
ffmpeg -i input.mp4 -t 00:01:00 -c copy output.mp4
# Cut from specific time to end
ffmpeg -i input.mp4 -ss 00:01:00 -c copy output.mp4
# Fast seeking (less accurate but faster)
ffmpeg -ss 00:01:00 -i input.mp4 -t 00:00:30 -c copy output.mp4Remove Audio or Video
bash
# Remove audio, keep video
ffmpeg -i input.mp4 -c:v copy -an output.mp4
# Remove video, keep audio
ffmpeg -i input.mp4 -c:a copy -vn output.mp3
# Extract audio as MP3
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3Video Effects
Rotate Video
bash
# Rotate 90 degrees clockwise
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# Rotate 90 degrees counter-clockwise
ffmpeg -i input.mp4 -vf "transpose=2" output.mp4
# Rotate 180 degrees
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4Flip Video
bash
# Flip horizontally
ffmpeg -i input.mp4 -vf "hflip" output.mp4
# Flip vertically
ffmpeg -i input.mp4 -vf "vflip" output.mp4Add Watermark
bash
# Add image watermark
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=10:10" \
output.mp4
# Add text watermark
ffmpeg -i input.mp4 \
-vf "drawtext=text='Copyright':fontsize=24:fontcolor=white:x=10:y=10" \
output.mp4Crop Video
bash
# Crop to specific dimensions
ffmpeg -i input.mp4 -vf "crop=640:480:0:0" output.mp4
# Crop center
ffmpeg -i input.mp4 -vf "crop=640:480" output.mp4Video Compression
Reduce File Size
bash
# Reduce quality (lower CRF = higher quality, 18-28 is good range)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 output.mp4
# Reduce resolution and quality
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -crf 28 output.mp4
# Two-pass encoding (better quality)
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 output.mp4Reduce Bitrate
bash
# Set video bitrate
ffmpeg -i input.mp4 -b:v 1M output.mp4
# Set audio bitrate
ffmpeg -i input.mp4 -c:v copy -b:a 128k output.mp4Video Speed
Change Speed
bash
# Speed up 2x
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4
# Slow down 0.5x
ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" output.mp4
# Speed up video and audio
ffmpeg -i input.mp4 \
-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" \
-map "[v]" -map "[a]" output.mp4Audio Manipulation
Extract Audio
bash
# Extract as MP3
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 audio.mp3
# Extract as WAV
ffmpeg -i video.mp4 -vn -c:a pcm_s16le audio.wav
# Extract as AAC
ffmpeg -i video.mp4 -vn -c:a aac -b:a 192k audio.aacChange Volume
bash
# Increase volume by 50%
ffmpeg -i input.mp4 -af "volume=1.5" output.mp4
# Decrease volume by 50%
ffmpeg -i input.mp4 -af "volume=0.5" output.mp4
# Increase volume in dB
ffmpeg -i input.mp4 -af "volume=10dB" output.mp4Normalize Audio
bash
# Normalize audio levels
ffmpeg -i input.mp4 -af "loudnorm" output.mp4Creating GIFs
Convert Video to GIF
bash
# Basic conversion
ffmpeg -i input.mp4 output.gif
# High quality GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" output.gif
# Optimized GIF with palette
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gifScreen Recording
Record Screen (Linux with X11)
bash
# Record full screen
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
# Record specific area
ffmpeg -f x11grab -s 1280x720 -i :0.0+100,200 output.mp4Record Screen (macOS)
bash
# Record screen
ffmpeg -f avfoundation -i "1" output.mp4
# Record screen with audio
ffmpeg -f avfoundation -i "1:0" output.mp4Record Screen (Windows)
bash
# Record using gdigrab
ffmpeg -f gdigrab -framerate 30 -i desktop output.mp4
# Record with specific size
ffmpeg -f gdigrab -framerate 30 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop output.mp4Information Commands
Get Video Information
bash
# Basic information
ffmpeg -i input.mp4
# Detailed information
ffprobe -i input.mp4
# Show only video stream info
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height,duration -of default=noprint_wrappers=1 input.mp4
# Show duration
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4Batch Processing
Convert Multiple Files
bash
# Convert all AVI files to MP4
for f in *.avi; do
ffmpeg -i "$f" -c:v libx264 -c:a aac "${f%.avi}.mp4"
done
# Convert all videos to specific resolution
for f in *.mp4; do
ffmpeg -i "$f" -vf scale=1280:-1 "resized_$f"
doneCommon Options
Quality Settings
bash
# High quality
-c:v libx264 -preset slow -crf 18
# Medium quality (default)
-c:v libx264 -preset medium -crf 23
# Low quality (small file)
-c:v libx264 -preset fast -crf 28Presets
Available presets (speed vs compression):
- ultrafast
- superfast
- veryfast
- faster
- fast
- medium (default)
- slow
- slower
- veryslow
Troubleshooting
Common Issues
Codec not found:
bash
# Check available codecs
ffmpeg -codecs
# Check specific codec
ffmpeg -codecs | grep h264Audio sync issues:
bash
# Re-sync audio
ffmpeg -i input.mp4 -itsoffset 0.5 -i input.mp4 -map 0:v -map 1:a -c copy output.mp4File size too large:
bash
# Reduce with CRF
ffmpeg -i input.mp4 -c:v libx264 -crf 28 output.mp4
# Or set bitrate
ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4See Also
- Cross-Platform Commands - Terminal commands across OSes
- Linux File Operations - File management