NVIDIA 提供两套独立的硬件解码体系:用于自动驾驶/嵌入式的 NvMedia(Orin 平台), 和用于工作站/数据中心的 NVDEC(x86 平台)。理解它们的架构差异, 是选择正确解码方案的第一步。
| 特性 | Orin / DriveOS | x86 + dGPU |
|---|---|---|
| 硬件单元 | NVDEC 嵌入式变体 | NVDEC (独立 ASIC) |
| API | NvMedia IDE + NvSciBuf | Video Codec SDK (CUVID) |
| 操作系统 | QNX / DriveOS Linux | Windows / Linux |
| 内存模型 | 统一内存 (NvSciBuf) | CUDA 显存 + 零拷贝 |
| 同步机制 | NvSciSync Fence | CUDA Stream / Event |
| 设计目标 | 确定性低延迟 | 高吞吐量 / 通用性 |
无论 Orin 还是 x86 RTX GPU,底层都是 NVDEC —— 一个专门用于视频解码的独立 ASIC。 它不占用 CUDA 核心,解码时 GPU 可以并行执行计算任务。
| GPU 架构 | 代表型号 | NVDEC 版本 | 新增格式支持 |
|---|---|---|---|
| Pascal | GTX 1080 | v1 | H.264, HEVC 8-bit |
| Turing | RTX 2080 | v2/3 | HEVC 10-bit, VP9 |
| Ampere | RTX 3080 | v4 | AV1 (部分型号) |
| Ada Lovelace | RTX 4090 | v5 | AV1 全支持, HEVC 12-bit |
| Orin | Jetson AGX | 嵌入式 | H.264, HEVC, AV1 |
// 1. 创建解码器
NvMediaIDE* decoder = NvMediaIDECreate(codec, w, h, ...);
// 2. 分配统一内存缓冲区 (NvSciBuf)
NvSciBufObj buf;
AllocNv12Surface(&buf); // 使用 NvSciBuf
// 3. 注册缓冲区到解码器
NvMediaIDERegisterNvSciBufObj(decoder, buf);
// 4. 解码并同步
NvMediaIDEDecoderRender(decoder, buf, picInfo);
NvMediaIDEGetEOFNvSciSyncFence(decoder, syncObj, &fence);
NvSciSyncFenceWait(&fence, ctx, timeout); // 等待完成
// 1. 创建解码器
CUvideodecoder decoder;
cuvidCreateVideoDecoder(&decoder, ¶ms);
// 2. 解码(输出到 CUDA 显存)
cuvidDecodePicture(decoder, &picParams);
// 3. 获取 GPU 指针(零拷贝)
CUdeviceptr dptr;
cuvidMapVideoFrame(decoder, idx, &dptr, &pitch, ¶ms);
// 4. 直接在此指针上 CUDA 处理
myKernel<<<grid, block, 0, stream>>>(dptr);
// 5. 或同步
cudaStreamSynchronize(stream);
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| Orin / DriveOS | NvMedia | 唯一选择,系统级集成 |
| x86 快速验证 | FFmpeg + NVDEC | 一行命令,无需编码 |
| x86 产品级应用 | Video Codec SDK | 精确控制延迟和内存 |
| 解码 + AI 推理 | Video Codec SDK | 零拷贝到 TensorRT |
| 多路监控 / 转码 | FFmpeg | 内置多路调度和格式支持 |
零拷贝(Zero Copy) 是指解码后的数据无需经过 CPU 内存, 直接留在 GPU 显存中供后续处理。这是硬件解码的核心优势。
// 零拷贝流水线
CPU 文件 → NVDEC → GPU 显存 → CUDA 处理 / TensorRT / NVENC
↑______________________________|
全程在 GPU,无 CPU 介入
本课建立了整体认知框架。更多课程正在开发中,敬请期待: