开始前
不确定本机有哪些编码器、过滤器或硬件加速时,先查能力再下命令:
ffmpeg -version
ffmpeg -encoders
ffmpeg -filters
ffmpeg -hwaccels
ffmpeg -pix_fmts
查看输入文件的流信息:
ffprobe -hide_banner input.mp4
选项顺序:输入选项放在对应
-i 之前,输出选项放在输出文件之前。非全局选项默认只作用于紧随其后的文件或流。场景速查
场景 1:只换封装,不重新编码
源编码与目标容器兼容时优先用流复制,速度最快、零质量损失。
ffmpeg -i input.mkv -map 0 -c copy output.mp4
容器不兼容某个流(例如 MP4 不接受某些字幕)时会报错,回到对应场景做转码或单独跳过。
场景 2:转成兼容性较好的 H.264 / AAC MP4
ffmpeg -i input.mov \
-map 0:v:0 -map 0:a:0? \
-c:v libx264 -crf 23 -preset medium \
-pix_fmt yuv420p \
-c:a aac -b:a 192k \
-movflags +faststart output.mp4
?把音频映射设为可选,源文件没音轨也不会失败。-movflags +faststart把 MP4 的 moov 原子挪到文件头,便于 Web 渐进播放。libx264与libfdk_aac等编码器是否可用,取决于本机 FFmpeg 的编译配置。
场景 3:截取片段
# 复制流(快速、起点对齐到关键帧)
ffmpeg -ss 00:01:30 -i input.mp4 -t 20 -c copy output.mp4
# 重新编码(精确到任意时间点)
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:01:50 \
-c:v libx264 -crf 23 -c:a aac output.mp4
-ss 在 -i 之前是 demuxer 定位(快),在 -i 之后是 decoder 定位(精确)。
场景 4:缩放并保持比例
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:a copy output-720p.mp4
-2 表示"按源比例计算另一维,并保证结果为偶数",避免画面被强行拉伸。
场景 5:裁剪与补边
# 裁剪为 1280×720,起点在源坐标 (100, 50)
ffmpeg -i input.mp4 -vf "crop=1280:720:100:50" output.mp4
# 补成 1920×1080,原画面居中
ffmpeg -i input.mp4 -vf "pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" output.mp4
场景 6:在指定时间截一张图
ffmpeg -ss 00:00:08 -i input.mp4 -frames:v 1 -q:v 2 thumbnail.jpg
要同时缩放可加 -vf "scale=1280:-2"。
场景 7:提取 / 移除 / 调整音频
# 提取音频并编码为 MP3
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k output.mp3
# 保留视频,移除所有音频
ffmpeg -i input.mp4 -map 0:v -c:v copy -an silent.mp4
# 音量调整 1.5 倍
ffmpeg -i input.mp4 -af "volume=1.5" output.mp4
场景 8:写入元数据
ffmpeg -i input.mp4 -c copy \
-metadata title="演示视频" \
-metadata artist="范庆林" \
-metadata comment="整理于 2026" output.mp4
不同容器支持的元数据字段不同(ID3、QuickTime、Matroska 各有差异),写入后用 ffprobe 校验是否落地。
场景 9:手动选择流
# 选第一个视频流与第一个音频流;音频缺失不报错
ffmpeg -i input.mkv \
-map 0:v:0 -map 0:a:0? \
-c:v libx264 -c:a aac output.mp4
# 同时保留全部字幕
ffmpeg -i input.mkv -map 0 -c copy output.mp4
使用
-map 后将关闭默认的自动流选择。处理多音轨、多字幕或批处理脚本时务必显式 -map,避免漏选或多选。参数、默认行为与编码器能力可能随版本变化,使用前请同时核对本机版本。