首页 / FFmpeg 入门教程 / 硬件加速

FFmpeg 入门教程

硬件加速

本教程共 32 篇 · 第 31 篇 · 更新于 2026-08-09 · 约 5 分钟阅读

FFmpeg硬件加速NVENCQSVVAAPIVideoToolboxGPU

本节目标:搞清硬件加速到底加速了什么,认识各平台的技术和编码器命名,能在自己的机器上用 GPU 编解码,不再把硬件加速当玄学。

CPU 编码质量好但慢,GPU/专用芯片编码快但同码率下质量略低。转一部 4K 电影软编码可能要几小时,硬编码几十分钟就能搞定。直播、录屏、批量转码,硬件加速是刚需。

一、硬件加速加速的是什么

视频处理有三个环节可能用到硬件:

  1. 硬解码:GPU 解码视频输入,降低 CPU 占用。
  2. 硬编码:GPU 编码视频输出,速度快、CPU 占用低。
  3. 硬件滤镜:在 GPU 内存里做缩放、去隔行等操作,避免数据在 CPU/GPU 之间来回拷贝。

最常见的用法是硬编码(编码器换成 h264_nvenc 之类)和硬解+硬编(输入输出都走 GPU)。纯硬解而用软编意义不大(除非只是为了降低播放时 CPU)。

先看你的 FFmpeg 支持哪些硬件加速:

ffmpeg -hwaccels

列出可用的硬件加速方法。再看支持哪些硬编码器:

ffmpeg -encoders | findstr nvenc      # Windows
ffmpeg -encoders | grep -E "nvenc|qsv|vaapi|videotoolbox|amf"

二、各平台技术与命名

平台解码 API编码 APIFFmpeg 编码器后缀
NVIDIA 显卡NVDEC / CUVIDNVENC_nvenc
Intel 核显Quick SyncQuick Sync_qsv
AMD 显卡AMF / UVDAMF / VCE_amf
LinuxVAAPI / VDPAUVAAPI_vaapi
macOSVideoToolboxVideoToolbox_videotoolbox

常见编码器完整名:

  • NVIDIA:h264_nvenchevc_nvencav1_nvenc(Ada Lovelace 及更新)
  • Intel QSV:h264_qsvhevc_qsvav1_qsv
  • AMD:h264_amfhevc_amfav1_amf
  • Linux VAAPI:h264_vaapihevc_vaapi
  • macOS:h264_videotoolboxhevc_videotoolbox

三、NVIDIA NVENC(最常用)

N 卡的硬编质量和生态最成熟。

简单硬编

ffmpeg -i input.mp4 -c:v h264_nvenc -cq 23 output.mp4
  • -c:v h264_nvenc:用 NVENC 编码 H.264
  • -cq 23:Constant Quality 模式,数值类似 CRF,越小质量越好(常用 20–28)
  • 也可以用 -b:v 指定码率做 CBR/VBR

指定 preset(NVENC 的 preset 和 x264 不同):

ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -cq 23 output.mp4

NVENC preset 从 p1(最快)到 p7(最慢质量最好),常用 p4p6

硬解 + 硬编(全 GPU 管线)

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 \
  -c:v h264_nvenc -cq 23 -c:a copy output.mp4

-hwaccel cuda 让解码走 GPU,-hwaccel_output_format cuda 让解码后的数据留在显存里,直接送给 NVENC,避免回传 CPU,速度最快。

HEVC / AV1

ffmpeg -i input.mp4 -c:v hevc_nvenc -cq 26 output.mp4
ffmpeg -i input.mp4 -c:v av1_nvenc -cq 30 output.mp4

AV1 硬编码需要 Ada Lovelace(RTX 40 系)或更新的 N 卡。

四、Intel QSV

Intel 核显用户用 QSV:

ffmpeg -i input.mp4 -c:v h264_qsv -global_quality 23 output.mp4
  • -global_quality 23 类似 CRF/Q 值
  • preset 用 -preset veryfast|faster|medium|slow|veryslow

硬解硬编全管线:

ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
  -c:v h264_qsv -global_quality 23 output.mp4

注意 QSV 的设备初始化在不同驱动下行为不同,Windows 上通常直接能用;Linux 上可能需要先 -init_hw_device qsv=hw

五、Linux VAAPI

VAAPI 是 Linux 上的通用硬件加速接口,可驱动 Intel、AMD 显卡。

ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 \
  -vf 'format=nv12,hwupload' -c:v h264_vaapi -b:v 4000k output.mp4
  • -vaapi_device 指定 GPU 设备节点
  • format=nv12,hwupload 把帧上传到 GPU(VAAPI 要求 nv12 格式)
  • 码率用 -b:v,VAAPI 编码器对 CRF 支持有限

硬解硬编:

ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
  -i input.mp4 -c:v h264_vaapi -b:v 4000k output.mp4

VDPAU 是 NVIDIA 早年为 Linux 推的解码 API,现在基本被 VAAPI 取代,新系统直接用 VAAPI 即可。

六、macOS VideoToolbox

苹果系统用 VideoToolbox:

ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 4000k output.mp4
ffmpeg -i input.mp4 -c:v hevc_videotoolbox -q:v 65 output.mp4
  • -q:v 取值 0–100,越大质量越好(和 CRF 方向相反),常用 50–75
  • Apple Silicon 的硬编效率很高,是 Mac 上的首选

七、AMD AMF

A 卡用 AMF:

ffmpeg -i input.mp4 -c:v h264_amf -quality quality -b:v 4000k output.mp4
ffmpeg -i input.mp4 -c:v hevc_amf -rc cqp -qp_i 24 -qp_p 24 output.mp4

AMF 的码率控制选项和 NVENC 不同,常用 -rc cqp(固定 QP)或 -rc vbr_peak

八、硬件编码质量提示

Warning

硬件编码器同码率下质量通常不如 x264/x265 软件编码。如果追求极致画质和体积,用 slow preset 的软编码;如果追求速度(直播、录屏、批量转 4K),硬编码是正确选择。不要在二者之间期待”又快又好”。

实际建议:

  • 直播、屏幕录制:直接硬编,质量够用,CPU 不卡。
  • 批量转码大量文件:硬编省时间,功耗也低。
  • 电影归档、追求压缩率:用 libx265/libsvtav1 软编码,慢慢压。
  • 不确定有没有硬编:先跑 ffmpeg -encoders | findstr nvenc(或对应后缀),有就用。

九、录屏 + 硬编组合

把第 30 章的采集和这章结合,Windows 上 N 卡录屏的高效命令:

ffmpeg -init_hw_device d3d11va -filter_complex ddagrab=0 \
  -c:v h264_nvenc -cq 20 -preset p5 output.mkv

ddagrab 在 GPU 上抓帧,直接送给 NVENC,全程数据不回 CPU,是性能最优的录屏方案。

Note

编码器名字不要臆造。比如没有 h264_cuda 这个编码器(CUDA 是计算框架不是编码器),正确的是 h264_nvenc。写命令前用 ffmpeg -encoders 查一下实际支持的名字,能避免大量”Unknown encoder”报错。