各行各业对高质量视频的需求持续加速,为从沉浸式串流体验到远程协作、生成式 AI 媒体工具和大规模内容交付等各个方面提供支持。
这些体验的背后是对更快、更高效且能够处理日益复杂的格式和工作负载的视频管线的需求日益增长。NVIDIA Video Codec SDK 通过 NVIDIA 专用硬件视频引擎提供对 GPU 加速视频编码和解码的访问,帮助开发者应对这一挑战。
NVIDIA Video Codec SDK 13.1 现已推出。我们鼓励开发者在其视频工作流中探索新功能,利用重新设计的示例应用,并通过 NVIDIA 开发者论坛分享反馈。
SDK 13.1 新增功能
编码功能:
- 适用于多达 31 个 B 帧的 AV1 的分层参考模式
- UHQ 调优信息与迭代编码相结合
解码功能:
- H.264 和 HEVC 的逐宏块解码统计信息
- 在 MV-HEVC 解码期间查看信息
寻求特定帧
转码功能:
- 应用分配的
CUarray作为 NVIDIA 视频编码器 (NVENC) 输入和 NVIDIA 视频解码器 (NVDEC) 输出 - 采用基于队列的模块化架构,重新设计了转码器示例
其他特性:
- 基于 Docker 的官方开发环境
编码改进
为何选择 AV1 分层参考模式
使用 B 帧作为参考可提高编码质量。分层参考模式通过将 B 帧安排在树状参考结构中进一步改进:叶节点是非参考 B 帧,根是中间的 B 帧。这种结构将 NVENC 的最大 B 帧数量从 7 帧增加到 31 帧,使编码器能够利用时间冗余并提高整体质量。使用此模式不会增加任何性能损失,但视频内存消耗会更高。

SDK 13.1 为 AV1 添加了分层参考模式,支持 1、3、7、15 和 31 B 帧;H.264 和 HEVC 将在未来的驱动版本中采用。该模式在七个或更多 B 帧时最有效,对性能的影响最小。有关配置详情,请参阅 NVENC 编程指南。
下方的图 2 显示了在 Constant Quality (CQ) 模式下编码 15 个 B 帧时,与在预设 p7 中使用 NVENC 的 High Quality (HQ) 调优相比,可节省的比特率。

下方的图 3 显示了以可变比特率 (VBR) 编码 15 个 B 帧时节省的比特率。

具有迭代编码的 UHQ 调优信息
迭代编码 (在 Video Codec SDK 12.1 中引入) 会冻结编码器的自动状态推进,并允许用户使用不同的参数重新编码同一帧。NVENC 会跟踪每次迭代的状态,并且可以停止并提交到其中的任何一次迭代。
UHQ 调优信息 (在 Video Codec SDK 12.2 中引入) 结合了前瞻性级别和时间过滤,可在延迟容忍编码中实现最佳质量与性能权衡。时间过滤通过使用运动估计在相邻帧中找到匹配的色块并应用它们来过滤当前帧,从而减少自然视频中的噪声,从而使自然内容的平均编码收益达到 4 – 5%。前瞻性功能可分析未来的帧,并使用编码树单元 (CTU) 和其他统计数据来高效分配比特以进行速率控制。目前支持四个具有不同性能和质量权衡的前瞻性级别。
版本 13.1 结合了 UHQ 调优信息与迭代编码,因此前瞻性级别和时间过滤现在与每次迭代重新编码一起使用。
解码改进
逐宏块解码统计
现在,NVDECODE API 可针对 H.264 和 H.265 (HEVC) 内容的每一解码帧检索详细的每宏块解码统计信息。对于每个 16 × 16 的块,解码器会显示 Luma 量化参数 (QP) 、编码单元类型 ( Intra、Inter、Skip 或 PCM) 以及多达两个运动矢量 (向前和向后) ,所有这些均提取为硬件解码的自然副产物,且不会产生额外的 CPU 开销。
这些统计数据解锁了 GPU 加速的视频分析工作流程,而之前这些工作流程需要 CPU 端比特流解析。运动矢量可实现场景变化检测、物体追踪和镜头边界分析。QP 值为自适应比特率优化和质量监控提供了编码质量的逐块视图。宏块类型展示了适用于内容分类和压缩研究的编码结构。
工作流程很简单:应用程序通过 cuvidGetDecoderCaps() 查询解码器功能,在解码器创建时启用统计数据收集,并从 cuvidMapVideoFrame() 的每个解码帧中检索 GPU 驻留的统计缓冲区。用户可以将统计数据复制到主机内存,或使用 CUDA 内核直接在 GPU 上进行处理,以实现实时工作流。该 SDK 提供了一个即用型示例 AppDec -dumpstats,用于演示完整流程。
精确帧搜索
从用于物体检测、内容审核和视频摘要的推理工作流,到对大型数据集上的不同帧进行采样的训练数据准备,AI 工作流通常需要特定帧,而非顺序解码。
视频剪辑和非线性后期制作也有同样的要求。Video Codec SDK 现在通过 NvVideoDecoder 类提供全面的搜索和随机帧访问 API,使帧精确访问像数组索引一样简单,同时只获取所需的帧。
可感知 GP 的 Seek 架构会处理该请求。对于帧 N,SDK 会在目标之前找到最近的 IDR 帧,在那里寻找解复用器,并通过 CUVID_PKT_DISCONTINUITY 刷新解码器状态。
从 IDR 向前推进,只需要处理达到 N 的帧:解析器标志和跳过非参考帧,参考帧解码,但通过基于 PTS 的过滤绕过映射和后处理 (通过 cuvidMapVideoFrame() 进行格式转换、缩放、裁剪) 。只有帧 N 运行完整的解码、映射和后处理工作流。

NvVideoDecoder 类封装了低级别 SeekUtils 引擎,并提供了一个基于运算符的简洁界面。下图 5 显示了请求帧时的内部寻路流。

主要功能:
- 播放列表的解码器缓存:NvVideoDecoder 通过编解码器、位深度和色度格式缓存解码器实例,并通过 LRU 移除来重复使用这些实例,以避免重复创建开销
- 不可寻流:可自动检测基本流、网络流和管道。前向搜索非常高效;通过自动解码器重置支持向后搜索
- 灵活的帧规格:AppDecVideoDecoder 示例支持单个索引 (0,10,20) 、带步长的范围 (0:100:10) 、基于时间的访问 (-t 1.5,3.0) 以及用于批量处理的播放列表文件
- 开放式 GOP 支持:具有非 IDR I 帧的流会寻求最近的 IDR 而不是最近的关键帧,确保所有参考帧都可用
MV-HEVC 立体增强
Video Codec SDK 现可提供更好的 3D 视频支持:解码器中的视图 ID 和图层元数据;高分辨率的多 GPU 编码;以及与第三方软件更高的兼容性。
MV-HEVC 解码更新:
- 视图信息报告:解码器输出特定层和参考信息 (例如 nuh_layer_id) ,让应用按视图识别和路由帧以进行立体处理
- 更广泛的比特流支持: 解码器现在可处理由第三方编码器创建的 MV-HEVC 3D 比特流,因此左右视图均可正常播放
MV-HEVC 编码更新:
- 简化 FFmpeg 的元数据: 通过 FFmpeg 进行编码时,HEVC 3D 显示元数据现在可以正确显示在位流中,从而更轻松地创建 3D 视频
- 分帧编码 (SFE) :多个编码器可处理单帧视频,从而加快处理高分辨率 3D 和 XR 视频的速度
重新设计的转码工作流
现在,转码示例有助于提升灵活性、性能和定制化。更新后的套件包含四个应用:
- AppTransPerf. 对 NVDEC 和 NVENC 的最大吞吐量进行基准测试
- AppTrans. 1:1 转码 (可选位深转换)
- AppTransOneToN. 1:N 转码
- AppTransZeroCopy (新). 针对尽可能低的延迟进行优化的 1:1 零拷贝纯转码应用
基于队列的模块化架构
先前的实现速度快,但采用整体式:用户必须先了解整个工作流,然后再对其进行修改。版本 13.1 围绕严格模块化、基于队列的架构重新设计了示例,该架构可保证并发性、简化自定义并更大限度地提高硬件利用率。
重新设计后,在每个工作流阶段分配专用的 CPU 线程,并以“生产商 – 消费者”系统的形式运行,其中线程通过显式大小的输入和输出队列进行通信。核心 AppTrans 工作流 (下图 6) 分为四个独立的执行上下文:解码线程 (NVDEC) 处理解复用器和解码;计算线程 (CUDA) 处理处理;编码线程 (NVENC) 处理编码;输出线程收集输出和多路复用器。

每个线程都会隔离一个步骤,生成可在本地处理同步的解设计。帧按顺序穿过队列,确保安全的数据流。
重新设计的关键优势
- 模块化:仅复制和调整所需的工作流步骤。解组件可在其线程中隔离错误和异常
- 性能:保证工作流步骤之间的完全并发。分离 CPU 提交线程可确保 GPU 永远不会枯竭;一旦饱和,硬件引擎 ( NVDEC、CUDA、NVENC) 会在不同的帧上并行运行各自的阶段
- 可定制性:解队列让您完全掌控全局。只需要编码?删除解码线程,并直接馈送计算和编码队列。想要超低延迟超过吞吐量?减小队列大小,更大限度地减少缓冲区等待。是否拥有自定义 AI 滤镜?修改计算线程以隔离调度 CUDA 核函数,而不会阻塞解码器或编码器提交循环

使用 CUarray 进行零拷贝转码
在传统的转码工作流中 (如 AppTrans 中) ,解码后的帧在到达编码器之前会经过多次内部格式转换和复制。这些是标准 NvDecoder 和 NvEncoder API 的固有特性。解码器输出将转换为可供应用程序访问的表面;应用程序将其复制到编码器的输入缓冲区中;编码器将该输入再次转换为所需格式。
AppTransZeroCopy 让 NVDEC 和 NVENC 直接在同一 GPU 显存上以两种引擎都能理解的格式运行,从而消除此复制链。该机制由四个部分组成:
- 共享缓冲区池分配:在启动时,应用程序使用带有
CUDA_ARRAY3D_VIDEO_ENCODE_DECODE标志的cuArray3DCreate分配 CUDA 数组池 (CUarray) ,该标志告知 CUDA 驱动程序这些表面将在两个视频编解码器引擎之间共享。每个CUarray以 NVDEC 和 NVENC 本地访问的格式保存一帧 ( Luma 和色度平面) ,从而绕过传统工作流的中间转换。 - 双注册:相同的
CUarray注册两个编解码器。在解码器方面,它们通过SetExternalOutputArrays()作为外部输出表面提供,告知 NVDEC 将解码帧直接写入其中。在编码器方面,它们通过资源类型为NV_ENC_INPUT_RESOURCE_TYPE_CUDAARRAY的 NVENCnvEncRegisterResourceAPI 注册为输入资源,让编码器直接读取这些资源,而无需进行输入转换。 - 流水线执行:三个线程 (解码、编码和输出) 通过基于令牌的流控制通过并发队列连接,以管理解码器和编码器之间的
CUarray所有权。 - 流排序同步:NVDEC 和 NVENC 共享相同的 CUDA 流,可保证解码写入和编码读取之间的正确顺序,而无需显式 CPU-GPU 同步。
主要优势
- 降低 SM 利用率:传统工作流使用流多处理器上的多个 CUDA 复制和转换核函数在不同阶段之间穿梭帧。零复制可消除这些中间内核,从而释放 SM 资源用于 CUDA 预处理、推理或渲染
- 减少 GPU 显存占用:传统工作流在每个阶段都保留单独的缓冲区。零复制可将这些内容折叠到单个共享池中,从而显著降低每个会话的内存消耗
- 通过并发会话提高吞吐量:更低的 SM 利用率和更小的内存占用可提高可扩展性。在 SM 饱和或显存耗尽之前,GPU 可以维持更多并发转码会话
下方的图 8 显示,与传统 AppTransPerf sample 应用相比,新 AppTransZeroCopy 示例应用中的 SM 利用率较低。

下方的图 9 显示了与传统 AppTransPerf 示例应用相比,新 AppTransZeroCopy 示例应用中显存带宽利用率较低的情况。

Docker 开发环境
设置 Video Codec SDK 通常需要安装 CUDA 工具包、Vulkan SDK、系统库和 FFmpeg,然后构建 SDK 示例,通常跨不同的主机发行版和驱动程序版本。Video Codec SDK 13.1 引入了基于 Docker 的官方开发环境,可将一致的预配置堆栈打包到单个容器中。镜像基于开放的 Dockerfile 构建,因此您可以在本地或云端重现环境,并通过构建参数对其进行自定义。
镜像分为两个阶段:构建阶段编译 SDK 示例并安装 Vulkan SDK 和 FFmpeg;运行时阶段仅保留运行和开发所需的内容。堆栈引脚 CUDA 12.3.2、Vulkan SDK 1.4.304.1 和 Ubuntu 22.04 LTS。
使用 SDK_ZIP build 参数指向 Video_Codec_SDK_13.1.x.zip,并使用可选的 FFMPEG_URL 参数提供自定义 FFmpeg tarball (例如,使用 NVENC 的 LGPL 构建) ,而不是默认的 BtbN LGPL 构建。
在容器内,/video-codec-sdk/Samples/build/ 中包含预构建的示例,包括 AppDec 和 AppEncCuda,可随时使用测试向量运行。FFmpeg (LGPL) 安装在 /opt/ffmpeg 处,用于 YUV 生成、MJPEG 和 MPEG 编码以及检查已编码流。
测试向量脚本以多种格式 ( JPEG、MPEG-1/ 2/ 4) 生成原始 YUV,并且在 GPU 访问的情况下,使用 AppEncCuda 生成 H.264 和 HEVC,因此您可以练习整个工作流。容器以非 root 用户的身份运行,并包含一个用于编排器的 HEALTHCHECK。
预备知识
- 支持视频编码/ 解码的 NVIDIA GPU
- 启用 GPU 支持的 Docker
- NVIDIA 容器工具包
- SDK 包文件
将 SDK zip (例如 Video_Codec_SDK_13.1.x.zip) 置于 Docker 构建环境中并构建:
cd ubuntu22.04
docker build -t nvidia/video-codec-sdk:13.1-ubuntu22.04 \
--build-arg SDK_ZIP=Video_Codec_SDK_13.1.x.zip \
.
以 GPU 访问权限启动。您可以在启动时生成测试向量,也可以打开 shell 并直接运行示例:
# Standard launch
docker run --gpus all -it nvidia/video-codec-sdk:13.1-ubuntu22.04
# Generate the full test-vector suite during startup (~10-15 min)
docker run --gpus all -it nvidia/video-codec-sdk:13.1-ubuntu22.04 \
--generate-vectors full
# Generate only H.264 vectors at 720p
docker run --gpus all -it nvidia/video-codec-sdk:13.1-ubuntu22.04 \
--generate-vectors h264 --resolution 1280x720
生成模式包括 full、h264、hevc、vp8、vp9 和 av1。在容器内,别名 sdk-samples、test-decode 和 test-encode 跳转至 samples 目录,并使用生成的向量运行快速测试。
主要优势
- 可再现性:相同的 CUDA、Vulkan、FFmpeg 和 SDK 版本可在任意位置运行,从而减少“在我的机器上工作”的漂移
- 快速载入:克隆存储库,添加 SDK zip,运行
docker build和docker run --gpus all;无需安装主机侧 SDK 或 Vulkan - CI 和云友好型:只要有 NVIDIA 容器工具包和 GPU 支持,单个镜像即可驱动工作流和云工作负载
Dockerfile 和辅助脚本位于 video-codec-sdk-docker 存储库中。有关详细的构建选项、环境变量和故障排除,请参阅存储库 README。
开始使用视频编解码器 SDK 13.1
下载 SDK,试用工作流中的新编码、解码和转码功能,并分享其工作原理。
通过重新设计的示例,您可以轻松地将新功能引入现有工作流程或从头开始构建自定义工作流。
- 下载视频编解码器 SDK 13.1
- NVENC 编程指南
- NVDEC 编程指南
- GitHub 上的 Video-codec-sdk-docker
- NVIDIA 开发者论坛:Video Codec SDK