FFmpeg 入门指南:从"它是什么"到"常用命令速查"
一、FFmpeg 是什么
FFmpeg 是一套开源、跨平台的命令行音视频处理工具集,几乎支撑了全世界绝大多数音视频软件的底层:B站、抖音、VLC、OBS、HandBrake、甚至 Chrome 浏览器的部分解码路径,都在用它。
它的核心能力可以概括为四类:
- 转码 / 转封装:在上百种编码(H.264/H.265/AV1/VP9/AAC/Opus…)与封装格式(MP4/MKV/FLV/MOV/TS/WebM…)之间自由转换
- 编辑加工:剪切、拼接、缩放、旋转、加水印、调音量、变速、加字幕、画中画
- 抽取与转换:从视频里抽音频、抽帧、抽字幕;把图片序列合成视频
- 采集与推拉流:录屏录音、拉 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:视频滤镜,设置输出帧率为 1fpsframe_%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.jpgselect=eq(pict_type,I):只选类型为 I 帧的帧-vsync vfr:可变帧率输出,避免重复帧
七、调整分辨率、码率、帧率
1. 缩放分辨率
bash
ffmpeg -i input.mp4 -vf scale=1280:720 -c:a copy output.mp4scale=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.mp4concat=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.mp43. 拉 RTSP 摄像头流并保存
bash
ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]/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=libx264、ffmpeg -h filter=scale,信息最权威 - 用
ffmpeg -codecs、ffmpeg -formats、ffmpeg -filters查询当前版本支持的编码器、封装格式、滤镜列表 - 进阶三大主题:滤镜图(filtergraph)、硬件加速(NVENC/QSV/VideoToolbox)、多输入多输出映射(-map)
- 官方文档
ffmpeg.org/documentation.html是最终真相;遇到报错贴完整 log(含版本与命令)去搜,比盲猜快得多 - 日常养成习惯:先
ffprobe看输入、再想好 "改什么 / 保留什么"、最后组装命令,思路永远清晰
掌握上面这十几条命令,已经能覆盖 80% 以上的日常音视频处理需求;剩下的进阶玩法基本都是在这些基础上叠加滤镜和参数。