C++使用ffmpeg硬解码

news2025/8/11 11:03:46

转载:https://www.pudn.com/news/62bc096d405aad31f717648e.html

  • 使用ffmpeg解码video模块,支持3种解码:cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码
  • 封装库只依赖ffmpeg,测试程序中用到了OpenCV,可用于将帧送往opencv检测程序

ref:

  • https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c
  • ref: https://github.com/chinahbcq/ffmpeg_hw_decode

概要

该库希望支持能在一份代码中支持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;
}

该方法对有显卡,但不支持硬解加速的机器不适用,比如部分笔记本。

此时该函数也会返回true,但是解码时候会报 Hardware is lacking required capabilities这样的错误。

初始化

init_ctx初始化函数主要是对输入的input_ctx和用于解码的decoder_ctx初始化。

GPU解码初始化

在这里插入图片描述

说明:

  • 深色框为硬件解码与软解解码不一样的地方。

  • av_hwdevice_find_type_by_name()的功能是根据名称查找对应的AVHWDeviceType。

  • AVHWDeviceType表示硬件加速API的类型,比如AV_HWDEVICE_TYPE_CUDA是nvidia提供的加速API.

  • av_hwdevice_find_type_by_name支持的名称如下所示。

static const char *const hw_type_names[] = {
    [AV_HWDEVICE_TYPE_CUDA]   = "cuda",
    [AV_HWDEVICE_TYPE_DRM]    = "drm",
    [AV_HWDEVICE_TYPE_DXVA2]  = "dxva2",
    [AV_HWDEVICE_TYPE_D3D11VA] = "d3d11va",
    [AV_HWDEVICE_TYPE_OPENCL] = "opencl",
    [AV_HWDEVICE_TYPE_QSV]    = "qsv",
    [AV_HWDEVICE_TYPE_VAAPI]  = "vaapi",
    [AV_HWDEVICE_TYPE_VDPAU]  = "vdpau",
    [AV_HWDEVICE_TYPE_VIDEOTOOLBOX] = "videotoolbox",
    [AV_HWDEVICE_TYPE_MEDIACODEC] = "mediacodec",
};
  • avcodec_get_hw_config:用于获取编解码器支持的硬件配置AVCodecHWConfig。这里用于获取硬件支持的像素格式。
  • av_hwdevice_ctx_create:av_hwdevice_ctx_create创建硬件设备相关的上下文信息AVHWDeviceContext和对硬件设备进行初始化。
  • decoder_ctx->get_format = get_hw_format ,get_hw_format是向AVCodecContext注册的一个函数,用于协商支持的像素格式。

CPU解码初始化

  • cpu解码初始化与GPU不一样的是,调用avcodec_find_decoder寻找合适的decoder,并给decoder context设置类型、高和宽。

解码

在这里插入图片描述

  • GPU解码与CPU解码的一个区别是,GPU需要调用av_hwframe_transfer_data,该函数拷贝GPU到CPU。
  • av_hwframe_transfer_data:拷贝数据到一个硬件的surface,或者从一个硬件surface拷贝数据,也就是GPU和CPU之间数据拷贝。这里用于GPU拷贝到CPU。

格式

  • GPU解码后数据格式默认类型是从硬件读取,CUDA可能是AV_PIX_FMT_NV12;而CPU解码后的数据一般是YUV数据,比如AV_PIX_FMT_YUV420P。

参考

// ref:https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c
// ref: https://github.com/chinahbcq/ffmpeg_hw_decode
// ref: https://www.jianshu.com/p/3ea9ef713211

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 Uber 数据泄露事件我们可以学到什么?

Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证。最初尝试使用这些凭据连接到 Uber 的网络失败,因为该帐户受 MFA 保护。为了克服这一安全障碍,黑客通过 What’s App 联系了 Uber 员工,并假装是 Uber 的安全人员&…

基于JAVA的新闻文章发布管理系统,可以用来参考学习【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86427648 主要使用技术 SpringSpringMVCMybatisBootstrapJqueryMysql 功能介绍 该系统分为前后台管理: 后台管理主要四个模块: 新闻管理:新闻发布实现类…

嵌入式工程师更新装备,最新的国产全志A40i、Xilinx ZYNQ开发板分享来了

各位工程师的硬件装备库还没更新? 以下国产比例100%+工业级 国产全志A40i、Xilinx ZYNQ开发板均有! 限定50套 更多产品资料,案例详细说明, 点击链接或微信扫下方二维码下载!https://site.tronlong.com/p…

功能点估算方法,如何让估算偏差更小?

1、何为软件功能点 ​ ​软件功能点是站在业务角度对软件规模的一种度量,功能点的多少代表软件规模的大小,这里说的功能点是标准的功能点,按照标准的估算方法,每个人对特定需求估算出的功能点数是一致的。 功能点估算方法&…

基于Java+Swing+Mysql企业人事管理系统

基于JavaSwingMysql企业人事管理系统一、系统介绍二、功能展示1.登录、注册2.主页面3.添加员工信息4.修改员工信息5、考勤管理6、工资管理三、数据库设计四、其他系统实现一、系统介绍 企业员工信息管理系统主要用于实现公司的员工相关信息管理,基本功能包括&#…

最新最全面的Spring详解(六)——Spring-Mybatis整合

前言 本文为Spring-Mybatis整合相关内容介绍,MyBatis-Spring 可以帮助我们将 MyBatis 代码无缝地整合到 Spring 中。 使用这个类库中的类, Spring 将会加载必要的 MyBatis 工厂类和 session 类。 这个类库也提供一个简单的方式来注入 MyBatis 数据映射器和 SqlSessi…

用Python构建区块链

区块链 区块链是在计算机网络的节点之间共享数据的分类账(分布式数据库)。作为数据库,区块链以电子格式储存信息。区块链的创新之处在于它保证了数据记录的安全性和真实性,可信性(不需要没有可信任的第三方)。 区块链和典型数据…

无线数据采集器

背景介绍 近年来,软硬件技术的革新带动了物联网行业的发展,趋使其应用场景不断深化,从工业设备故障诊断到共享经济,再到新能源汽车。调研发现,物联网的核心框架为:通过传感器感知物理世界的状态&#xff0c…

尚医通-手机验证码登录与gateway拦截实现

需求分析 1,登录采取弹出层的形式 2,登录方式: (1)手机号码手机验证码 (2)微信扫描 3,无注册界面,第一次登录根据手机号判断系统是否存在,如果不存在则自…

怎么裁剪视频时长?手把手教你裁剪

现在的网络非常方便,我们可以很轻松的在网上找到各种视频进行网课的学习。不过有些网课重点的内容可能不多而且又分散,我们很难做到高效的学习。其实我们可以通过视频裁剪,将需要的视频内容裁剪下来,这样子就方便我们学习啦。那你…

自动驾驶感知算法实战专栏总结:如何打造“高可靠、多冗余、可量化、数据驱动的感知系统”

自动驾驶感知算法实战专栏:https://blog.csdn.net/charmve/category_12097938.html目录 「超融合」感知方案高可靠:对障碍物、红绿灯的识别精度有保证多冗余:各个模块相互支撑、非串行可量化:PRT、仿真场景测试、Profiling数据驱动(全流程闭环)「超融合」感知方案 专注在…

vmware 桥接模式设置桥接到无线网卡

vmware共有三种网络,仅主机Host、NAT和桥接模式。 仅主机Host用于和主机通信的网络。NAT用于网络地址转发上网。桥接模式用于搭建与主机之外的网络的网桥。 在添加桥接模式的网卡后,如果使用有线连接,这个时候,桥接网卡会桥接到的…

消能减震神器之“黏滞阻尼器”的力学原理与应用

作者 | 建源之光,仿真秀专栏作者 一、写在文前 消能阻尼器的基本力学原理主要体现在恢复力模型上,恢复力模型的建立对整体结构模型的动力分析起了便捷作用,便于指导工程实际应用。对于消能阻尼器通常选择以下本构进行模拟: 软钢…

如何利用Airtest做一些简单的装包小任务

1. 前言 很多同学对于Airtest都有一些刻板的印象,觉得Airtest只能截图,然后进行一些简单的点点点操作。 但实际上,抛开Airtest的图像识别点击功能,Airtest还能帮助我们连接设备,然后完成一些别的小任务,比…

CAD .NET 14.1.X DWG/ DXF, PLT 自由转换- CNC

CAD .NET CAD .NET是一个用于在 .NET 环境中开发解决方案的库。它支持 AutoCAD DWG/ DXF、PLT和其他 CAD 格式。 该库可用于广泛的领域: 在所有项目阶段使用工业图纸监控和远程控制程序数控加工数据导出为 CAD 格式使用数据库文件管理系统使用图纸的高度专业化产品…

构建镜像开源工具 buildah

构建镜像开源工具 buildah 文章目录构建镜像开源工具 buildah1. 简介2. 特点3. Buildah 和 Podman4. 安装4.1 CentOS4.2 Ubuntu4.3 RHEL74.4 Fedora5. 命令6. 示例6.1 命令行构建一个 httpd 镜像6.2 Dockerfile 构建6.3 构建镜像脚本(代替 Dockerfile)1.…

基于JAVA的新闻发布管理系统开发参考【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86427655 目的 本系统的目的是实现新闻发布系统的基本功能。新闻发布系统提供了不同类型新闻(如社会新闻、娱乐新闻和技术前沿新闻等) 满足不同用户需求;系…

基于Amos优化器思想推导出来的一些“炼丹策略”

©PaperWeekly 原创 作者 | 苏剑林单位 | 追一科技研究方向 | NLP、神经网络如果将训练模型比喻为“炼丹”,那么“炼丹炉”显然就是优化器了。据传 AdamW 优化器是当前训练神经网络最快的方案,这一点笔者也没有一一对比过,具体情况如何不…

RationalDMIS2022校验测头

一.为什么要校验测头 校验测头的目的有2个 第一是得到测针的实际直径,后续用于探头半径补偿; 第二是得到各角度下测针的偏置,这样不同角度的探针测量出来的数据可以统一到一起; 测头校验包括2部分:定位标准球和测头…

C#程序采用AOT发布,真的可以避免被反编译?

上次跟大家分享过,C#程序反编译与篡改代码的教程《C#程序发布时,一定要好好的保护,不然你会后悔的!》,根据这个教程,我们都知道C#程序,发布后必须进行加密混淆,不然就是相当于源码直…