2024-02-24更新。

草稿

"Intel Quick Sync Video" 是许多英特尔 GPU 内部可用的一组硬件功能的市场名称。

硬件支持

笔记
Platform Name Graphics Adds support for... Ironlake gen5 MPEG-2, H.264 decode. Sandy Bridge gen6 VC-1 decode; H.264 encode. Ivy Bridge gen7 JPEG decode; MPEG-2 encode. Bay Trail gen7 Haswell gen7.5 Broadwell gen8 VP8 decode. Braswell gen8 H.265 decode; JPEG, VP8 encode. Skylake gen9 H.265 encode. Apollo Lake gen9 VP9, H.265 Main10 decode. Kaby Lake gen9.5 VP9 profile 2 decode; VP9, H.265 Main10 encode. Coffee Lake gen9.5 Gemini Lake gen9.5 Cannon Lake gen10 Ice Lake gen11 H.265 8 bits 422/444 decode,encode; vp9 8/10 bits 444 decode,encode Tiger Lake gen12 av1 8,10 bits; H.265 12 bits decode;vp9 12 bits decode Rocket Lake gen12 DG1 gen12 vp8 encode removed SG1 gen12 Alder Lake gen12 DG2 gen12 AV1 encode. Raptor Lake gen12 -

每个新平台支持比前一个平台更多的功能。您可以在这里找到详细信息。质量和性能基准测试:ATS-M:此处;DG1:此处。

API 支持

硬件可以通过多个不同的API访问:

在Linux / Windows上的libvpl

这是一个来自英特尔的库,可以作为英特尔oneAPI视频处理库(OneVPL)的一部分进行安装。OneVPL是MSDK的继承者,并将支持更多的编码和解码情况。规格书:https://spec.oneapi.io/versions/latest/elements/oneVPL/source/index.html

VAAPI和iHD驱动器,英特尔的较新VAAPI驱动版本,它也被Linux上的libmfx和libvpl所使用。有一个完全免费的发行版,其中包含了闭源内核。

DXVA2 / D3D11VA 这些是标准的Windows API,由Intel显卡驱动程序实现以支持视频解码。

libmfx在Linux / Windows上。这是一个来自英特尔的库,可以作为英特尔媒体SDK的一部分进行安装,并支持一部分编码和解码情况。

VAAPI搭配i965驱动 这是用于libva/VAAPI基础结构的大部分免费(但见下文)驱动。大多数Linux发行版都会打包这个驱动。

媒体基础是另一个Windows API,它通过英特尔图形驱动支持一些编码和解码情况。在ffmpeg中不支持。

笔记
Linux

一个完整的开源媒体栈被提供,支持更广泛的硬件平台和Linux发行版。(你也可以从 https://software.intel.com/en-us/intel-media-server-studio/ 下载安装二进制文件的 Media Server Studio。然而,Media Server Studio 只支持有限的硬件平台和Linux发行版。)

Intel开源媒体堆栈

笔记
Project Name Supported Gen Graphics Open Source Repo oneVPL gen12+ https://github.com/oneapi-src/oneVPL iHD driver gen8+ https://github.com/intel/media-driver Libva gen5+ https://github.com/intel/libva MSDK gen8 ~ gen12(Rocket Lake) https://github.com/Intel-MediaSDK/MediaSDK i965 driver gen5 ~ gen9.5 https://github.com/intel/intel-vaapi-driver

注:对于MSDK和oneVPL,这里列出的支持的Gen显卡是指运行时的支持。它们各自的调度程序可以加载其他运行时。

i965 vs. iHD 驱动程序 vs. libvpl / libmfx

iHD驱动支持VAAPI、libmfx(MSDK)和libvpl(oneVPL),与OpenCL及Intel OpenCL扩展兼容。

在某些情况下(如look_ahead算法),iHD + libvpl (oneVPL) / libmfx (MSDK) 可能会提供更好的编码质量。在许多情况下提供更高的编码吞吐量。更广泛的编解码器支持。为也可能运行在Windows上的应用程序提供通用API。

i965驱动支持VAAPI,i965已作为大多数Linux发行版的标准包进行打包。可在较旧和价格更低廉的设备上运行。为可能还会使用Mesa的AMD硬件的应用程序提供通用API。与标准API(EGL/OpenGL, OpenCL)兼容。

笔记
Windows

MSDK 运行时是英特尔图形驱动程序的一部分。在 Windows 上不需要安装 SDK。SDK 可能仍然对参考和文档很有用:https://software.intel.com/media-sdk

跑步

笔记
VAAPI

参见硬件/VAAPI。

笔记
DXVA2 / D3D11VA

libvpl这个库是libmfx的后续产品。它将支持英特尔的平台,从Alder Lake开始,并将增加新的功能。libvpl.so与MSDK的运行时(libmfxhw64.so)兼容,而libmfx.so也具有与oneVPL的运行时(libmfx-gen.so)的向前兼容性。

libmfx库有很多设置选项,有效值的可能性取决于版本和硬件。libavcodec尝试将常见选项合理地映射到libmfx选项,但这种映射是粗略的,并且在速率控制方面有缺陷。

在Linux上安装oneVPL / Media SDK

安装oneVPL

安装调度程序:跟随指南 https://github.com/oneapi-src/oneVPL

安装运行时环境:请按照 https://github.com/oneapi-src/oneVPL-intel-gpu 的指南进行操作。

使用开源MSDK堆栈安装

安装MSDK和iHD驱动程序:请按照https://github.com/Intel-Media-SDK/MediaSDK 的指南从源代码构建。从Ubuntu 19.04开始,可以通过apt进行安装(详见:https://github.com/Intel-Media-SDK/MediaSDK/wiki/Intel-media-stack-onUbuntu)。

笔记
sudo apt-get install libva-dev libmfx-dev

使用oneVPL构建FFmpeg

笔记
./configure --enable-libvpl && make -j8 && make install

使用MSDK编译FFmpeg

笔记
./configure --enable-libmfx && make -j8 && make install

i965 VAAPI 驱动的许可状态

所有用户源代码都是可用的,但它包含了编译后的专有GPU代码块。由于不是所有人类可读的源代码都可获得,这无疑使得它与GPL(通用公共许可证)不兼容,并可能导致与其他著作权共享许可证的问题。使用libva的动态加载框架可以在很大程度上避免这个问题,因此是鼓励的。

完整示例

有关参数详细说明,请参阅文档。QSV解码器,QSV编码器。

仅解码

检查支持的qsv解码器列表

笔记
ffmpeg -decoders|grep qsv

H264视频解码并下载为yuv420p原始文件

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf hwdownload,format=nv12 -pi

H264视频解码并用SDL显示

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf hwdownload,format=nv12 -pi

H264视频解码但不输出(这可以作为解码器的初步基准测试)

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -f null -

HEVC 10位视频解码并以p010le yuv文件格式下载

笔记
ffmpeg -hwaccel qsv -c:v hevc_qsv -load_plugin hevc_hw -i input.mp4 -vf hwdow

只编码

检查支持的qsv编码器列表

笔记
ffmpeg -encoders|grep qsv

检查h264编码器的私有选项列表

笔记
ffmpeg -h encoder=h264_qsv

使用VBR模式将1080p原始yuv输入编码为5Mbps的H264。

笔记
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -f rawvideo -pix_fmt yuv42

编码一个1080p p010le原始YUV输入为HEVC主文件10配置文件(自从Kaby Lake平台起支持)

笔记
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -v verbose -f rawvideo -vi -vf 'hwupload=extra_hw_frames=64,format=qsv' -c:v hevc_qsv -profile:v main10

转码

软件解码 + h264 qsv 编码,使用5Mbps的定码率(CBR)模式进行编码

笔记
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i input.mp4 -vf hwupload=

软件解码 + h264 QSV 编码,采用 CQP 模式

笔记
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i input.mp4 -vf hwupload=

H264 qsv解码 + 使用VBR和Look_ahead模式(一些平台可能不支持look_ahead)进行5Mbps的h264 qsv编码

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv -b:v 5M -look_ah

如前所述,但使用ICQ模式(与x264的crf模式类似)

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv -global_quality

如前所述,但使用ICQ和Look_ahead模式。

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v h264_qsv -global_quality

HEVC QSV解码 + QSV缩放至1080p@60fps + H264 QSV编码

笔记
ffmpeg -hwaccel qsv -c:v hevc_qsv -i input.mp4 -vf 'vpp_qsv=framerate=60,scal

使用QSV(Quick Sync Video)硬件解码HEVC视频流,然后将其缩放至1080p分辨率@60帧每秒,并将色彩空间从NV12转换为RGB32,最后通过SDL(Simple DirectMedia Layer)进行输出。

笔记
ffmpeg -hwaccel qsv -c:v hevc_qsv -i input.mp4 -vf 'vpp_qsv=framerate=60,scal

1:N转码:(如果MSDK支持的话,默认会启用MFE)

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \ -filter_complex "split=2[s1][s2]; [s1]scale_qsv=1280:720[o1];[s2]scal -map [o1] -c:v h264_qsv -b:v 3200k 3200a.mp4 \ -map [o2] -c:v h264_qsv -b:v 1750k 1750a.264

M:N 转码

笔记
ffmpeg -hwaccel qsv -c:v h264_qsv -i input1.mp4 -hwaccel qsv -c:v h264_qsv -filter_complex '[0:v]split=2[out1][out2],[1:v]split=2[out3][out4]' \ -map '[out1]' -c:v h264_qsv output1.mp4 -map '[out2]' -c:v h264_qsv outp -map '[out3]' -c:v h264_qsv output3.mp4 -map '[out4]' -c:v h264_qsv outp

-qsv_device是一个qsv自定义选项,可用于指定硬件设备,并在有多个可用设备时(例如:一个Intel集成GPU和一个AMD/Nvidia独立显卡)避免默认设备初始化失败。

一个关于Linux的例子(更多详情请见 https://trac.ffmpeg.org/ticket/7649)

笔记
ffmpeg -hwaccel qsv -qsv_device /dev/dri/renderD128 -c:v h264_qsv -i input.mp

混合转码

也可以使用“vaapi解码 + vaapi缩放 + qsv编码”(可在Linux平台上使用)

笔记
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i input.mp4 -vf 'scale_va

或者使用“dxva解码 + qsv缩放 + qsv编码”(适用于Windows系统)

笔记
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input.mp4 -vf 'hwma