乐趣区

关于图像识别:SkeyeARS-全景AR增强监视系统之cudacuvid视频硬解码

1、写在后面!

后面咱们曾经理解对于视频硬解码的一些技术。

其中提到的 nvcuvid 则是 Nvidia GPU 硬解码的外围,并且是由官网提供反对,因而能够放心使用。


2、注释开始

NVDECODE API 反对的编解码器有:

MPEG-1
MPEG-2
MPEG4
VC-1
H.264 (AVCHD) (8 位)
H.265 (HEVC)(8 位、10 位和 12 位)
VP8
VP9(8 位、10 位和 12 位)
AV1 Main profile
Hybrid (CUDA + CPU) JPEG

解码器管道由三个次要组件组成:解复用器、视频解析器和视频解码器, 这些组件不相互依赖,因而能够独立应用。

NVDECODE API 为 NVIDIA 视频解析器和 NVIDIA 视频解码器提供 API。

其中,NVIDIA 视频解析器纯正是一个软件组件,如果须要,用户能够插入任何解析器来代替 NVIDIA 视频解析器(例如 FFmpeg 解析器)。

NVDECODE 视频解码器管道如下图所示:

在高层次上,应遵循以下步骤来解码任何视频内容,应用 NVDECODEAPI

  • 1、创立一个 CUDA 上下文。
  • 2、查问硬件解码器的解码能力。
    应用 cuvidGetDecoderCaps()
  • 3、创立解码器实例。
    应用 cuvidCreateDecoder() 创立 CUvideodecoder 实例 
  • 4、解复用内容(如 .mp4),这能够应用 FFMPEG 等第三方软件来实现。
  • 5、应用 NVDECODE API 提供的解析器或第三方解析器解析视频码流,比方 FFmpeg。
    从解复用器中提取的数据包应用 cuvidParseVideoData() 输出解析器。解析器在从外部同步创立解析器对象时触发注册的回调 cuvidParseVideoData(),只有有序列变动或图片筹备好被解码和 / 或显示。如果回调返回失败,它将被流传 cuvidParseVideoData() 到应用程序。解码后果与 CUVIDPICPARAMS 构造中的图片索引值相关联,这也是由解析器提供的。这个图片索引稍后用于映射解码的帧到 CUDA 内存 
  • 6、应用 VDECODE API 开始解码。
    调用 cuvidDecodePicture() 并将解码器句柄和指针传递给 CUVIDPICPARAMS 在 NVDEC 上开始解码。
  • 7、获取解码后的 YUV 进行进一步解决。
    用户须要调用 cuvidMapVideoFrame() 来获取 CUDA 设施指针和保留解码和后处理帧的输入外表。请留神 cuvidDecodePicture() 批示 NVDEC 硬件引擎启动帧 / 字段的解码。然而 cuvidMapVideoFrame() 胜利实现示意解码过程实现,解码后的 YUV 帧从 NVDEC 生成的格局转换为 CUVIDDECODECREATEINFO::OutputFormat 中指定的 YUV 格局。cuvidMapVideoFrame() API 将解码外表索引 (nPicIdx) 作为输出并将其映射到可用的输入外表之一,对解码帧进行后处理并复制到输入外表和返回 CUDA 设施指针和输入外表的相干间距。
  • 8、查问解码帧的状态。
    解码开始后,可随时调用 cuvidGetDecodeStatus() 进行查问该帧的解码状态。
  • 9、依据解码状态,应用解码后的输入进行进一步解决,例如渲染、推理、后处理等
  • 10、如果应用程序须要显示输入

    • 将解码的 YUV 外表转换为 RGBA。
    • 将 RGBA 外表映射到 DirectX 或 OpenGL 纹理。
    • 在屏幕上绘制纹理。
  • 11、解码过程实现后销毁解码器实例。
    用户须要调用 cuvidDestroyDecoder() 来销毁解码器会话并开释所有调配的解码器资源。
  • 12、销毁 CUDA 上下文。

3、结语

最初,咱们的 SkeyeARS 实际上反对可配置视频 软解码 / 硬解码 的。

SkeyeARS 运行目录下 config/config.ini 中。

其中:EasyPlayerProDecodeType 为直播解码选项,EasyPlayerDecodeType 则为录播解码选项。

配置为 0 抉择软解码,配置为 1 抉择硬解码。

退出移动版