FFmpeg 命令行核心用法:从结构到实战

说实话,很多刚接触 FFmpeg 的朋友,第一反应就是「这命令也太长了吧」。我当年也是这样,看着满屏的参数头皮发麻。但你别怕,FFmpeg 的命令行结构其实非常规整,说白了就是一套固定的「骨架」,你只要把参数往对应的位置填进去就行。

这一章,我就带你把这套骨架摸清楚。咱们不讲虚的,直接上手。

命令结构:就五个部分

FFmpeg 的命令行,拆开来看,永远是这个结构:

ffmpeg [全局参数] [输入文件参数] -i 输入文件 [输出文件参数] 输出文件

嗯,就这么简单。你想想看,不管多复杂的命令,都逃不出这个框架。我习惯把它叫做「五段式」:

  1. ffmpeg:调用程序,没啥好说的。
  2. [全局参数]:影响整个转换过程的设置,比如日志级别、覆盖文件等。
  3. [输入文件参数]:针对输入文件的处理选项,比如指定输入的视频轨道、解码器。
  4. -i 输入文件:输入源,可以是本地文件、网络流、设备。
  5. [输出文件参数]:控制输出文件的编码、封装、滤镜等一切。

核心要点:参数的位置决定了它的作用范围。放在 -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 命令行的核心逻辑串起来了。你保存下来,以后写命令的时候对照着看:

FFmpeg 命令行核心结构图 FFmpeg 命令行核心结构 全局参数 -y / -loglevel 输入参数 -ss / -t / -vn 输入文件 -i input.mp4 输出参数 -c / -b:v / -r / -s 输出文件 output.mp4 核心操作分支 转封装(流复制) -c:v copy -c:a copy 只换容器,不解码,速度极快 转码(重新编码) -c:v libx264 -b:v 2M 改变编码/码率/分辨率/帧率 选择原则 不需要改变编码格式 → 用转封装(快、无损) 需要调整码率/分辨率/编码格式 → 用转码(灵活、有损耗)

实战:从零转一个视频

光说不练假把式。咱们拿一个实际场景走一遍。假设你有一个 source.mkv 文件,H.265 编码,4K 分辨率,60fps。你想把它转成 H.264 编码的 1080p 30fps MP4,码率控制在 8 Mbps。

按照我们刚才学的结构,一步步来:

  1. 全局参数:加个 -y,自动覆盖已有文件,省得每次确认。
  2. 输入参数:不需要特殊处理,跳过。
  3. 输入文件:-i source.mkv
  4. 输出参数:-c:v libx264 -b:v 8M -s 1920x1080 -r 30 -c:a aac -b:a 128k
  5. 输出文件: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% 的日常需求。

嗯,这些基础打牢了,后面讲流控调试的时候,你才不会手忙脚乱。