高质量视频的需求在各行各业持续增长,从沉浸式流媒体体验到远程协作、生成式 AI 媒体工具,再到大规模内容分发,视频技术正成为这一切的底层支撑。
在这些应用场景背后,视频处理管线需要变得更快、更高效,并能应对日益复杂的格式与工作负载。NVIDIA Video Codec SDK 借助专用硬件视频引擎,为开发者提供 GPU 加速的视频编解码能力,助力应对上述挑战。
NVIDIA Video Codec SDK 13.1 现已正式发布。官方鼓励开发者在视频处理管线中探索最新功能,充分利用经过重新设计的示例应用,并通过 NVIDIA 开发者论坛分享反馈意见。
本次更新的主要功能包括:
编码功能:AV1 分层参考模式,支持最多 31 个 B 帧;UHQ 调优信息与迭代编码的联合使用。
解码功能:H.264 和 HEVC 的逐宏块解码统计;MV-HEVC 解码中的视图信息获取;定位到指定帧。
转码功能:应用程序分配的 CUarray 作为 NVENC 输入和 NVDEC 输出;采用模块化、基于队列架构的全新转码器示例。
其他功能:官方基于 Docker 的开发环境。
AV1 分层参考模式与 B 帧
将 B 帧用作参考帧可提升编码质量,而分层参考模式通过将 B 帧组织成树状参考结构进一步强化这一效果:叶节点为非参考 B 帧,根节点为中间 B 帧。这种结构将 NVENC 支持的最大 B 帧数量从 7 提升至 31,使编码器能更充分地利用时间冗余,整体提升编码质量。该模式不会带来性能损耗,但显存占用会有所增加。
SDK 13.1 为 AV1 新增了分层参考模式,支持 1、3、7、15 和 31 个 B 帧;H.264 和 HEVC 将在后续驱动版本中跟进支持。该模式在 7 个及以上 B 帧时效果最为显著,且对性能影响极小。配置详情请参阅 NVENC 编程指南。
在恒定质量(CQ)模式下,编码 15 个 B 帧相比 NVENC 的高质量(HQ)调优(预设 p7)可显著节省码率;在可变码率(VBR)模式下同样如此。
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 的块,解码器会输出亮度量化参数(QP)、编码单元类型(帧内、帧间、跳过或 PCM)以及最多两个运动向量(前向和后向),这些数据均作为硬件解码的自然副产品提取,不产生额外的 CPU 开销。
这些统计信息解锁了以往依赖 CPU 端码流解析的 GPU 加速视频分析工作流。运动向量可用于场景切换检测、目标跟踪和镜头边界分析;QP 值可提供逐块的编码质量视图,用于自适应码率优化和质量监控;宏块类型可揭示编码结构,适用于内容分类和压缩研究。
使用流程简洁明了:应用程序通过 cuvidGetDecoderCaps() 查询解码器能力,在创建解码器时启用统计收集,并通过 cuvidMapVideoFrame() 为每个解码帧检索 GPU 侧统计缓冲区。用户可将统计数据复制到主机内存,或直接使用 CUDA 内核在 GPU 上进行实时管线处理。SDK 附带了现成可用的示例 AppDec -dumpstats,完整演示了上述流程。
帧精准定位
AI 工作流——从目标检测、内容审核、视频摘要的推理管线,到大规模数据集的多样性帧采样训练数据准备——往往需要访问特定帧而非顺序解码。视频编辑和非线性后期制作也有同样的需求。
Video Codec SDK 现通过 NvVideoDecoder 类提供全面的帧定位与随机帧访问 API,使帧精准访问像数组索引一样简单,同时只获取所需帧。
该功能采用 GOP 感知定位架构处理请求。对于第 N 帧,SDK 会找到目标帧之前最近的 IDR 帧,将解封装器定位至该处,并通过 CUVID_PKT_DISCONTINUITY 刷新解码器状态。从该 IDR 帧起,仅处理到达第 N 帧所需的帧:解析器会标记并跳过非参考帧,参考帧正常解码但通过基于 PTS 的过滤绕过映射和后处理(格式转换、缩放、裁剪等),只有第 N 帧才运行完整的解码、映射和后处理管线。
NvVideoDecoder 类封装了底层 SeekUtils 引擎,并提供了简洁的基于运算符的接口。主要功能包括:
解码器缓存(适用于播放列表):NvVideoDecoder 按编解码器、位深和色度格式缓存解码器实例,并通过 LRU 淘汰策略复用,避免频繁创建的开销。
不可寻址流:基本流、网络流和管道流可自动检测,前向定位高效执行,后向定位则通过自动重置解码器实现。
灵活的帧指定方式:AppDecVideoDecoder 示例支持单独索引(如 0,10,20)、带步长的范围(如 0:100:10)、基于时间的访问(如 -t 1.5,3.0)以及用于批量处理的播放列表文件。
开放 GOP 支持:对于包含非 IDR I 帧的流,定位到最近的 IDR 帧而非最近的关键帧,确保所有参考帧可用。
MV-HEVC 3D 视频支持增强
Video Codec SDK 现提供更完善的 3D 视频支持:解码器可输出视图 ID 和图层元数据;支持高分辨率下的多 GPU 编码;以及改进了与第三方软件的兼容性。
MV-HEVC 解码更新方面,视图信息上报功能使解码器可输出特定图层和参考信息(如 nuh_layer_id),便于应用程序按视图标识和路由帧以实现立体处理;更广泛的码流支持使解码器能够处理第三方编码器生成的 MV-HEVC 3D 码流,确保左右视图均能正确播放。
MV-HEVC 编码更新方面,简化了 FFmpeg 的元数据处理,使通过 FFmpeg 编码时 HEVC 3D 显示元数据能够正确出现在码流中;分帧编码(SFE)功能允许多个编码器协同处理单帧,为超出单个编码器处理能力的高分辨率 3D 和 XR 视频提速。
全新转码示例套件
全新转码示例套件注重灵活性、性能与可定制性,提供四个应用程序:
AppTransPerf:对 NVDEC 和 NVENC 的最大吞吐量进行基准测试。
AppTrans:带可选位深转换的 1:1 转码。
AppTransOneToN:带缩放的 1:N 转码。
AppTransZeroCopy(新增):1:1 零拷贝纯转码应用,针对最低可能延迟进行优化。
模块化、基于队列的架构
此前的实现速度较快,但结构较为单一:用户需要在修改管线前理解整个管线。13.1 版本围绕严格模块化、基于队列的架构对示例进行了重新设计,保证并发性、简化定制化,并最大化硬件利用率。
重新设计后,每个管线阶段分配一个专用 CPU 线程,构成一个生产者-消费者系统,各线程通过明确指定大小的输入输出队列进行通信。核心 AppTrans 管线被拆分为四个独立执行上下文:解码线程(NVDEC)负责解封装和解码;计算线程(CUDA)负责处理;编码线程(NVENC)负责编码;输出线程负责收集输出并封装。
每个线程独立负责一个步骤,形成解耦设计,可原生处理同步问题。帧按顺序通过队列传递,确保数据流的安全性。
该架构的主要优势包括:
模块化:只需复制和调整所需的管线步骤,解耦组件使错误和异常隔离在各自线程内。
性能:各管线步骤之间的完全并发得到保证,分离 CPU 提交线程确保 GPU 始终不会处于空闲状态;一旦饱和,硬件引擎(NVDEC、CUDA、NVENC)可在不同帧上并行运行各阶段。
可定制性:解耦的队列提供完全控制权。只需编码?移除解码线程,直接向计算和编码队列输入。需要超低延迟而非高吞吐量?减小队列大小以最小化缓冲等待。有自定义 AI 滤镜?修改计算线程以独立调度 CUDA 内核,而不阻塞解码器或编码器的提交循环。
AppTransZeroCopy 零拷贝转码
在传统转码管线(如 AppTrans)中,解码帧在到达编码器之前需要经过多次内部格式转换和复制,这是标准 NvDecoder 和 NvEncoder API 的固有特性。AppTransZeroCopy 通过让 NVDEC 和 NVENC 直接在两者均原生支持的格式下共享同一 GPU 内存来消除这一复制链。该机制由四部分组成:
共享缓冲池分配:启动时,应用程序使用 cuArray3DCreate 并带 CUDA_ARRAY3D_VIDEO_ENCODE_DECODE 标志分配一个 CUDA 数组(CUarray)池,告知 CUDA 驱动这些表面将在两个视频编解码引擎之间共享。每个 CUarray 以 NVDEC 和 NVENC 均可原生访问的格式保存一帧(亮度加色度平面),绕过传统管线的中间转换。
双重注册:同一 CUarray 同时注册到两个编解码器。在解码器端,通过 SetExternalOutputArrays() 作为外部输出表面提供,告知 NVDEC 将解码帧直接写入其中;在编码器端,通过 NVENC 的 nvEncRegisterResource API 以 NV_ENC_INPUT_RESOURCE_TYPE_CUDAARRAY 资源类型注册为输入资源,使编码器无需输入转换即可直接读取。
流水线执行:解码、编码和输出三个线程通过并发队列连接,并通过基于令牌的流量控制管理 CUarray 在解码器和编码器之间的所有权。
流有序同步:NVDEC 和 NVENC 共享同一 CUDA 流,在无需显式 CPU-GPU 同步的情况下,保证解码写入和编码读取之间的正确顺序。
零拷贝方案的主要优势包括:
降低流多处理器(SM)利用率:传统管线使用多个 CUDA 复制和转换内核在各阶段之间传输帧。零拷贝消除了这些中间内核,为 CUDA 预处理、推理或渲染释放了 SM 资源。
减少 GPU 显存占用:传统管线在每个阶段保留独立缓冲区,零拷贝将其合并为一个共享池,显著降低每会话的显存消耗。
并发会话吞吐量提升:更低的 SM 利用率加上更小的显存占用提升了可扩展性,使 GPU 在达到 SM 饱和或显存耗尽前能够维持更多并发转码会话。
基于 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 构建参数指向 Video_Codec_SDK_13.1.x.zip,可选的 FFMPEG_URL 参数可提供自定义 FFmpeg 压缩包(例如带 NVENC 的 LGPL 构建)替代默认的 BtbN LGPL 构建。
容器内,预构建的示例位于 /video-codec-sdk/Samples/build/ 目录,包括 AppDec 和 AppEncCuda,可直接结合测试向量运行。FFmpeg(LGPL)安装在 /opt/ffmpeg,用于生成 YUV、编码 MJPEG 和 MPEG,以及检查编码流。测试向量脚本可生成多种格式的原始 YUV、JPEG、MPEG-1/2/4,以及在 GPU 可用时通过 AppEncCuda 生成 H.264 和 HEVC,从而完整验证处理管线。容器以非 root 用户运行,并为编排系统提供了 HEALTHCHECK。
运行要求:
支持视频编解码的 NVIDIA GPU
已启用 GPU 支持的 Docker
NVIDIA Container Toolkit
SDK 安装包文件
将 SDK 压缩包(如 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 直接运行示例:
标准启动:docker run --gpus all -it nvidia/video-codec-sdk:13.1-ubuntu22.04
启动时生成完整测试向量套件(约 10–15 分钟):docker run --gpus all -it nvidia/video-codec-sdk:13.1-ubuntu22.04 --generate-vectors full
仅生成 720p H.264 向量: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 别名可快速跳转到示例目录,并使用生成的向量运行快速测试。
Docker 开发环境的主要优势:
可复现性:相同的 CUDA、Vulkan、FFmpeg 和 SDK 版本在任何环境下均可运行,消除"在我机器上可以运行"的环境漂移问题。
快速上手:克隆仓库、添加 SDK 压缩包、运行 docker build 和 docker run --gpus all 即可,无需在宿主端安装 SDK 或 Vulkan。
CI 与云端友好:在任何支持 NVIDIA Container Toolkit 和 GPU 的环境中,单一镜像即可驱动流水线和云端工作负载。
Dockerfile 和辅助脚本位于 video-codec-sdk-docker 仓库。详细构建选项、环境变量和故障排除方法请参阅仓库 README。
开发者可下载 SDK,在视频处理管线中体验全新的编码、解码和转码功能,并分享使用反馈。重新设计的示例应用便于将新功能融入现有工作流,或从零构建自定义管线。
Q&A
Q1:NVIDIA Video Codec SDK 13.1 的零拷贝转码是怎么工作的?有什么优势?
A:零拷贝转码通过让 NVDEC 和 NVENC 直接共享同一块 GPU 内存(CUarray)来消除传统管线中的多次格式转换和数据复制。具体机制包括共享缓冲池分配、双重注册到编解码器、流水线线程执行以及流有序同步。其主要优势是降低 SM 利用率、减少显存占用,并在并发转码会话场景下提升整体吞吐量。
Q2:AV1 分层参考模式支持最多多少个 B 帧?对性能有影响吗?
A:SDK 13.1 中的 AV1 分层参考模式支持 1、3、7、15 和 31 个 B 帧,将 NVENC 最大 B 帧数从 7 帧提升至 31 帧。该模式在 7 个及以上 B 帧时效果最为显著,对性能影响极小,但会增加显存占用。H.264 和 HEVC 的分层参考模式将在后续驱动版本中支持。
Q3:SDK 13.1 的 Docker 开发环境包含哪些组件?怎么快速上手?
A:官方 Docker 环境固定使用 CUDA 12.3.2、Vulkan SDK 1.4.304.1 和 Ubuntu 22.04 LTS,内置预编译的 SDK 示例和 FFmpeg(LGPL)。上手方式非常简单:将 SDK 压缩包放入 Docker 构建目录,执行 docker build 指定 SDK_ZIP 参数,再用 docker run --gpus all 启动即可,无需在宿主机上单独安装 CUDA 工具包、Vulkan SDK 等依赖。
