FFmpeg 音视频处理速查表 - FFmpeg 常用命令大全
ffmpeg 的常用部分其实是一组「需求对应参数」的映射:想快就用 -c copy 直接搬运码流不做重编码,想换容器同样走 copy(容器变了而编码不变),想要小就过一遍 libx264 并用 -crf 控制画质,想做内容处理才引入滤镜(此时必须真正解码,不能再用 copy)。几个反复出错的细节值得先记住:-ss 放在 -i 之前走关键帧快速定位不精确,放在之后是逐帧精确但慢;-1 在 scale 里代表按比例自动算另一维;音频要单独处理时常用 -vn 或 -an 去掉不需要的流。表里按格式转换、裁剪、提取分离、压缩、水印字幕、音频、录屏推流分组,每组给出可直接替换路径使用的组合。
典型使用场景
面向需要把视频素材真正落地成成品文件的创作者与运维人员:转码、改容器、剪辑片段、加字幕与水印、抽帧、录制与推流。本表按「先看清流结构再动手」的原则组织——同一个输入想换封装就加 -c copy,想重编码才指定 -c:v/-c:a;抽帧、裁剪、缩放都走 -vf;多输入合成走 -filter_complex。适合剪辑前对素材体检、上线前压一版符合码率限制的产物、以及搭建 HLS 切片流程时逐条对照。
格式转换 6
ffmpeg -i input.mp4 output.aviffmpeg -i input.mp4 -c:v libx264 output.mp4ffmpeg -i input.mp4 -c:v libx265 output.mp4ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkvffmpeg -i input.gif -movflags faststart output.mp4裁剪与截取 5
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy clip.mp4ffmpeg -ss 10 -i input.mp4 -t 30 clip.mp4ffmpeg -i input.mp4 -vf "crop=640:480:0:0" output.mp4ffmpeg -i input.mp4 -vf "crop=iw/2:ih:0:0" output.mp4ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:black" output.mp4提取与分离 6
ffmpeg -i input.mp4 -vn audio.aacffmpeg -i input.mp4 -an video_only.mp4ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr thumb_%03d.pngffmpeg -i input.mp4 -r 1 frame_%03d.pngffmpeg -i input.mp4 -map 0:s:0 subtitle.srtffmpeg -i "image_%03d.png" -r 30 video.mp4压缩与画质 6
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow output.mp4ffmpeg -i input.mp4 -c:v libx264 -b:v 1M output.mp4ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4ffmpeg -i input.mp4 -c:a aac -b:a 128k output.mp4ffmpeg -i input.mp4 -c:v libx264 -preset fast -tune zerolatency output.mp4水印与字幕 5
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4ffmpeg -i input.mp4 -vf "subtitles=sub.srt" output.mp4ffmpeg -i input.mp4 -vf "drawtext=text=Hello:fontcolor=white:fontsize=24:x=10:y=10" output.mp4ffmpeg -i input.mp4 -i sub.srt -c copy -c:s mov_text output.mp4音频处理 5
ffmpeg -i input.mp4 -c:a libmp3lame -b:a 192k output.mp3ffmpeg -i input.mp3 -af "volume=2.0" output.mp3ffmpeg -i input.mp4 -af "atempo=2.0" output.mp4ffmpeg -i input.mp3 -af "silenceremove=stop_periods=1:stop_duration=1:stop_threshold=-50dB" output.mp3ffmpeg -i "concat:a.mp3|b.mp3" -c copy output.mp3录屏与流媒体 6
ffmpeg -f avfoundation -i "0:" -r 30 -t 60 screen.mp4ffmpeg -f x11grab -i :0.0 -r 25 screen.mp4ffmpeg -f v4l2 -i /dev/video0 -t 10 webcam.mp4ffmpeg -re -i input.mp4 -c copy -f flv rtmp://live.example.com/liveffmpeg -i http://example.com/stream.m3u8 -c copy output.mp4ffmpeg -i input.mp4 -hls_time 10 -hls_list_size 0 output.m3u8参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-c copy | 不重编码直接复制流:换容器时保持画质与速度,最常用的一对参数是 -c:v copy -c:a copy | ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv |
-ss(位置) / -t / -to | 裁剪时长:-ss 写在 -i 前是快速定位,写在后面则是精确定位 | ffmpeg -ss 10 -i input.mp4 -t 30 clip.mp4 |
-crf / -preset / -b:v | 画质控制三件套:CRF 越大越糊(18-28 常用),preset slow 更小更慢,-b:v 定死码率 | ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 |
-vf / -filter_complex | 滤镜链:单输入用 -vf 串管道,多输入用 overlay 等必须写 -filter_complex | ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4 |
易错点与避坑指南
现象画面和声音对不上,声音提前结束或整体越播越慢。
原因用 -vf 处理画面后视频时长变了,而音频流仍按原始时长输出,两条流被拉成不同长度。
处置给输出加 -shortest 以较短的一条流为准,或在滤镜后补 -t / -af atrim 明确对齐。
现象同一个滤镜命令换一下顺序,结果完全不一样甚至报错。
原因滤镜链是自左向右逐级喂数据,顺序决定输入输出的对象。
处置先缩放再填充黑边(scale=...,pad=...),不要把 pad 写在 scale 前面。
现象只改封装却画质变差、体积暴涨。
原因没写 -c copy,ffmpeg 用默认编码器重新编码了全部流。
处置纯换容器一律加 -c:v copy -c:a copy;同时确认目标容器支持这些编码(部分 MP4 字幕需 -c:s mov_text)。
现象字幕加进视频后播放器里没有,或烧录后字体变方块。
原因软字幕需要同时指定字幕编码,fontsdir 缺失时 drawtext/subtitles 找不到字体。
处置软字幕用 -c copy -c:s mov_text 内嵌,烧录用 -vf "subtitles=sub.srt",缺字体时加 fontsdir 指向字体目录。
排障路径
1先看清输入里到底有哪些流
ffmpeg -i input.mp4 -c copy -c:a copy output.mkv不加输出参数时 ffmpeg 只打印流信息后退出,是最快的体检方式。
2确认滤镜链的顺序是否正确
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:black" output.mp4先 scale 再 pad 才是等比缩放加黑边;反过来会让 pad 按缩放前的尺寸计算。
3把视频切成 HLS 播放列表
ffmpeg -i input.mp4 -hls_time 10 -hls_list_size 0 output.m3u8hls_time 控制切片长度,hls_list_size 0 表示保留全部分片(滑动窗口时设 1-6)。
命令示例
不改画质换容器:-c copy 直接搬流
ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv只要重新封装、不要重编码,-c copy 必须写。写 -c:v libx264 就等于对整段视频重新编码一遍,耗时可能是复制流的几百倍,画质还白白损失一代。这一步往往是排查「为什么转个格式要十分钟」的答案。
快速截取片段:-ss 放在 -i 之前
ffmpeg -ss 10 -i input.mp4 -t 30 -c copy clip.mp4-ss 在 -i 之前时 ffmpeg 直接跳到该时间点再解码,1 小时视频截 30 秒是瞬间完成;写在 -i 之后会从开头解码到目标点,慢且可能不准。想要帧精确的切点就必须把 -ss 放到 -i 后面,并放弃 -c copy。
等比缩放并补黑边到 1280x720
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:black" output.mp4这是「竖屏素材投到 16:9 播放器」的通用解法:force_original_aspect_ratio=decrease 先等比缩到不超框,pad 再用 -1:-1 自动居中补边。只写 scale=1280:720 会把画面硬拉变形,这是最常见的画质投诉来源。
两条输入做右下角水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4overlay 必须写在 -filter_complex 里,并且两个 -i 的先后顺序决定主画面/叠加层:第一个是底图。水印 PNG 带透明通道时不用加额外参数;若底图需要压到 0.5 透明度,要在 overlay 后面串 ,format=yuva420p 之类显式声明格式。
烧录字幕 + 预置快速起播
ffmpeg -i input.mp4 -vf "subtitles=sub.srt" -c:v libx264 -crf 23 -movflags faststart output.mp4烧字幕(-vf subtitles)会重编码视频,不能再配 -c copy。同时加 -movflags faststart 把 moov 原子搬到文件头,网页边下边播不会卡在前几秒。字体找不到时要显式给 fontsdir 或 force_style,否则中文会渲染成方框。
常见坑与注意事项
- 省略 -c copy 就会全量重编码:一条 4K 素材从 libx264 重编可能是几十分钟起步,CPU 跑满、风扇狂转,且画质白白损失一代。纯换容器/截取/合流场景永远先试 -c copy。
- 滤镜链的顺序即处理顺序,顺序变了结果完全不同:`scale` 必须放在 `pad` 之前(先缩后补边),`crop` 放最前才会基于原始尺寸取值。写成 pad,scale 会先补黑边再缩放,黑边一起被缩小。
- subtitles / drawtext 依赖系统字体与 libass,找不到字库时默认回退字体,中文常渲染成方框或直接报错。跨机器复现前用 -vf "subtitles=sub.srt:fontsdir=/usr/share/fonts" 显式指定字体目录。
- ffmpeg 默认覆盖已存在的输出文件且不询问。批量脚本里输出名写错(少了目录、扩展名搞反)会直接覆盖原始素材——处理前养成加 -n 或输出到新文件名的习惯。
- 截取时 -ss 位置不同结果不同:放 -i 前是快速关键帧跳转,切点可能偏移几帧且被 GOP 边界影响;放 -i 后才是逐帧解码的精确切点。需要精确切点就接受慢,别两者混用后再抱怨对不上。
- concat 滤镜与 concat 协议对输入格式的假设不同:`-f concat` 要求列表内所有文件编码参数完全一致,否则拼接出的文件在后半段无声或花屏。格式不一致时先各自转成同一编码再拼。
提示
- -c copy 模式只复制流不重新编码,速度极快但无法做滤镜处理。
- CRF 值推荐 18-28,18 接近无损,23 是默认值,28 文件较小。
- -ss 放在 -i 前面是快速定位但不精确,放在 -i 后面是精确但较慢。
- scale 滤镜中 -1 表示等比缩放,如 scale=1280:-1 宽度 1280 高度自动计算。
- -preset 越慢压缩率越高:ultrafast < superfast < veryfast < faster < fast < medium < slow < slower < veryslow。
- 推流直播用 -re 参数按实际帧率读取,避免推流过快导致服务器拒绝。
- ffprobe -v error -show_entries format=duration,size -of default=noprint_wrappers=1 探容器信息,不必先转码。
- 合并音视频要三条流各自 -c copy 后交给 concat demuxer,MP4 用 -movflags +faststart 放到文件头才好边下边播。
- 批量处理用 for 循环配 -y 覆盖已有输出;不加 -y 时 ffmpeg 会卡在交互确认上等输入。
常见问题
生成 HLS 切片时,-hls_time 和 -hls_list_size 该怎么设?
ffmpeg -i input.mp4 -hls_time 10 -hls_list_size 0 output.m3u8 是本表里的标准切片命令。-hls_time 10 表示每 10 秒切一个分片,这个值要和你输出视频的关键帧间隔对齐,切点落在关键帧上播放器才能无缝拼接,太短会让索引文件暴涨。-hls_list_size 0 表示播放列表保留全部分片不滚动,做成可回看的点播列表就用它;如果只是直播、只需要滑动窗口,就给它一个正数,比如 6 表示只保留最近 6 个分片。
想把一个 m3u8 直播流整段存成本地文件,用什么参数组合?
用 ffmpeg -i http://example.com/stream.m3u8 -c copy output.mp4。关键是 -c copy:m3u8 背后的分片本身已经是可播放的编码流,复制即可,不需要重新编码,所以速度接近网络带宽上限,画质也零损失。整个过程必须一次跑完,ffmpeg 会持续跟随播放列表往后拉,直到流结束才写出文件。如果落盘容器不合适,再单独做一次 -c copy 的换封装,而不是在这条命令里改编码。
抽帧有两种写法,什么场景该用哪个?
按固定时间密度抽帧用 -r:ffmpeg -i input.mp4 -r 1 frame_%03d.png 是每秒一张,适合做缩略图墙、给列表页配封面。关键帧抽帧用滤镜:ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr thumb_%03d.png 只吐 I 帧,数量取决于源文件的关键帧密度,通常比按时抽少很多,而且每张都是可以独立解码的完整画面。缩略图这类要体积小、数量可控的用 -r;要的是「每个镜头切换点」这种语义化切分,就按 select 配 -vsync vfr。
同一个素材要压体积,-crf 和 -b:v 该选哪个?
两个控制的是不同维度。-crf 是恒定质量,编码器逐帧决定该给多少码率:ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 是默认值,18 接近无损,往上调体积明显变小,同一份素材跑两次结果也一致,适合存档和二次剪辑的母版。-b:v 是恒定码率,给多少就压到多少:ffmpeg -i input.mp4 -c:v libx264 -b:v 1M output.mp4 适合有码率上限的投放场景,播放器和解码端能提前预估带宽。要求体积可控又要质量稳定时,可以把两者组合:先 -crf 18 -preset slow 出高质量版本,再对成品用 -b:v 压到目标码率。
把一串图片合成视频,为什么帧率参数要写在输出端?
ffmpeg -i "image_%03d.png" -r 30 video.mp4 里的 -r 30 是输出帧率:ffmpeg 会把输入图片序列当成无限长的连续帧流,按 30fps 铺开,所以最终视频的时长等于图片张数除以 30。四十张图就是一秒出头的短片。输入侧那个 %03d 是零补三位序号,图片必须是连续编号才能被匹配上,缺号或从别处起编都会导致读到一半就停。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。