FFmpeg 音视频处理速查表 - FFmpeg 常用命令大全

ffmpeg 的常用部分其实是一组「需求对应参数」的映射:想快就用 -c copy 直接搬运码流不做重编码,想换容器同样走 copy(容器变了而编码不变),想要小就过一遍 libx264 并用 -crf 控制画质,想做内容处理才引入滤镜(此时必须真正解码,不能再用 copy)。几个反复出错的细节值得先记住:-ss 放在 -i 之前走关键帧快速定位不精确,放在之后是逐帧精确但慢;-1 在 scale 里代表按比例自动算另一维;音频要单独处理时常用 -vn 或 -an 去掉不需要的流。表里按格式转换、裁剪、提取分离、压缩、水印字幕、音频、录屏推流分组,每组给出可直接替换路径使用的组合。

系统与运维·共 39 条命令·最后更新 2026-07-21
ffmpeg视频音频转码

典型使用场景

面向需要把视频素材真正落地成成品文件的创作者与运维人员:转码、改容器、剪辑片段、加字幕与水印、抽帧、录制与推流。本表按「先看清流结构再动手」的原则组织——同一个输入想换封装就加 -c copy,想重编码才指定 -c:v/-c:a;抽帧、裁剪、缩放都走 -vf;多输入合成走 -filter_complex。适合剪辑前对素材体检、上线前压一版符合码率限制的产物、以及搭建 HLS 切片流程时逐条对照。

格式转换 6

ffmpeg -i input.mp4 output.avi
转换容器格式,自动选择编码器
ffmpeg -i input.mp4 -c:v libx264 output.mp4
指定 H.264 编码重新封装
ffmpeg -i input.mp4 -c:v libx265 output.mp4
转 H.265 编码(体积更小)
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
WAV 转 MP3,-q:a 2 约 190kbps
ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv
无损复制流到 MKV 容器,速度极快
ffmpeg -i input.gif -movflags faststart output.mp4
GIF 转 MP4,faststart 适合网页

裁剪与截取 5

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy clip.mp4
截取 1:00 到 2:00 片段,-c copy 快速模式
ffmpeg -ss 10 -i input.mp4 -t 30 clip.mp4
从第 10 秒开始截取 30 秒(-ss 在 -i 前)
ffmpeg -i input.mp4 -vf "crop=640:480:0:0" output.mp4
裁剪画面为 640x480,起始坐标 (0,0)
ffmpeg -i input.mp4 -vf "crop=iw/2:ih:0:0" output.mp4
裁剪左半边画面
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:-1:-1:black" output.mp4
等比缩放并填充黑边到 1280x720

提取与分离 6

ffmpeg -i input.mp4 -vn audio.aac
提取音轨,-vn 去掉视频流
ffmpeg -i input.mp4 -an video_only.mp4
去掉音轨保留视频,-an 去掉音频
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr thumb_%03d.png
提取关键帧为图片
ffmpeg -i input.mp4 -r 1 frame_%03d.png
每秒提取一张帧图片
ffmpeg -i input.mp4 -map 0:s:0 subtitle.srt
提取字幕轨为 SRT 文件
ffmpeg -i "image_%03d.png" -r 30 video.mp4
图片序列合成视频

压缩与画质 6

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
CRF 压缩,值越大画质越低(18-28 常用)
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow output.mp4
高质量压缩,preset slow 编码更慢但文件更小
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M output.mp4
限制视频码率为 1Mbps
ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4
等比缩放到宽度 1280px
ffmpeg -i input.mp4 -c:a aac -b:a 128k output.mp4
音频转 AAC 并指定 128kbps
ffmpeg -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.mp4
左上角添加图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
右下角添加水印
ffmpeg -i input.mp4 -vf "subtitles=sub.srt" output.mp4
烧录 SRT 字幕到视频
ffmpeg -i input.mp4 -vf "drawtext=text=Hello:fontcolor=white:fontsize=24:x=10:y=10" output.mp4
添加文字水印
ffmpeg -i input.mp4 -i sub.srt -c copy -c:s mov_text output.mp4
软字幕(可开关)嵌入 MP4

音频处理 5

ffmpeg -i input.mp4 -c:a libmp3lame -b:a 192k output.mp3
转 MP3 并指定 192kbps 码率
ffmpeg -i input.mp3 -af "volume=2.0" output.mp3
音量放大 2 倍
ffmpeg -i input.mp4 -af "atempo=2.0" output.mp4
音频 2 倍速播放(不改音调)
ffmpeg -i input.mp3 -af "silenceremove=stop_periods=1:stop_duration=1:stop_threshold=-50dB" output.mp3
移除静音片段
ffmpeg -i "concat:a.mp3|b.mp3" -c copy output.mp3
拼接多个音频文件

录屏与流媒体 6

ffmpeg -f avfoundation -i "0:" -r 30 -t 60 screen.mp4
macOS 录屏 60 秒(avfoundation)
ffmpeg -f x11grab -i :0.0 -r 25 screen.mp4
Linux 录屏(X11)
ffmpeg -f v4l2 -i /dev/video0 -t 10 webcam.mp4
从摄像头录制 10 秒
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://live.example.com/live
RTMP 推流直播
ffmpeg -i http://example.com/stream.m3u8 -c copy output.mp4
下载 HLS 直播流为本地文件
ffmpeg -i input.mp4 -hls_time 10 -hls_list_size 0 output.m3u8
将视频切片为 HLS 播放列表

参数矩阵

参数作用示例
-c copy不重编码直接复制流:换容器时保持画质与速度,最常用的一对参数是 -c:v copy -c:a copyffmpeg -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_complexffmpeg -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. 1先看清输入里到底有哪些流

    ffmpeg -i input.mp4 -c copy -c:a copy output.mkv

    不加输出参数时 ffmpeg 只打印流信息后退出,是最快的体检方式。

  2. 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. 3把视频切成 HLS 播放列表

    ffmpeg -i input.mp4 -hls_time 10 -hls_list_size 0 output.m3u8

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

overlay 必须写在 -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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们