C++使用ffmpeg解码v模块,支持cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码

仓库代码

ffmpeg_decode_video

概述

该仓库提供了一个基于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解码初始化

GPU解码初始化

说明:

  • 深色框表示与软解码不同的硬件解码部分。
  • av_hwdevice_find_type_by_name()用于根据名称查找对应的AVHWDeviceType
  • avcodec_get_hw_config()用于获取编解码器支持的硬件配置AVCodecHWConfig
  • av_hwdevice_ctx_create()用于创建硬件设备相关的上下文信息AVHWDeviceContext并进行初始化。
  • decoder_ctx->get_format = get_hw_formatget_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

参考


这样重新组织和详细解释后,希望能更清晰地传达您的代码库的功能和设计思路。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值