FFmpeg
Verified@ivangdavila
npx machina-cli add skill @ivangdavila/ffmpeg --openclawInput Seeking (Major Difference)
-ssBEFORE-i: fast seek, may be inaccurate—starts from nearest keyframe-ssAFTER-i: frame-accurate but slow—decodes from start- Combine both:
-ss 00:30:00 -i input.mp4 -ss 00:00:05—fast seek then accurate trim - For cutting, add
-avoid_negative_ts make_zeroto fix timestamp issues
Stream Selection
- Default: first video + first audio—may not be what you want
- Explicit selection:
-map 0:v:0 -map 0:a:1—first video, second audio - All streams of type:
-map 0:a—all audio streams - Copy specific:
-map 0 -c copy—all streams, no re-encoding - Exclude:
-map 0 -map -0:s—all except subtitles
Encoding Quality
- CRF (Constant Rate Factor): lower = better quality, larger file—18-23 typical for H.264
-preset: ultrafast to veryslow—slower = smaller file at same quality- Two-pass for target bitrate: first pass analyzes, second pass encodes
-crfand-b:vmutually exclusive—use one or the other
Container vs Codec
- Container (MP4, MKV, WebM): wrapper format holding streams
- Codec (H.264, VP9, AAC): compression algorithm for stream
- Not all codecs fit all containers—H.264 in MP4/MKV, not WebM; VP9 in WebM/MKV, not MP4
- Copy codec to new container:
-c copy—fast, no quality loss
Filter Syntax
- Simple:
-vf "scale=1280:720"—single filter chain - Complex:
-filter_complex "[0:v]scale=1280:720[scaled]"—named outputs for routing - Chain filters:
-vf "scale=1280:720,fps=30"—comma-separated - Filter order matters—scale before crop gives different result than crop before scale
Common Filters
- Scale:
scale=1280:720orscale=-1:720for auto-width maintaining aspect - Crop:
crop=640:480:100:50—width:height:x:y from top-left - FPS:
fps=30—change framerate - Trim:
trim=start=10:end=20,setpts=PTS-STARTPTS—setpts resets timestamps - Overlay:
overlay=10:10—position from top-left
Audio Processing
- Sample rate:
-ar 48000—standard for video - Channels:
-ac 2—stereo - Audio codec:
-c:a aac -b:a 192k—AAC at 192kbps - Normalize:
-filter:a loudnorm—EBU R128 loudness normalization - Extract audio:
-vn -c:a copy output.m4a—no video, copy audio
Concatenation
- Same codec/params: concat demuxer—
-f concat -safe 0 -i list.txt -c copy - Different formats: concat filter—
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1" - list.txt format:
file 'video1.mp4'per line—escape special characters - Different resolutions: scale/pad to match before concat filter
Subtitles
- Burn-in (hardcode):
-vf "subtitles=subs.srt"—cannot be turned off - Mux as stream:
-c:s mov_text(MP4) or-c:s srt(MKV)—user toggleable - From input:
-map 0:s—include subtitle streams - Extract:
-map 0:s:0 subs.srt—first subtitle to file
Hardware Acceleration
- Decode:
-hwaccel cudaor-hwaccel videotoolbox(macOS) - Encode:
-c:v h264_nvenc(NVIDIA),-c:v h264_videotoolbox(macOS) - Not always faster—setup overhead; benefits show on long videos
- Quality may differ—software encoding often produces better quality
Common Mistakes
- Forgetting
-c copywhen not re-encoding—defaults to re-encode, slow and lossy -ssafter-ifor long videos—takes forever seeking- Audio desync after cutting—use
-async 1or-af aresample=async=1 - Filter on stream copy—filters require re-encoding;
-c copy+-vf= error - Output extension doesn't set codec—
output.mp4without-c:vuses default, may not be H.264
Overview
FFmpeg is a command-line tool to process video and audio by selecting appropriate codecs, applying filters, and encoding to target formats. It helps control quality, compatibility, and file size across containers and codecs. Mastery covers input seeking, stream selection, encoding quality, filtering, and hardware acceleration.
How This Skill Works
FFmpeg uses command-line options to map streams, choose containers and codecs, and apply filter graphs. It supports fast or frame-accurate seeking, per-stream mapping, CRF-based quality control, and complex filter chains via -vf and -filter_complex. Audio processing, concatenation, subtitles, and hardware acceleration are handled through specialized flags like -c:v, -c:a, and -hwaccel.
When to Use It
- Cutting video while trimming with fast seek (-ss before -i) and accurate trim (-ss after -i) for precise segments
- Re-encoding to a target codec/quality using CRF and preset for size-quality trade-offs
- Copying all streams to a new container without re-encoding (-c copy) to save time and avoid quality loss
- Extracting or isolating audio from a video (-vn to drop video, -c:a copy to preserve audio)
- Concatenating multiple video files with matching codecs/params using concat demuxer or filter_complex
Quick Start
- Step 1: Install FFmpeg and run ffmpeg -version to verify
- Step 2: Start with a simple command, e.g., ffmpeg -i input.mp4 -c copy output.mp4 to copy streams
- Step 3: Incrementally add filters or re-encoding options (e.g., -vf or -c:v libx264 -crf 23) and test results
Best Practices
- Explicitly map streams when you need a specific video/audio combination (-map 0:v:0 -map 0:a:1)
- Use -c copy when re-encoding is unnecessary to keep speed and prevent quality loss
- Choose CRF and -preset based on desired quality and file size (lower CRF = better quality; slower presets yield smaller files)
- Place -ss before -i for fast seeks; use -avoid_negative_ts make_zero when cutting to fix timestamps
- Ensure container and codec compatibility (e.g., H.264 in MP4; VP9 in WebM) and avoid mixing incompatible combinations
Example Use Cases
- ffmpeg -ss 00:30:00 -i input.mp4 -ss 00:00:05 -t 00:00:10 -c copy clip.mp4
- ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4
- ffmpeg -i input.mkv -c copy output.mp4
- ffmpeg -i video.mp4 -vn -c:a copy audio.m4a
- ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4