# 不同编码器特有的设定

FFmpeg 支持很多种媒体编码器，这些媒体编码器当然都不会是千篇一律的，有些编码器有着十分丰富的选项，这些选项可以让你调整编码时的压缩比、刷新率、色域等等。你也可以通过调整一些参数来让转码快一些，或者体积更小。那么在这一章，我们就来介绍几个常见的编码器的一些特别选项。

*部分功能可能仅在 GNU/Linux 上有效。*

## H264 和 HEVC

毫无疑问， H264 是目前最流行的视频编码了，现在我们在网上见到的几乎所有视频都是使用 H264 进行视频编码的，不管它的封装格式是 MP4 、 Matroska 还是 FLV 。而它为什么会变得如此流行呢？除了较高的效率，丰富的编码器选项也是它的优点之一。

HEVC 是 H264 的后继版本，又称 H265 ，它提供了一个更高的压缩比，不过目前有许多差的播放器不支持这种编码，所以请小心使用。

### 恒流量系数 (CRF)

这种方式可以让编码器尽量保持一定的画面质量，而文件的大小就不是那么重要了，这种方式为单通道的方式提供了最大的压缩比。每一帧都会得到能保证其质量等级的比特率。它的坏处是你无法确认最终会得到的具体文件大小或保证它不超过一定的尺寸。

首先你需要选择一个 CRF 值，这个值在 0 至 51 之间。 0 就代表无损， 23 是默认的， 51 就是最差的画质了。 **数字越小画质越高** ，不过通常我们选 18 至 28 之间就可以了，就当作 18 是“近乎无损”吧，如果输入文件不是无损的话，通常 18 就跟原来是几乎没区别的了。

CRF 值是倍数，也就是说把 CRF 增大 6 的话，文件就会变成原来的几乎一半大小，减小 6 的话就会变成两倍。通常选择 CRF 值的方式是：选择一个最大的能提供看起来还可以的值，如果出来的效果还不错，就再增大一些试试，如果看起来画质太差了就减小看看。

接下来你要选择一个预设，预设会影响编码的速度和压缩比。慢的预设会给出一个较好的压缩比（压缩比就是画面质量相对于文件大小的比例），也就是说在文件大小一样的情况下，越慢的预设画质越好，或者说在画质一样的情况下，越慢的预设文件更小。

通常选定预设的方法是使用你能忍受的最慢的预设。目前的这些预设从快到慢排列有： `ultrafast`, `superfast`, `veryfast`, `faster`, `fast`, `medium`, `slow`, `slower`, `veryslow`, `placebo` 。默认是 `medium` ， `placebo` 通常没有用所以请无视它。

决定好了 CRF 值和预设之后，你就可以使用 `-crf` 选项来指定 CRF 值， `-preset` 选项来指定预设了。下面的例子是使用 `22` 作为 CRF 值， `slow` 作为预设来进行转码：

```
ffmpeg -i input.mp4 -c:v h264 -crf 22 -preset slow -c:a copy output.mkv
```

### 指定平均比特率

使用 `-b:v` 选项可以让 FFmpeg 为 H264 或 HEVC 编码的视频指定一个平均的比特率，这样就可以控制最终的文件大小了。比如要让平均比特率为 1000 KBit/s ，就写上 `-b:v 1000k` 。

不过这个选项不能与 `-crf` 选项同时使用，因为实际上指定 CRF 值就是让编码器自动评判出一个平均的码率。

## VP9

[VP9](https://zh.wikipedia.org/wiki/VP9) 是 Google 为 WebM 格式所开发出的一种视频编码，专门为在线串流视频设计。全世界最大的视频网站 [YouTube](https://www.youtube.com) 默认使用的视频编码就是 VP9 。同样的，它也拥有许多选项来使编码变得更有效。

### 平均比特率

与 H264 和 HEVC 一样， VP9 默认使用的是动态比特率，同样我们也可以用 `-b:v` 选项来指定其平均的比特率，比如我想让视频的平均比特率为 1 MBit/s ，就使用这条命令：

```
ffmpeg -i input.mp4 -c:v vp9 -b:v 1m output.webm
```

### 稳定画质

VP9 编码也提供了一种方式让视频保证一定画质，与 H264 和 HEVC 一样使用的是 `-crf` 参数，不过与 H264 和 HEVC 不同的是， VP9 的 CRF 值范围是 0-63 。

还有一点要格外注意，要让 VP9 编码器保持稳定画质的时候，必须指定 `-b:v 0` ，不要忘了。也就是说，要让转码时使用 VP9 编码并以 `10` 作为 CRF 值，使用这条命令：

```
ffmpeg -i input.mp4 -c:v vp9 -crf 10 -b:v 0 output.webm
```

## 学会看文档

实际上， H264 、 HEVC 以及 VP9 还有许多令人惊奇的功能，不过这些功能对于大多数人而言实用性并不强，所以我只挑了几个最容易理解且常用的功能写在了这一章里。同样的，除了 H264 、 HEVC 和 VP9 以外，也有许多编码器有各种各样的功能。

在目录中我就说过，本书只能使你成为 FFmpeg 用户而非专家。那些高级的功能比较难以理解，也不常用到，所以我不会介绍很多没有多大用处的功能。不过，如果有某项我没介绍的功能确实对你来说很有用呢？

叫我在教程中加上对其的介绍吗？这显然不是一个好主意，除非我认为这个功能真的对许多人来说都很有用，我是不会添加一些晦涩难懂的内容的。当然，我也不是专家，你所需要的功能也许我也不知道该怎么用。所以，这时最好的解决方法有两个：

1. 查阅官方文档
2. Google

FFmpeg 的[官方文档](https://ffmpeg.org/documentation.html)是最权威不过的了，里面的信息非常的多，除了我在这个教程中所使用的 `ffmpeg` 转码工具以外，还有许多别的东西。在页面中点 "Command Line Tools Documentation"下面的 "ffmpeg" 链接就可以看到对于 `ffmpeg` 转码工具的文档。除此之外， FFmpeg 还有一个[官方 Wiki](https://trac.ffmpeg.org/wiki) ，里面都是一些网友贡献的内容，所以有些内容可能比较过时了，不过还是很有参考价值的。

以上的东西全部都是英文的，所以也[没办法](https://gloomy-ghost.gitbook.io/convert-videos-with-ffmpeg-zh/03-execute#中文是世界上最美的语言，但是)。要是有中文的文档，我也就不会写这个教程了。

还有一个十分高效的方法是使用 [Google](https://www.google.com) 来搜索，你可以将你的关键词写成 `ffmpeg blablabla` ，最好用英文来搜索。按下回车后也许你就能找到你想要的内容了。至于为什么是 Google 而非百度，这不是[不言自明](http://www.zhihu.com/question/20140749)的嘛。

读到这里，我想你就能很舒服地玩转 FFmpeg 了，而其他的转码软件再也不那么重要了。后面我还要写一些 FFmpeg 能做的许多其他事情，到那时候基本上许多其他转码软件都可以见鬼去了。不过它依然还在编写中，如果想要获知最新的更新，请关注这个计划的 [GitHub Repository](https://github.com/FiveYellowMice/how-to-convert-videos-with-ffmpeg-zh) 。

对了，也看一看[最后一章](https://gloomy-ghost.gitbook.io/convert-videos-with-ffmpeg-zh/10-write-in-end)。
