3、Intel QSV基础:QSV架构介绍、初始化QSV设备、查看QSV支持的编码器/解码器

各位同学,欢迎来到第三章。从这一章开始,我们正式进入硬件加速的实战环节。

今天聊的是Intel Quick Sync Video,简称QSV。这是Intel集成显卡里自带的一套硬件编解码引擎。说白了,就是CPU里那块“不太起眼”的核显,其实藏着专门干视频活儿的加速单元。

我最早接触QSV是在做视频监控平台的时候。那时候服务器CPU负载动不动就飙到90%,加了QSV转码之后,直接降到30%以下。嗯,从那以后,我对核显的看法彻底变了。

3.1 QSV架构:到底长什么样?

先看一张图,把QSV的整体架构理清楚。

Intel QSV 架构概览 CPU 主控层(Host) 应用程序 / FFmpeg / 驱动(i915 / libva) 媒体引擎层(Media Engine) MFX 会话管理 / 编解码调度 / 内存管理 VPP(视频预处理:缩放、去隔行、色彩转换) 硬件编解码单元(Fixed-Function) H.264 编码器 HEVC 编码器 AV1 解码器 VP9 解码器 注意:不同代际的 Intel GPU,支持的编解码格式差异很大

从上往下看,三层结构很清晰:

  • CPU 主控层:跑你的应用程序、FFmpeg 进程、驱动栈。说白了,它负责发号施令。
  • 媒体引擎层:这是 QSV 的核心调度模块。它管理编解码会话、分配显存、调度 VPP 管线。
  • 硬件编解码单元:真正的“苦力”。每个单元都是固定功能的 ASIC 电路,只干一件事——比如 H.264 编码器只管编码,不干别的。
个人经验: 我刚开始以为 QSV 是纯硬件干活,CPU 可以完全歇着。后来发现不对——驱动层和媒体引擎层仍然会占用少量 CPU 资源。不过相比纯软编,CPU 占用能降 80% 以上,已经很香了。

3.2 初始化QSV设备:动手前的第一步

在 FFmpeg 里用 QSV,第一步就是初始化设备。说白了,就是告诉 FFmpeg:“嘿,我要用 Intel 核显干活了。”

命令很简单:

ffmpeg -init_hw_device qsv=qsv -hwaccel qsv -i input.mp4 -f null -

这条命令干了三件事:

  1. -init_hw_device qsv=qsv:创建一个名为“qsv”的硬件设备上下文。
  2. -hwaccel qsv:启用 QSV 硬件加速解码。
  3. -f null -:只解码,不输出文件。用来测试设备是否正常。

如果执行成功,你会看到类似这样的输出:

[AVHWDeviceContext @ 0x...] Initialize MFX session: API version 2.0, implementation version 1.35
[AVHWDeviceContext @ 0x...] VAAPI driver: Intel iHD driver for Intel(R) Gen Graphics

看到 Initialize MFX session 就说明设备初始化成功了。

避坑指南: 我曾经在一台服务器上怎么都初始化失败,后来发现是 BIOS 里把核显给禁了。还有一次是驱动版本太老,不支持新 API。所以如果初始化报错,先检查两件事:1) BIOS 里核显是否开启;2) 驱动是否安装正确。

3.3 查看QSV支持的编码器/解码器

不同代际的 Intel 核显,支持的编解码格式差别很大。比如老款 Skylake 只支持 H.264 编码,而新款 Arc 显卡已经支持 AV1 编码了。

怎么查?用 FFmpeg 的 -encoders 和 -decoders 参数,加上 qsv 过滤:

# 查看所有 QSV 编码器
ffmpeg -encoders | grep qsv

# 查看所有 QSV 解码器
ffmpeg -decoders | grep qsv

输出示例:

 V..... h264_qsv             H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (qsv)
 V..... hevc_qsv             HEVC (H.265) (qsv)
 V..... mjpeg_qsv            MJPEG (qsv)
 V..... mpeg2_qsv            MPEG-2 (qsv)
 V..... vp9_qsv              VP9 (qsv)
 V..... av1_qsv              AV1 (qsv)

注意前面的 V 表示视频编码器,..... 表示能力标记。如果某个编码器没出现,说明你的硬件不支持。

我整理了一张常见 Intel 平台的 QSV 编解码支持表,方便你对照:

Intel 平台 GPU 架构 H.264 编码 HEVC 编码 VP9 解码 AV1 解码 AV1 编码
Skylake (6代) Gen9 ✅ ❌ ❌ ❌ ❌
Kaby Lake (7代) Gen9.5 ✅ ✅ 8bit ❌ ❌ ❌
Tiger Lake (11代) Gen12 ✅ ✅ 10bit ✅ ✅ ❌
Alder Lake (12代) Gen12.2 ✅ ✅ 10bit ✅ ✅ ❌
Arc A系列 Xe HPG ✅ ✅ 10bit ✅ ✅ ✅
核心要点: 查支持列表是每个 QSV 项目的“第一道门槛”。我建议你在项目开始前,先跑一遍 ffmpeg -encoders | grep qsv,把结果截图保存。这样后面遇到编码失败的问题,可以快速排除硬件不支持的可能性。

3.4 更细粒度的能力查询

有时候光知道“支持 HEVC 编码”还不够。你还想知道:支持 10bit 吗?支持 B 帧吗?最大分辨率是多少?

这时候可以用 FFmpeg 的 -h encoder=hevc_qsv 来查:

ffmpeg -h encoder=hevc_qsv

输出会包含类似这样的信息:

Encoder hevc_qsv [HEVC (H.265) (qsv)]
    General capabilities: dr1 delay
    Threading capabilities: none
    Supported pixel formats: nv12 p010le
    Supported rate control methods: cbr vbr cqp icq la_icq
    Supported profiles: main main10
    Maximum encoding resolution: 8192x8192

这里的信息非常关键:

  • p010le 表示支持 10bit 像素格式。
  • main10 表示支持 10bit 编码 profile。
  • 8192x8192 是最大分辨率,8K 以内都没问题。
我的习惯: 每次拿到一台新机器,我都会先跑一遍 ffmpeg -h encoder=*_qsv 把所有 QSV 编码器的能力 dump 出来,存成一个文本文件。这样后面写脚本的时候,直接查文件就行,不用每次都跑命令。

3.5 本章小结

这一章我们干了三件事:

  • 理清了 QSV 的三层架构:CPU 主控层 → 媒体引擎层 → 硬件编解码单元。
  • 学会了用 -init_hw_device qsv 初始化 QSV 设备。
  • 掌握了用 ffmpeg -encoders | grep qsv 和 ffmpeg -h encoder=*_qsv 查询编解码能力。