Video Extract
Process video files with ffmpeg: extract frames, clips, audio, and more.
Prerequisites
Install ffmpeg:
brew install ffmpeg
Verify: ffmpeg -version
Commands
Video Info
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# Quick summary:
ffprobe -v error -show_entries format=duration,size,bit_rate \
-show_entries stream=codec_name,width,height,r_frame_rate input.mp4
Extract Frames
# Single frame at timestamp
ffmpeg -y -i input.mp4 -ss 00:01:30 -vframes 1 frame.jpg
# Frame every N seconds
ffmpeg -y -i input.mp4 -vf fps=1/5 frames/frame_%04d.jpg # every 5 sec
# All frames (use sparingly on long videos)
ffmpeg -y -i input.mp4 frames/frame_%04d.png
Extract / Trim Clip
# Clip from start time, duration
ffmpeg -y -ss 00:00:30 -i input.mp4 -t 00:00:15 -c copy clip.mp4
# Clip from start to end time
ffmpeg -y -ss 00:01:00 -to 00:02:30 -i input.mp4 -c copy clip.mp4
# Re-encode for clean cut (slower but frame-accurate)
ffmpeg -y -i input.mp4 -ss 00:00:30 -t 00:00:15 clip.mp4
Extract Audio
# Extract as MP3
ffmpeg -y -i input.mp4 -vn -acodec mp3 -q:a 2 audio.mp3
# Extract as AAC (smaller)
ffmpeg -y -i input.mp4 -vn -acodec aac -b:a 192k audio.aac
# Extract as WAV (lossless)
ffmpeg -y -i input.mp4 -vn audio.wav
Format Conversion
# To MP4 (H.264 + AAC, web-compatible)
ffmpeg -y -i input.mov -c:v libx264 -c:a aac -crf 23 output.mp4
# To WebM
ffmpeg -y -i input.mp4 -c:v libvpx-vp9 -c:a libopus output.webm
# To GIF
ffmpeg -y -i input.mp4 -vf "fps=10,scale=640:-1" output.gif
# Compress (reduce size)
ffmpeg -y -i input.mp4 -vcodec libx264 -crf 28 compressed.mp4
Create Thumbnail
# At specific timestamp
ffmpeg -y -i input.mp4 -ss 00:00:05 -vframes 1 -vf scale=640:-1 thumb.jpg
# Best frame (scene detection)
ffmpeg -y -i input.mp4 -vf "thumbnail,scale=640:-1" -frames:v 1 thumb.jpg
Subtitles
# Extract embedded subtitles
ffmpeg -y -i input.mkv -map 0:s:0 subtitles.srt
# Burn subtitles into video
ffmpeg -y -i input.mp4 -vf subtitles=subtitles.srt output_with_subs.mp4
Usage Examples
"Extract a frame every 10 seconds from lecture.mp4"
mkdir -p frames
ffmpeg -y -i lecture.mp4 -vf fps=1/10 frames/frame_%04d.jpg
echo "Frames saved to ./frames/"
"Cut from 2:30 to 5:00 in video.mp4"
ffmpeg -y -ss 00:02:30 -to 00:05:00 -i video.mp4 -c copy clip_2m30s_to_5m.mp4
"Get the audio from interview.mp4 as MP3"
ffmpeg -y -i interview.mp4 -vn -acodec mp3 -q:a 2 interview_audio.mp3
"Convert recording.mov to mp4"
ffmpeg -y -i recording.mov -c:v libx264 -c:a aac -crf 23 recording.mp4
Rules
- Check if ffmpeg is installed first:
which ffmpeg - If not installed, show
brew install ffmpegand stop - Always use
-yflag to avoid interactive prompts - Use
-c copyfor lossless clip extraction when possible (much faster) - For large files, warn user about processing time before starting long operations
- Default output goes in the same directory as input with a descriptive suffix
- When extracting many frames, create a subdirectory to avoid clutter
- Report output file path and size after completion