一、Jetson介绍
Jetson 是由 NVIDIA 开发的嵌入式计算平台系列,旨在提供高性能的人工智能(AI)计算能力,适用于嵌入式系统、机器人、自动驾驶汽车和其他边缘计算应用。Jetson 平台通常集成了 NVIDIA 的 GPU 和其他硬件加速器,能够在低功耗的环境下执行复杂的深度学习和计算任务。
Jetson Multimedia API(Jetson 多媒体 API)是 NVIDIA 提供的一组软件工具和接口,用于在 Jetson 平台上进行视频和图像处理。这个 API 包括了对视频解码、编码、图像处理和视觉算法的支持。通过 Jetson Multimedia API,开发人员可以轻松地实现视频流的采集、处理和显示,以及应用于计算机视觉的功能,比如对象检测、目标跟踪和人脸识别等。
Jetson Multimedia API 提供了丰富的功能,使开发者能够利用 Jetson 平台的硬件加速器(如 GPU 和硬件编解码器)来实现高效的视频处理和计算机视觉任务。这包括基于硬件加速的视频解码(如 H.264、H.265 等格式)、编码、图像处理和视觉算法。Jetson Multimedia API 通常与 JetPack SDK 一起发布,提供了一系列的示例代码和开发工具,帮助开发者快速上手和开发应用。
二、Jetson视频解码
本文主要对Jetson的视频解码流程进行详细的介绍,文中代码对应的Jetpack版本5.0.2中的测试代码,代码路径:/usr/src/jetson_multimedia_api/samples/02_video_dec_cuda/。了解了02_video_dec_cuda的解码流程,samples中的其他解码demo就都理解了,过程都是类似的。
Jetson实际上是使用v4l2框架进行的视频编解码、Jetson Multimedia API就是对v4l2编解码的封装,所以学习Jetson Multimedia API之前要先了解v4l2的编解码流程,v4l2的解码流程可以参考我的另外一篇文章:v4l2视频解码 。
Jetson解码流程(02_video_dec_cuda)如下图所示:
下面对解码过程进行详细的说明:
1、打开解码器
ctx.dec = NvVideoDecoder::createVideoDecoder("dec0");
打开解码器实际就是用open()函数打开解码设备,类似于open()打开/dev/video0。
2、订阅分辨率变化事件
ret = ctx.dec->subscribeEvent(V4L2_EVENT_RESOLUTION_CHANGE, 0, 0);
这一步的目的是让dec_capture_loop_fcn线程监听到分辨率变化事件之后设置和分配输出缓冲区队列,之后从输出队列中获取解码后的视频,以及解码过程中分辨率发生变化之后重新配置输出队列。
3、设置输入队列格式
ret = ctx.dec->setOutputPlaneFormat(ctx.decoder_pixfmt, CHUNK_SIZE);
设