Skip to content

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 ffmpeg

macOS

bash
# Using Homebrew
brew install ffmpeg

Windows

Download from ffmpeg.org or use:

powershell
# Using Chocolatey
choco install ffmpeg

# Using Scoop
scoop install ffmpeg

Joining 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.mp4

Method 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.mp4

Method 3: Using concat protocol (for similar files)

bash
ffmpeg -i "concat:video1.mp4|video2.mp4|video3.mp4" -c copy output.mp4

Join 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.mp4

Adding 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.mp4

Explanation:

  • -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.mp4

Mix 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.mp4

Video 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.mp4

Change 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.mp4

Change 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.mp4

Video 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.mp4

Remove 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.mp3

Video 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.mp4

Flip Video

bash
# Flip horizontally
ffmpeg -i input.mp4 -vf "hflip" output.mp4

# Flip vertically
ffmpeg -i input.mp4 -vf "vflip" output.mp4

Add 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.mp4

Crop 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.mp4

Video 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.mp4

Reduce 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.mp4

Video 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.mp4

Audio 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.aac

Change 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.mp4

Normalize Audio

bash
# Normalize audio levels
ffmpeg -i input.mp4 -af "loudnorm" output.mp4

Creating 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.gif

Screen 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.mp4

Record Screen (macOS)

bash
# Record screen
ffmpeg -f avfoundation -i "1" output.mp4

# Record screen with audio
ffmpeg -f avfoundation -i "1:0" output.mp4

Record 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.mp4

Information 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.mp4

Batch 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"
done

Common 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 28

Presets

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 h264

Audio 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.mp4

File 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.mp4

See Also

External Resources

Released under the MIT License.