第 20 课:视频编码器实战对比 —— x264 vs NVENC / QSV
# 第 20 课:视频编码器实战对比 —— x264 vs NVENC / QSV
嘿,我是小方。 上一课(第 19 课)我们看清了"统一接口":x264 和 NVENC 在 OBS 眼里长得一样,都是填一张
obs_encoder_info表。可你真要用,总得选一个 —— 到底选哪个? 这一课把这两类编码器的真实差异摊开。但我不想一上来就"x264 vs NVENC"甩术语 —— 那样对新手不友好。我们先把地基铺好:什么是"编码器"?编码为什么"费劲"?软件和硬件到底差在哪?然后再谈preset、谈怎么选。 提前说一句立场:没有绝对的好坏,只有"哪个更适合你的场景"。 关于"谁画质高",我会说实话 —— 早年 x264 慢档确实完胜,但现代显卡编码已经大幅追平了。
📖 五个词,先混个脸熟(全课反复出现):
- 编码器(encoder):把画面按标准压缩成码流的"工人"。x264、NVENC 都是编码器。
- 标准(standard):一套"该怎么压"的规矩,如 H.264、HEVC、AV1(20.1 细讲)。
- 容器(container):装成品的"盒子",如
.mp4、.mkv(第 22 课)。- 码率(bitrate):每秒用多少比特 = 画质/体积的"预算"(第 18 课);越高越清晰、越占空间。
- preset(预设):编码器"花多少力气去精调"的旋钮(20.4 细讲)。
# 20.1 先补课:什么是"编码器"?—— 标准、实现、容器
📍我们在哪:还在"编码"这一站,但从上一课的抽象接口,落到两个真实编码器的对比。开比之前先补个课 —— H.264、x264、.mp4 到底谁是标准、谁是实现、谁是容器?
在比 x264 和 NVENC 之前,先搞清一件很多新手会懵的事:"H.264" 和 "x264" 不是一回事;同一个 h264,为什么会有好几个编码器?

三个词,理清就通了:
- ① 标准(standard):H.264 / H.265(HEVC) / AV1 —— 一套"该怎么压、压出来长什么样"的规矩(国际标准)。就像菜谱规矩:规定了"这道菜最后要什么味"。
- ② 实现 / 编码器(encoder):x264(软件)、NVENC(N 卡)、QSV(Intel)、AMF(A 卡) —— 照着规矩,真正把画面压出来的"工人"。就像不同的厨师/厨房:手法各异,但都做出同一道菜。同一个 H.264 标准,可以有好几个实现。
- ③ 容器(container):
.mp4/.mkv/.flv—— 装成品的"盒子",把编码后的视频流 + 音频流打包成一个文件(第 22 课)。就像装菜的餐盒。
关键理解:"标准"只规定"压出来的东西长什么样(能被播放器解开)",不规定"你用什么方法、什么硬件去压"。所以软件(x264)、各家显卡(NVENC/QSV/AMF)都能做自己的实现,压出来的都是能通用播放的 H.264。这一课比较的,就是这些不同的"实现"。
# 20.2 编码是个"重活":它为什么这么费劲?
📍接上一节:分清了标准和实现,还得铺第二块地基 —— 编码不是"搬数据",而是每秒几十亿次的海量搜索计算。想不通这点,后面全悬空。
第二块地基:编码不是"搬一下数据",而是一件极其耗计算的重活。 想不通这一点,后面的一切(为什么吃 CPU、为什么要造专用芯片、preset 是什么)都会悬空。

回想第 18 课的压缩过程,落到一帧上是这样:
- 一帧 1080p ≈ 200 万像素,先切成几千到几万个"块";
- 对每个块,要去参考帧里"搜"最像的位置(块匹配),试几十到上百个候选,挑最像的;
- 还要试不同的块划分方式、不同的参考帧,反复算残差、量化……
- 这一切,每秒还要重复 30~60 帧。
算下来:每秒几十亿次比对,纯粹的"计算力活儿"。这一个事实,解释了这一课后面的一切:
- 为什么它能把 CPU 吃满(x264):这么多计算堆在通用 CPU 上,自然重;
- 为什么值得造一块"专用芯片"(NVENC):把这套固定的计算"硬件化",又快又省电;
preset/P1-P7是什么:就是"这些搜索,到底做多细"的旋钮 —— 搜得越细越慢越好,搜得越粗越快越差。
记住"编码 = 海量搜索与计算",往下看就顺了。
# 20.3 根本区别:编码在"哪儿"跑
📍承上启下:知道了编码是"重活",这两类编码器最根本的区别就浮出来了 —— 同一件重活,一个在 CPU 通用核心上干,一个甩给显卡的专用芯片。
有了前两块地基,现在说这两类编码器最根本的区别:这件"重活",它们在完全不同的硬件上干。

- x264(软件编码):跑在 CPU 的通用核心上。CPU 是"什么都能算"的通用处理器,但它同时还在跑你的游戏、操作系统、直播软件—— x264 编码要和这些抢 CPU。
- NVENC / QSV / AMF(硬件编码):跑在**显卡里一块"专用编码芯片"**上。这是一块"只会做编码"的固定功能电路(ASIC),独立于 CPU、也独立于显卡的 3D 渲染核心。它编码时,几乎不占用 CPU。
💡 记住这几个名字:NVENC = NVIDIA 显卡的编码芯片;QSV(Quick Sync Video)= Intel 核显/独显的编码芯片;AMF = AMD 显卡的。它们都是"显卡里那块专用编码电路",概念完全一样。
这个"软件 vs 硬件"的区别,到底意味着什么?下一节用一个类比讲透。
# 20.4 软件 vs 硬件 = 万能师傅 vs 流水线专机
📍接上一节:"CPU vs 专用芯片"这句话有点干,用做菜打个比方讲透 —— 万能师傅 vs 流水线专机,这正是"通用 vs 专用"的经典取舍。
"专用芯片"为什么又快又省、却不灵活?这是计算机世界一个经典的取舍:通用 vs 专用。用做菜打个比方最好懂:

- CPU = 万能师傅(x264 在这干活):会做任何菜 —— 游戏、系统、x264 编码,什么程序都能跑(通用),而且极其灵活(
preset、海量x264opts随便调)。但:编码这种重活会让它"累"(占满 CPU),还耽误做别的菜(游戏跟着卡)。一句话:什么都会,但样样不极致、还容易忙不过来。 - ASIC = 流水线专机(NVENC 芯片):只会做"编码"这一道工序,但电路是为它"量身定做"的,所以又快又省电,几乎不占 CPU。但:只会这一件事;厂商没内置的花样,它做不了(可调的档位就那么几个)。一句话:一件事做到极致,但也只会这一件事。
这就是"通用 vs 专用"的经典取舍,不只在编码 —— 整个计算机世界都是它。 x264 用万能师傅(灵活、但吃 CPU);NVENC 用专机(省心、但你机器里得有那台机器)。理解了这个,下面每一条差异都水到渠成。
# 20.5 x264 的核心旋钮:preset —— 花多少 CPU 去"精调"
📍承上启下:地基铺完,开始拧旋钮。先看软件编码 x264 最重要的那个 —— preset,本质就是"花多少 CPU 去精调"。
x264 最重要的一个设置,是 preset(预设)。它是一把从"快"到"好"的尺:ultrafast → superfast → veryfast → faster → fast → medium → slow → slower → veryslow → placebo。
📖 先热身:"同码率下画质"是什么意思?(下面反复用到) 码率(bitrate)= 每秒给编码器多少比特的"预算"(第 18 课)。"同码率比画质"就是:给两个编码器/两种设置相同的预算,看谁把画面压得更聪明、更清晰。 而"画质差"长什么样?—— 块状(马赛克)、发糊、快速运动时的拖影/涂抹。这些就是码率不够、或编码器不够用功时,眼睛能看到的瑕疵。

preset 的本质:用"更多 CPU 计算"换"更好的压缩"。 它不改变画面内容,只改变"编码器有多用功"(就是 20.2 那些搜索做多细):
- 往左(快档,如
ultrafast):编码器"草草了事"——少搜索、少分析。CPU 占用低,但同样码率下画质更差(压得不够聪明),或者说同样画质下体积/码率更大。 - 往右(慢档,如
veryslow):编码器"精雕细琢"——大范围搜索、多参考帧、细致分析。同样码率下画质更好(压得更聪明),但吃 CPU——慢的档能把 CPU 拉满。
代码上,OBS 就是把你选的档名,原样交给 x264(obs-x264.c:310):
// plugins/obs-x264/obs-x264.c:308(reset_x264_params)
int ret = x264_param_default_preset(&obsx264->params,
validate_preset(obsx264, preset), // 你选的 preset
validate(obsx264, tune, "tune", x264_tune_names)); // 你选的 tune
2
3
4
x264_param_default_preset 是 x264 库自己的函数,它按预设名把一整套内部参数(搜索范围、参考帧数……)配好。OBS 不重新发明这些,只是把你在下拉框选的档名递进去(下拉框里那些档名,也是直接来自 x264 的 x264_preset_names 数组,obs-x264.c:200)。
一个关键细节:OBS 默认 preset = veryfast(obs-x264.c:112),偏快的一档 —— 不是 medium。为什么?因为直播时你多半在打游戏,得给游戏留 CPU(就是 20.4 那个"万能师傅忙不过来会耽误做别的菜");设太慢会卡游戏、还可能编码跟不上帧率导致丢帧。纯录制(不打游戏、CPU 空闲)时,才敢往慢里调换画质。
# 20.6 preset 到底在调什么?—— 回到第 18 课
📍接上一节:preset "更用功"到底多花在哪?回到第 18 课的块匹配就懂了 —— 慢档搜得更大、参考更多、算得更细。
"更用功"到底是多花在哪?回到第 18 课的块匹配(和 20.2 那张图),你就懂了。

慢档多花的 CPU,主要花在:
- 更大的运动搜索范围:第 18 课讲过,P 帧靠"在参考帧里搜最像的块"求出运动矢量。搜索窗越大、越细,越可能找到更好的匹配 → 残差越小 → 同码率下更清晰。快档搜一小圈就交差,慢档搜一大片。
- 更多参考帧:不只看前一帧,往前看好几帧找最优参考。
- 更多候选的块划分方式 + 更精细的"码率-失真"权衡:反复试算,挑最省的表示法。
说白了,慢档就是"第 18 课那套压缩,搜得更狠、算得更细"。 所以同样的码率,慢档能把画面压得更"聪明"——残差更小、细节留得更多、更清晰。
⚠️ 新手最容易搞混的一点:
preset不动分辨率、不动码率,只动"编码器搜索的努力程度"。它不是"画质档位",而是"用功档位"——同样码率下,更用功 = 更清晰。NVENC 那块芯片也有类似的"用功程度"旋钮(P1–P7、multipass,20.8 见),原理相通,只是跑在硬件上。
# 20.7 另外两个旋钮:profile 和 tune
📍承上启下:preset 之外,x264 还有两个你会在设置里看到的旋钮 —— profile 和 tune,多数人保持默认,了解一下就好。
preset 之外,还有两个你在 OBS 编码设置里会看到的旋钮。它们大多数人保持默认即可,了解一下就好。

# profile:特性档(兼容 ↔ 压缩率)
H.264 标准有不同的"特性档",决定用上哪些压缩特性:
baseline:只用最基础的特性,最兼容(老旧设备也能解),但压得差、没有 B 帧(第 18 课)。main:中间档。high:用上全部高级特性,压得最好,现代设备都支持。
OBS 默认"无"(空),交给编码器自己定(x264 通常选 high)。代码走 x264_param_apply_profile(obs-x264.c:296)——注意它在最后应用,用来把 profile 的约束"钉"在所有设置之上。
# tune:针对内容/目标微调
film/animation/grain:针对电影、动画、带噪点的素材,调优内部参数。stillimage:幻灯片、静态画面。zerolatency:去掉一切前瞻缓冲,把延迟压到最低(适合低延迟直播、连麦)。fastdecode:让解码端更省力。
OBS 默认"无(None)"——不强制任何 tune。这里要纠正一个常见误解:很多人以为 OBS 直播会自动开 zerolatency,其实没有(我通读了 obs-x264.c,它从不自动设 zerolatency)——想要低延迟,得你手动选。
# 20.8 NVENC 的旋钮:P1–P7、multipass、tuning
📍接上一节:软件编码的旋钮看完了,硬件编码 NVENC 也有一套 —— P1–P7、multipass、tuning,只是这些"用功程度"跑在芯片上、不占 CPU。
那硬件编码呢?NVENC 也有它自己的"画质/速度"旋钮,只是这些"用功程度"跑在那块芯片上,而不是 CPU。

presetP1–P7:NVENC 自己的一把尺,P1(最快/最差)→P7(最慢/最好),OBS 默认P5。代码里就是把"p1".."p7"映射成 NVENC 的预设 GUID(nvenc.c:166):// plugins/obs-nvenc/nvenc.c:166(get_nv_preset,节选) if (astrcmpi(preset2, "p1") == 0) return NV_ENC_PRESET_P1_GUID; ... else return NV_ENC_PRESET_P5_GUID; // 默认 P51
2
3
4multipass(多遍编码):disabled(一遍过,最快)/qres(先用四分之一分辨率扫一遍探明码率分布,再正式编;OBS 默认)/fullres(两遍全跑,最费最准)。这就约等于 x264 慢档那种"多花力气",只是硬件版。tuning(调优目标):hq(高画质,OBS 默认)/ll·ull(低延迟/超低延迟,连麦、云游戏)/uhq(超高画质,新卡才有)/lossless(无损)。
别被这堆术语吓到:NVENC 的 preset/multipass/tuning/profile/rate control,和 x264 的 preset/tune/profile/CBR·VBR 是同一套概念的硬件版。你在第 18~19 课、以及本课前四节建立的直觉,全都平移得过来。
# 20.9 硬件检测:有没有那块芯片(为什么你和朋友的选项不一样)
📍承上启下:旋钮都认识了,回答一个常见困惑 —— 为什么你的下拉框有 NVENC、朋友的却没有?因为硬件编码器"探到那块芯片才注册"。
有个现象你可能遇到过:你的 OBS 编码器下拉框里有 NVENC,朋友的却只有 x264。这不是 bug,是设计。

硬件编码器"有那块芯片才注册"。 OBS 启动加载 obs-nvenc 插件时,会先探测(obs-nvenc.c:13):
// plugins/obs-nvenc/obs-nvenc.c:13
bool obs_module_load(void)
{
if (!nvenc_supported()) { // ★ 先探测:有没有能用的 N 卡?
blog(LOG_INFO, "NVENC not supported");
return false; // 没有 → 直接返回,编码器压根不注册
}
obs_nvenc_load(); // 有 → 才 register_encoders()
...
}
2
3
4
5
6
7
8
9
10
nvenc_supported()(nvenc-helpers.c:367)做两件事:
os_dlopen("nvEncodeAPI64.dll")——能不能加载 NVIDIA 的编码库(第 9、11 课那个动态加载)。没有 N 卡/驱动,这一步就失败。- 跑一个
obs-nvenc-test子进程实测——真的开个编码会话试试,确认有能用的显卡、驱动够新。
只有两步都过,才会 register_encoders() 注册那些 NVENC 编码器。所以:
- AMD 卡 → 看不到 NVENC(但可能有 AMF);
- 没有独立显卡 → 只有 x264(核显有的话可能有 QSV);
- 驱动太旧 → 硬件编码"消失"(
init_nvenc会拒绝过旧驱动,nvenc-helpers.c:205)。
你下拉框里能选什么,取决于这道探测门放行了谁。 QSV(Intel)也是同一套逻辑:check_adapters 探到 Intel 显卡才注册(obs-qsv11-plugin-main.c:76)。这就是"一切皆插件 + 动态探测"的又一次体现。
# 20.10 一张表看懂:x264 vs NVENC / QSV
📍承上启下:所有差异铺完了,汇成一张决策表 —— 顺便把"谁画质高"这个最容易吵架的点,说句公道话。
把差异汇总成一张决策表:

| 维度 | x264(软件) | NVENC / QSV(硬件) |
|---|---|---|
| 跑在哪 | CPU 通用核心(万能师傅) | 显卡专用编码芯片(专机) |
| CPU 占用 | 高(慢档能拉满) | 极低(甩给显卡) |
| 同码率画质 | 慢档很强;快档一般 | 现代卡(图灵+)已追平甚至超快档 |
| 灵活 / 可调 | 极高(preset + 海量 x264opts) | 较少(厂商给的几个档) |
| 可用性 | 任何机器都能用 | 要对应的显卡 + 新驱动 |
| 适合 | 有 CPU 余量、求极致画质/小体积 | 边玩边播、想把 CPU 留给游戏 |
关于"画质"要说句公道话(这是最容易吵架的点):早年(2016 年前后)x264 的慢档画质完胜同码率的 NVENC;但现代 NVENC(2018 年图灵架构起,以及后来的 Ampere/Ada)已经大幅追平,在常见码率下和 x264 中速档难分伯仲、甚至更好。所以"x264 画质一定更高"这个老观念,如今基本过时了——这也是为什么现在很多人直播、录制都直接用 NVENC。
# 20.11 怎么选?顺着"你在干嘛"问下去
📍收束:知识都齐了,落到你自己该选哪个 —— 别纠结画质,决策的核心就一个问题:你的 CPU 还剩多少余量。
真到你自己选,别纠结"谁画质高"。决策的核心是:你的 CPU 还有多少余量。

- 边打游戏边直播 → 游戏已经吃满 CPU?用 NVENC / QSV,把编码甩给显卡芯片,CPU 全留给游戏,不掉帧。(这也是 OBS 默认把 x264 设成
veryfast的同一个理由——都是"给游戏省 CPU"。) - 纯录制 / 转码 → CPU 有大把余量、又想要极致画质或最小体积?x264
slow/slower(或 NVENCP6/P7+ 高码率)。 - 没有独立显卡 → 核显没编码或很弱?只能 x264,把
preset往快调,牺牲点画质保流畅。
两条实用经验:
- "CPU 余量"是第一决策因素。边玩边播,几乎都选硬件编码。
- 现代显卡编码画质已经很能打;除非你 CPU 极强又追求极致小体积,否则硬件编码通常是省心之选。
说到底,这套"软件灵活但吃 CPU / 硬件省心但要有芯片"的权衡,正是 20.4 那个"通用 vs 专用"——整个计算机世界"取舍"的缩影。而 OBS 用第 19 课那套统一接口,让你可以随手切换,哪个合适用哪个。
# 20.12 本课小结
- 编码器 = 标准的"实现":H.264 是标准(规矩),x264/NVENC/QSV 是它的实现(工人),
.mp4是容器(盒子)。同一个 h264 有多个编码器,因为标准只管"结果能被解开",不管"用什么方法压"。 - 编码是"重活":一帧切成海量块、每块反复搜索比对,每秒几十亿次计算 —— 这解释了它为何吃 CPU、为何值得造专用芯片、preset 为何存在。
- 根本区别 = 在哪儿跑:x264 用 CPU 通用核心(万能师傅:灵活但和游戏抢、忙不过来);NVENC/QSV/AMF 用显卡专用编码芯片(ASIC)(流水线专机:又快又省但只会这一件事)。这就是"通用 vs 专用"的经典取舍。
- x264 的
preset:"快 ↔ 好"的尺,本质"用更多 CPU 换更好压缩",不动分辨率/码率,只改"编码器多用功"。OBS 默认veryfast(给游戏留 CPU)。代码x264_param_default_preset(obs-x264.c:310)。 preset内部:慢档 = 更大运动搜索 + 更多参考帧 + 更细分析 → 更好块匹配 → 残差更小 → 同码率更清晰(回连第 18 课)。profile(baseline/main/high,:296)+tune(film/…/zerolatency)—— 多保持默认;OBS 不自动开 zerolatency。- NVENC 旋钮:
presetP1–P7(默认 P5,nvenc.c:166)、multipass、tuning—— 和 x264 那套是"同一概念的硬件版"。 - 硬件检测:NVENC 只在
nvenc_supported()(os_dlopen+ 子进程实测)通过时才注册(obs-nvenc.c:13);AMD 卡/无独显/旧驱动 → 下拉框里没有;QSV 同理。 - 怎么选:核心是 CPU 余量——边玩边播用硬件,纯录制求画质用 x264 慢档或 NVENC 高档 + 高码率,无独显只能 x264。现代 NVENC(2018 图灵起)画质已大幅追平 x264,老观念过时。
# 20.13 动手 / 观察(本课作业)
- 分清三个词:用自己的话说清 H.264、x264、
.mp4分别是"标准/实现/容器"里的哪个;为什么同一个 h264 会有 x264、NVENC 好几个编码器? - 看你有哪些编码器:OBS →"设置 → 输出"(高级)→ 视频编码器下拉。列出的每一项,都是通过了 20.9 那道探测门、注册进来的。你有 NVENC / QSV 吗?
- 调 preset 看 CPU:用 x264,把
preset从veryfast改成medium再改slow,开始录制,用任务管理器看 CPU 占用怎么变。想想为什么直播默认是veryfast(回连 20.4 的"万能师傅忙不过来")。 - 理解"preset 不动码率":同样设 6000kbps,
veryfast和veryslow出来的文件大小差不多,但清晰度不同,为什么?(提示:20.6 的搜索努力程度 / 残差。) - 翻源码:打开
plugins/obs-x264/obs-x264.c:310,确认 OBS 把 preset 交给x264_param_default_preset;再到plugins/obs-nvenc/obs-nvenc.c:13,确认if (!nvenc_supported()) return false那道注册门。 - 做个选择:根据你自己的机器(CPU 强不强、有没有独显)和用途(直播还是录制),按 20.11 给自己定一个编码器 + preset,并说出理由。
# 下一课预告
视频编码聊透了。可推流/录制里还有音频那一路要编码 —— AAC、Opus 是什么?为什么音频码率通常就选个 128k、160k 完事,不像视频那么讲究?还有一个贯穿视频音频的大问题:CBR(恒定码率)和 VBR(可变码率) 到底怎么选,直播和录制为什么用不同的?
第 21 课:音频编码与码率怎么选 —— AAC / Opus、CBR / VBR —— 我们把音频编码(比视频简单得多)讲清楚,再把"码率分配策略"(CBR vs VBR)这个视频、音频都要面对的问题一次说透。模块 5(编码)的收尾一课,下节课见。
📁 本课配图:
imgs/20-01~imgs/20-11📌 源码锚点:plugins/obs-x264/obs-x264.c:302(validate_preset 回退 veryfast)、:308/:310(reset_x264_params → x264_param_default_preset 应用 preset+tune)、:293/:296(apply_x264_profile → x264_param_apply_profile)、:200(preset 下拉来自 x264_preset_names)、:203(profile 下拉 baseline/main/high)、:112/:113/:114(默认 preset=veryfast / profile="" / tune="")、:539(update_settings 应用顺序:preset+tune → OBS 设置 → profile)、:656/:657(create → update_settings → x264_encoder_open);plugins/obs-nvenc/nvenc.c:166(get_nv_preset:p1–p7 → GUID,默认 P5)、:185(get_nv_tuning)、:200(get_nv_multipass)、:347(rate control)、:1391/:1395/:1401(纹理路 encode_texture2 + PASS_TEXTURE);plugins/obs-nvenc/nvenc-properties.c:16(读 preset)、:50/:51/:52(默认 p5/hq/qres);plugins/obs-nvenc/obs-nvenc.c:13(obs_module_load → nvenc_supported 门)、plugins/obs-nvenc/nvenc-helpers.c:367(nvenc_supported)、:102(load_nvenc_lib / os_dlopen)、:288(nvenc_check 子进程)、:205(拒绝旧驱动);plugins/obs-qsv11/obs-qsv11.c:1326(obs_qsv11_v2 表)、:390(target_usage TU1–TU7)、plugins/obs-qsv11/obs-qsv11-plugin-main.c:76(check_adapters 探 Intel 卡才注册)。
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言