C++使用ffmpeg解码v模块,支持cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码
C++ 使用ffmpeg解码video模块,支持3种解码:cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码
·
仓库代码
概述
该仓库提供了一个基于FFmpeg的视频解码模块,支持在不同硬件平台上的多种解码方式:CPU解码、CUDA解码(适用于AMD64平台),以及Nvmpi解码(适用于NX平台)。此外,该库仅依赖于FFmpeg,并在测试程序中使用了OpenCV,可用于将解码后的帧送入OpenCV检测程序。
设计思想
该库的设计目标是在同一份代码中支持CUDA GPU和CPU模式的切换,并且可以选择是否只解码关键帧。
判断是否支持CUDA GPU解码
bool support_hwdevice()
{
AVHWDeviceType type;
type = av_hwdevice_find_type_by_name(s_hwdevice_name);
if (type == AV_HWDEVICE_TYPE_NONE)
{
fprintf(stderr, "Device type %s is not supported.\n", s_hwdevice_name);
fprintf(stderr, "Available device types:");
while ((type = av_hwdevice_iterate_types(type)) != AV_HWDEVICE_TYPE_NONE)
fprintf(stderr, " %s", av_hwdevice_get_type_name(type));
fprintf(stderr, "\n");
return false;
}
return true;
}
此方法用于检测设备是否支持CUDA GPU硬解加速,若不支持会输出错误信息并返回false
。
初始化
初始化函数init_ctx
负责对输入的input_ctx
和用于解码的decoder_ctx
进行初始化。
GPU解码初始化
说明:
- 深色框表示与软解码不同的硬件解码部分。
av_hwdevice_find_type_by_name()
用于根据名称查找对应的AVHWDeviceType
。avcodec_get_hw_config()
用于获取编解码器支持的硬件配置AVCodecHWConfig
。av_hwdevice_ctx_create()
用于创建硬件设备相关的上下文信息AVHWDeviceContext
并进行初始化。decoder_ctx->get_format = get_hw_format
,get_hw_format
是向AVCodecContext
注册的函数,用于协商支持的像素格式。
CPU解码初始化
CPU解码与GPU初始化不同之处在于,调用avcodec_find_decoder
寻找适合的解码器,并为解码器上下文设置类型、高度和宽度。
解码过程
- GPU解码与CPU解码的主要区别在于,GPU解码需要调用
av_hwframe_transfer_data()
来将数据从GPU复制到CPU。 av_hwframe_transfer_data()
用于在GPU和CPU之间传输数据,确保解码后的帧数据能够被后续处理程序使用。
数据格式
解码后的数据格式取决于使用的解码方式:
- GPU解码后的数据格式通常是从硬件读取,如CUDA的
AV_PIX_FMT_NV12
。 - CPU解码后的数据一般为YUV格式,例如
AV_PIX_FMT_YUV420P
。
参考
这样重新组织和详细解释后,希望能更清晰地传达您的代码库的功能和设计思路。
欢迎来到由智源人工智能研究院发起的Triton中文社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。
更多推荐
已为社区贡献1条内容
所有评论(0)