Skip to content

FFmpeg 入门指南:从"它是什么"到"常用命令速查"

一、FFmpeg 是什么

FFmpeg 是一套开源、跨平台的命令行音视频处理工具集,几乎支撑了全世界绝大多数音视频软件的底层:B站、抖音、VLC、OBS、HandBrake、甚至 Chrome 浏览器的部分解码路径,都在用它。

它的核心能力可以概括为四类:

  1. 转码 / 转封装:在上百种编码(H.264/H.265/AV1/VP9/AAC/Opus…)与封装格式(MP4/MKV/FLV/MOV/TS/WebM…)之间自由转换
  2. 编辑加工:剪切、拼接、缩放、旋转、加水印、调音量、变速、加字幕、画中画
  3. 抽取与转换:从视频里抽音频、抽帧、抽字幕;把图片序列合成视频
  4. 采集与推拉流:录屏录音、拉 RTSP/RTMP/HLS、推流到直播服务器

命令的基本骨架永远是这一行:

bash
ffmpeg [全局选项] -i 输入1 [输入选项] -i 输入2 ... [输出选项] 输出文件

记住一个口诀:"-i 之前的选项作用于输入,-i 之后的选项作用于输出",大部分疑惑都能自己解开。

以下命令默认在 Linux/macOS 终端执行;Windows 下只需把路径斜杠改成 \ 或用引号包裹,其他完全一致。

二、查看多媒体文件信息

任何操作之前先看一眼文件本身的编码、分辨率、时长、码率,是最基本的习惯。

bash
ffmpeg -i input.mp4
  • 不指定输出,FFmpeg 会打印文件的流信息后报 "At least one output file must be specified",这是正常现象
  • 想拿到更干净、结构化的结果,用 ffprobe
bash
ffprobe -v error -show_format -show_streams input.mp4
  • -v error:只显示错误,屏蔽一堆横幅日志
  • -show_format:显示容器信息(时长、总码率、大小)
  • -show_streams:显示每一路流(视频/音频/字幕)的详细参数
bash
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,codec_name -of json input.mp4
  • -select_streams v:0:只看第一路视频流
  • -show_entries:只挑想看的字段,避免噪音
  • -of json:输出 JSON,方便脚本解析

三、音视频格式转换

1. 容器转换(不重新编码,速度极快)

当源文件的视频/音频编码本身就能放进目标容器时,用 copy 直接"换壳子":

bash
ffmpeg -i input.mkv -c copy output.mp4
  • -c copy:视频和音频流都原样拷贝,不重新编码
  • 几秒钟就能完成几 GB 的转换,且画质零损失
  • 注意:有些编码不兼容目标容器(如 MKV 里的字幕放不进 MP4),这种情况下会报错,需要换下面的重编码方案

2. 重新编码转格式

bash
ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
  • -c:v libx264:视频用 H.264 编码器
  • -crf 23:质量因子,0 无损、18 视觉无损、23 默认、28 体积小画质一般,推荐 18–28
  • -c:a aac -b:a 128k:音频转 AAC,码率 128kbps

3. 提取音频为 MP3

bash
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k output.mp3
  • -vn:No Video,丢弃视频流
  • -c:a libmp3lame:使用 LAME MP3 编码器
  • -b:a 192k:音频码率 192kbps

4. 提取音频但不重编码(保持原始质量)

bash
ffmpeg -i input.mp4 -vn -c:a copy output.m4a
  • 如果原视频音轨是 AAC,.m4a 容器可直接装,速度极快、零损失

四、裁剪视频(按时间段截取)

bash
ffmpeg -ss 00:01:30 -to 00:02:45 -i input.mp4 -c copy output.mp4
  • -ss 00:01:30:起始时间 1 分 30 秒
  • -to 00:02:45:结束时间 2 分 45 秒(也可以用 -t 75 表示持续时长 75 秒)
  • -c copy:不重编码,超快
  • 注意-ss 放在 -i 之前 是快速定位(关键帧对齐,可能有少许偏差);放在 -i 之后 是精确定位(需要解码,慢但准)。大段剪切用前者,逐帧精度用后者 + 重编码
bash
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:45 -c:v libx264 -crf 20 -c:a aac output.mp4
  • 精确剪切 + 重编码版本,适合截出的片段要严格从某一帧开始

五、抽取 / 替换音频轨道

1. 去掉音频(静音视频)

bash
ffmpeg -i input.mp4 -c:v copy -an output.mp4
  • -an:No Audio,移除所有音轨

2. 替换音频轨道

bash
ffmpeg -i video.mp4 -i new_audio.m4a -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 -shortest output.mp4
  • -map 0:v:0:取第一个输入(video.mp4)的第 0 路视频流
  • -map 1:a:0:取第二个输入(new_audio.m4a)的第 0 路音频流
  • -shortest:以最短流的长度为准,避免音画时长不一致

3. 仅抽取视频流(无音频)

bash
ffmpeg -i input.mp4 -an -c:v copy output_video_only.mp4

六、抽取视频帧为图片

1. 每秒抽 1 帧

bash
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
  • -vf fps=1:视频滤镜,设置输出帧率为 1fps
  • frame_%04d.png:输出文件名模板,%04d 是 4 位数字(0001、0002…)

2. 只抽一张封面图(第 5 秒那一帧)

bash
ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 -q:v 2 cover.jpg
  • -frames:v 1:只输出 1 帧视频
  • -q:v 2:JPEG 质量,范围 2–31,数值越小质量越高

3. 抽所有关键帧(I 帧)

bash
ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr keyframe_%04d.jpg
  • select=eq(pict_type,I):只选类型为 I 帧的帧
  • -vsync vfr:可变帧率输出,避免重复帧

七、调整分辨率、码率、帧率

1. 缩放分辨率

bash
ffmpeg -i input.mp4 -vf scale=1280:720 -c:a copy output.mp4
  • scale=1280:720:强制缩放到 1280×720
bash
ffmpeg -i input.mp4 -vf scale=1280:-2 -c:a copy output.mp4
  • -2 表示高度按宽度等比例计算,并保证结果是 偶数(H.264 要求)。比写死数字更通用

2. 控制码率(CBR / VBR)

bash
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 2.5M -bufsize 4M -c:a copy output.mp4
  • -b:v 2M:目标视频码率 2Mbps
  • -maxrate + -bufsize:限制峰值码率,保证流畅播放

3. 修改帧率

bash
ffmpeg -i input.mp4 -r 30 -c:a copy output.mp4
  • -r 30:输出帧率 30fps;源比它高会抽帧,低会补帧

4. 一条命令同时改三项

bash
ffmpeg -i input.mp4 -vf scale=1280:-2 -r 30 -c:v libx264 -b:v 2M -c:a copy output.mp4

八、合并多个片段

情况 A:所有片段编码完全一致(最常见,最快)

先写一个文本清单 list.txt

file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'

再用 concat demuxer:

bash
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
  • -f concat:使用 concat 解复用器
  • -safe 0:允许非相对路径的文件名
  • -c copy:无需重编码,秒级完成
  • 前提:所有片段的编码、分辨率、帧率、采样率必须一致,否则会花屏或报错

情况 B:片段编码不同,需要重编码后合并

bash
ffmpeg -i part1.mp4 -i part2.mp4 -i part3.mp4 \
  -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
  -map "[v]" -map "[a]" -c:v libx264 -crf 23 -c:a aac output.mp4
  • concat=n=3:v=1:a=1:拼接 3 段,每段含 1 路视频 + 1 路音频
  • -map "[v]" -map "[a]":把拼接后的流映射到输出
  • 较慢,但能处理任意编码/分辨率/帧率差异

九、录屏与推拉流(简要了解)

1. macOS 录屏

bash
ffmpeg -f avfoundation -framerate 30 -i "1:0" output.mov
  • -f avfoundation:macOS 的采集框架
  • "1:0":屏幕 1 + 音频设备 0,具体编号用 ffmpeg -f avfoundation -list_devices true -i "" 查看

2. Linux 录屏(X11)

bash
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 output.mp4

3. 拉 RTSP 摄像头流并保存

bash
ffmpeg -rtsp_transport tcp -i rtsp://user:pass@192.168.1.10/stream1 -c copy record.mp4
  • -rtsp_transport tcp:强制 TCP,稳定性优于默认 UDP

4. 推流到 RTMP 直播服务器

bash
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://live.example.com/live/streamKey
  • -re:按原速读取输入,模拟真实直播节奏
  • -f flv:RTMP 要求 FLV 封装

十、继续深入的方向

  • ffmpeg -h / ffmpeg -h full 查看全部选项;分主题查帮助如 ffmpeg -h encoder=libx264ffmpeg -h filter=scale,信息最权威
  • ffmpeg -codecsffmpeg -formatsffmpeg -filters 查询当前版本支持的编码器、封装格式、滤镜列表
  • 进阶三大主题:滤镜图(filtergraph)硬件加速(NVENC/QSV/VideoToolbox)多输入多输出映射(-map)
  • 官方文档 ffmpeg.org/documentation.html 是最终真相;遇到报错贴完整 log(含版本与命令)去搜,比盲猜快得多
  • 日常养成习惯:先 ffprobe 看输入、再想好 "改什么 / 保留什么"、最后组装命令,思路永远清晰

掌握上面这十几条命令,已经能覆盖 80% 以上的日常音视频处理需求;剩下的进阶玩法基本都是在这些基础上叠加滤镜和参数。