FFmpeg 命令行核心用法:从结构到实战
说实话,很多刚接触 FFmpeg 的朋友,第一反应就是「这命令也太长了吧」。我当年也是这样,看着满屏的参数头皮发麻。但你别怕,FFmpeg 的命令行结构其实非常规整,说白了就是一套固定的「骨架」,你只要把参数往对应的位置填进去就行。
这一章,我就带你把这套骨架摸清楚。咱们不讲虚的,直接上手。
命令结构:就五个部分
FFmpeg 的命令行,拆开来看,永远是这个结构:
ffmpeg [全局参数] [输入文件参数] -i 输入文件 [输出文件参数] 输出文件
嗯,就这么简单。你想想看,不管多复杂的命令,都逃不出这个框架。我习惯把它叫做「五段式」:
- ffmpeg:调用程序,没啥好说的。
- [全局参数]:影响整个转换过程的设置,比如日志级别、覆盖文件等。
- [输入文件参数]:针对输入文件的处理选项,比如指定输入的视频轨道、解码器。
- -i 输入文件:输入源,可以是本地文件、网络流、设备。
- [输出文件参数]:控制输出文件的编码、封装、滤镜等一切。
核心要点:参数的位置决定了它的作用范围。放在 -i 前面,影响输入;放在 -i 后面、输出文件前面,影响输出。这个顺序搞反了,命令可能就达不到预期效果。
常用参数:先记住这五个
FFmpeg 参数成百上千,但日常流控调试,有五个参数你几乎天天要用。我列个表,你一眼就能看明白:
| 参数 | 全称 | 作用 | 示例 |
|---|---|---|---|
-c |
codec | 指定编解码器 | -c:v libx264 视频用 H.264 |
-b:v |
bitrate video | 设置视频码率 | -b:v 2M 码率 2 Mbps |
-r |
frame rate | 设置帧率 | -r 30 输出 30 fps |
-s |
size | 设置分辨率 | -s 1920x1080 1080p |
-i |
input | 指定输入文件 | -i input.mp4 |
这里我要多说一句 -c。它后面可以跟 :v(视频)、:a(音频)、:s(字幕)。比如 -c:v copy 表示视频流直接复制,不解码也不编码,速度飞快。我在项目中经常用这个来做「转封装」,后面会细说。
转封装 vs 转码:本质区别
这两个概念,很多人混为一谈。我打个比方你就懂了:
- 转封装:好比把一瓶水从塑料瓶倒进玻璃瓶。水还是那个水,只是容器变了。速度极快,画质无损。
- 转码:好比把水冻成冰块。物质形态变了,需要时间,而且有损耗(除非无损编码)。
什么时候用转封装?我举个例子。有一次客户给了一个 TS 格式的直播录制文件,播放器不认。我只需要把它改成 MP4,视频和音频都不动。这时候用转封装,一秒搞定:
ffmpeg -i input.ts -c:v copy -c:a copy output.mp4
-c:v copy 和 -c:a copy 就是告诉 FFmpeg:「视频和音频原封不动,只换容器」。这个命令我几乎每周都用。
那什么时候用转码呢?比如你有一个 4K 视频,想在手机上播,码率太高卡顿。这时候就需要重新编码,降低分辨率和码率:
ffmpeg -i input_4k.mp4 -c:v libx264 -b:v 5M -s 1920x1080 -r 30 output_1080p.mp4
小技巧:如果你不确定当前文件的编码格式,可以用 ffprobe input.mp4 查看。ffprobe 是 FFmpeg 家族的分析工具,后面章节我会专门讲。
避坑指南:我踩过的三个坑
做流控调试这些年,有些坑我反复踩过。今天一次性告诉你,省得你走弯路。
坑一:参数顺序搞反
我曾经写过一个命令:ffmpeg -i input.mp4 -b:v 2M -c:v libx264 output.mp4。看起来没问题对吧?但 -b:v 放在了 -c:v 前面,在某些旧版本 FFmpeg 中,码率参数可能被忽略。正确做法是把 -b:v 放在 -c:v 后面,或者至少确保编码器先被指定。
坑二:分辨率格式写错
-s 参数的分辨率格式是 宽x高,中间是小写字母 x,不是乘号。我见过有人写成 1920*1080,FFmpeg 直接报错。还有,宽高比要保持一致,否则画面会被拉伸。我曾经给客户转了一个视频,忘了加 -aspect 参数,结果人脸都变宽了……
坑三:码率单位搞混
-b:v 2M 里的 M 是 Mbps(兆比特每秒),不是 MB/s(兆字节每秒)。1 MB/s = 8 Mbps。如果你想要 2 MB/s 的码率,应该写 -b:v 16M。这个单位问题,我见过太多人搞错了,包括早期的我。
一张图看懂本章知识体系
下面这张图,把 FFmpeg 命令行的核心逻辑串起来了。你保存下来,以后写命令的时候对照着看:
实战:从零转一个视频
光说不练假把式。咱们拿一个实际场景走一遍。假设你有一个 source.mkv 文件,H.265 编码,4K 分辨率,60fps。你想把它转成 H.264 编码的 1080p 30fps MP4,码率控制在 8 Mbps。
按照我们刚才学的结构,一步步来:
- 全局参数:加个
-y,自动覆盖已有文件,省得每次确认。 - 输入参数:不需要特殊处理,跳过。
- 输入文件:
-i source.mkv - 输出参数:
-c:v libx264 -b:v 8M -s 1920x1080 -r 30 -c:a aac -b:a 128k - 输出文件:
output.mp4
组合起来就是:
ffmpeg -y -i source.mkv -c:v libx264 -b:v 8M -s 1920x1080 -r 30 -c:a aac -b:a 128k output.mp4
这个命令,你拿去就能用。音频我也顺手转成了 AAC,码率 128 kbps,这是目前最通用的音频编码方案。
我的习惯:每次写长命令,我都会先写 ffmpeg -i input,然后回车看看 FFmpeg 输出的文件信息,确认输入文件没问题。再补上输出参数。这样分段调试,出错了容易定位。
小结
这一章的内容,说白了就是三件事:
- 记住命令的「五段式」结构,参数位置决定作用范围。
- 分清转封装和转码,
-c:v copy是转封装的核心。 - 掌握
-c、-b:v、-r、-s这四个输出参数,能覆盖 80% 的日常需求。
嗯,这些基础打牢了,后面讲流控调试的时候,你才不会手忙脚乱。