菜单

QSV 编码器

相关源文件

本页面介绍了 OBS Studio 中 Intel QuickSync Video (QSV) 编码器的实现。QSV 编码器允许用户利用 Intel 的硬件编码能力,以低 CPU 使用率实现高效视频压缩。本文档涵盖了 QSV 编码器的架构、支持的编解码器、配置选项和平台特定考量。

有关 x264 或 NVENC 等其他编码器的信息,请参阅其各自的页面(x264 编码器NVENC 编码器)。

概述

QSV 编码器使用 Intel GPU 上可用的 Intel QuickSync Video 技术提供硬件加速编码。它支持 H.264/AVC、HEVC 和 AV1(在较新的硬件上)编解码器。该编码器作为插件实现,并与 OBS 编码器系统集成。

OBS 中 QSV 的实现使用了 Intel 的视频处理库 (VPL),它是 Intel Media SDK 的后续产品。这使得高效的硬件加速编码成为可能,同时在低 CPU 使用率下提供良好的质量。

来源:plugins/obs-qsv11/obs-qsv11.c1-150 plugins/obs-qsv11/obs-qsv11-plugin-main.c1-109

架构

QSV 编码器被构造成一个与 OBS 的编码器 API 接口的插件。实现包含多个层,从面向 OBS 的接口到硬件抽象层。

来源:plugins/obs-qsv11/obs-qsv11.c83-136 plugins/obs-qsv11/QSV_Encoder.h57-171 plugins/obs-qsv11/QSV_Encoder_Internal.h56-140

组件详解

  1. obs_qsv 接口:OBS 编码器 API 与 QSV 实现之间的桥梁,处理编码器回调和设置。

  2. QSV_Encoder API:提供一个简化的 C 接口,用于 OBS 可使用的编码操作。

  3. QSV_Encoder_Internal:处理编码任务的详细实现,直接与 Intel VPL 交互。

  4. 通用工具:用于内存分配、设备检测和资源管理的实用函数和平台特定实现。

  5. 平台层:Windows 上的 DirectX 11 和 Linux 上的 VA-API,用于 GPU 内存管理和硬件交互。

  6. VPL/Media SDK:与硬件编码器交互的 Intel 媒体库。

来源:plugins/obs-qsv11/QSV_Encoder_Internal.cpp57-168 plugins/obs-qsv11/QSV_Encoder.cpp57-110

编码过程

编码过程涉及从帧采集到生成压缩比特流数据的几个步骤。

来源:plugins/obs-qsv11/obs-qsv11.c832-847 plugins/obs-qsv11/QSV_Encoder_Internal.cpp687-785

QSV 编码器类型

OBS 提供多种 QSV 编码器类型以支持不同的编解码器和输入方法

编码器名称编解码器描述
obs_qsv_encoderH.264传统 H.264 软件输入编码器 (v1)
obs_qsv_encoder_v2H.264H.264 软件输入编码器 (v2)
obs_qsv_encoder_texH.264H.264 基于纹理的编码器 (v1)
obs_qsv_encoder_tex_v2H.264H.264 基于纹理的编码器 (v2)
obs_qsv_av1_encoderAV1AV1 软件输入编码器
obs_qsv_av1_encoder_texAV1AV1 基于纹理的编码器
obs_qsv_hevc_encoderHEVCHEVC 软件输入编码器
obs_qsv_hevc_encoder_texHEVCHEVC 基于纹理的编码器

基于纹理的编码器允许直接 GPU 到 GPU 传输,在源已位于 GPU 上时提供更好的性能。

来源:plugins/obs-qsv11/obs-qsv11.c834-905 plugins/obs-qsv11/obs-qsv11-plugin-main.c67-107

技术实现

QSV 编码器实现涉及多个协同工作的关键组件,以提供硬件加速编码。

来源:plugins/obs-qsv11/QSV_Encoder_Internal.cpp132-166 plugins/obs-qsv11/obs-qsv11.c757-847

内存和表面管理

编码器根据平台使用不同的内存管理策略

  1. Windows (DirectX 11):

    • 使用 ID3D11Texture2D 表面进行帧数据处理
    • 支持共享纹理以实现直接 GPU 内存访问
    • 通过 DirectX 接口管理资源
  2. Linux (VA-API):

    • 使用 VA 表面进行帧数据处理
    • 与 DRM/PRIME 集成以进行缓冲区共享
    • 映射 OBS 和 Intel 编码器之间的内存

来源:plugins/obs-qsv11/common_directx11.cpp1-45 plugins/obs-qsv11/common_utils_linux.cpp46-155

配置选项

QSV 编码器通过 OBS UI 向用户公开了几个配置选项。这些选项控制编码质量、性能和比特率特性。

目标用途(速度/质量权衡)

“目标用途”设置控制编码器的速度/质量权衡

描述
TU1最佳质量,最慢性能
TU2较慢预设
TU3慢速预设
TU4平衡(默认)
TU5快速预设
TU6更快预设
TU7最佳速度,较低质量

来源:plugins/obs-qsv11/data/locale/en-US.ini1-22 plugins/obs-qsv11/obs-qsv11.c485-498

码率控制方法

QSV 支持各种码率控制方法

方法描述
CBR恒定比特率 - 维持目标比特率
VBR可变比特率 - 改变比特率以维持质量,最高可达最大比特率
CQP恒定量化参数 - 使用固定 QP 值
ICQ智能恒定质量 - 基于质量的码率控制

来源:plugins/obs-qsv11/obs-qsv11.c599-606 plugins/obs-qsv11/QSV_Encoder.h76-80

编解码器配置文件

不同的编解码器支持不同的配置文件

编解码器配置文件
H.264Baseline, Main, High
HEVCMain, Main10 (用于 HDR)
AV1主进程

来源:plugins/obs-qsv11/obs-qsv11.c502-525 plugins/obs-qsv11/QSV_Encoder.h82-84

延迟选项

QSV 提供不同的流媒体延迟模式

模式描述
超低端到端延迟 <500ms,最低质量
降低延迟并带有一些前瞻
正常更高延迟,但质量更好

来源:plugins/obs-qsv11/data/locale/en-US.ini8-9 plugins/obs-qsv11/obs-qsv11.c609-621

平台检测和功能

QSV 插件执行平台检测以确定可用的 Intel GPU 及其功能,包括支持的编解码器。

来源:plugins/obs-qsv11/obs-qsv11-plugin-main.c76-107 plugins/obs-qsv11/common_utils_windows.cpp159-229 plugins/obs-qsv11/common_utils_linux.cpp478-518

纹理共享实现

对于基于纹理的编码,插件实现了 OBS 和 Intel 编码器之间的直接 GPU 内存共享。

对于 Windows,这使用 Direct3D 11 共享纹理。对于 Linux,这使用 VA-API 和 DRM PRIME 缓冲区共享。

来源:plugins/obs-qsv11/QSV_Encoder_Internal.cpp787-832 plugins/obs-qsv11/common_utils_linux.cpp223-245

编解码器选择和硬件要求

编解码器的可用性取决于 Intel GPU 硬件。

编解码器最低硬件要求
H.264第二代 Intel Core (Sandy Bridge) 或更新
HEVC第五代 Intel Core (Broadwell) 或更新
AV1第十二代 Intel Core (Alder Lake) 或更新

该插件自动检测可用的 GPU 功能,并仅启用支持的编解码器。

来源:plugins/obs-qsv11/QSV_Encoder.cpp235-315 plugins/obs-qsv11/obs-qsv-test/obs-qsv-test.cpp94-112

错误处理

QSV 编码器实现了全面的错误处理,为用户提供有意义的反馈。

  1. 初始化错误:检测平台兼容性问题。
  2. 格式支持:验证输入格式与编解码器的兼容性。
  3. 资源分配:处理内存分配失败。
  4. 编码错误:报告编码问题。

发生错误时,插件会提供描述性的错误消息以指导用户。

来源:plugins/obs-qsv11/QSV_Encoder.cpp76-128 plugins/obs-qsv11/obs-qsv11.c769-799

与 OBS 集成

QSV 编码器通过回调函数与 OBS 的编码器 API 集成

  1. obs_qsv_create_xxx:创建编码器实例
  2. obs_qsv_destroy:销毁编码器实例
  3. obs_qsv_encode:编码帧
  4. obs_qsv_update:更新编码器设置
  5. obs_qsv_defaults_xxx:设置默认参数
  6. obs_qsv_props_xxx:定义 UI 属性

这些回调在插件加载时注册到 OBS。

来源:plugins/obs-qsv11/obs-qsv11.c111-133 plugins/obs-qsv11/obs-qsv11.c834-847

平台特定考量

Windows 实现

在 Windows 上,QSV 编码器使用 DirectX 11 进行 GPU 内存管理。

  1. 创建与 Intel GPU 关联的 D3D11 设备
  2. 为帧数据分配 D3D11 纹理
  3. 使用共享句柄进行直接 GPU 到 GPU 内存访问

来源:plugins/obs-qsv11/common_directx11.cpp1-45 plugins/obs-qsv11/common_utils_windows.cpp18-121

Linux 实现

在 Linux 上,QSV 编码器使用 VA-API 进行 GPU 内存管理。

  1. 打开相应的 DRM 渲染节点
  2. 从 DRM 文件描述符创建 VA 显示
  3. 为帧数据分配 VA 表面
  4. 使用 DRM PRIME 缓冲区共享进行直接 GPU 到 GPU 内存访问

来源:plugins/obs-qsv11/common_utils_linux.cpp30-155 plugins/obs-qsv11/common_utils_linux.cpp396-480

结论

QSV 编码器为拥有 Intel GPU 的 OBS 用户提供高效的硬件加速编码解决方案。通过利用 Intel 的 QuickSync Video 技术,它以最小的 CPU 使用率提供良好的视频质量。该插件支持多种编解码器(H.264、HEVC、AV1)和各种配置选项,以平衡质量、性能和比特率要求。