C++使用ffmpeg解码v模块,支持cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码
仓库代码:https://gitee.com/liudegui/ffmpeg_decode_video
ffmpeg_decode_video
- 使用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
C++使用ffmpeg解码v模块,支持cpu解码、amd64平台的cuda解码和NX平台的Nvmpi解码相关推荐
- ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战
注意: VAAPI 是inter gpu 提供的硬编解码接口 VDPAU 是 video decode present api for unix nvdec / ncvid 都是nivida产出的硬解 ...
- FFmpeg深度学习模块的历史、现状和计划
本文来自英特尔资深图形图像软件工程师 郭叶军在LiveVideoStack线上分享的内容,详细介绍了FFmpeg中深度学习模块的历史.现状及未来计划,并针对深度学习模块总体架构与代码实践做详细解析. ...
- SOPHON BM1684芯片解码性能以及支持的文件格式
SOPHON BM1684芯片解码性能相关问题 1. BM1684芯片的编解码性能数据 2. BM1684解码性能对于H264/H265有差别吗?如果调整码率的话,最多可以解多少路呢?有没有对应的数据 ...
- 激光雷达模块支持提高高速公路速度
激光雷达模块支持提高高速公路速度 LiDAR module supports increased highway speed What's LIDAR? 自动驾驶技术的出现,无疑地扩大了激光成像探测和 ...
- ubuntu16.04中源码安装仅仅支持CPU的TensorFlow
直接用pip3安装的tensorflow在运行代码时,总是会提醒另一种更加高效率的编译模式,很烦人,再加上据说在CPU上计算速度会加倍,于是就尝试用tensorflow的源码进行安装,主要参考了T ...
- 【LiveVideoStack线上分享】FFmpeg深度学习模块架构与代码实践
FFmpeg可谓是音视频开发中的一把瑞士军刀,其中filter提供了很多音视频特效与图像处理的功能,除了传统的FFmpeg+OpenGL/OpenCV以外,深度学习模块提供了一种新的方式.本周四晚19 ...
- 用python操作浏览器的三种方式_python的webbrowser模块支持对浏览器进行一些操作...
python 的 webbrowser 模块支持对浏览器进行一些操作 主要有以下三个方法: webbrowser.open(url, new=0, autoraise=True) webbrowser ...
- 让模块支持“导入”“导出”功能
让模块支持"导入""导出"功能 DNN模块可以支持导入导出功能,通过将模块内容导入到XML文件可以便于模块内容备份和转移,也可将模块内容事先以XML格式保存通过 ...
- q87主板支持cpu型号_INTEL的10代和9代的区别,型号和价格都有哪些,入手哪个性价比高...
英特尔10代Comet Lake-S的CPU和主板解禁已经有两天啦,猫猫今天整理出来了它们的具体参数.价格来供头条的小可爱们参考的喽. 10代平台的硬件喜欢尝鲜的小伙伴儿们可以入手啦.不过考虑到性价比 ...
最新文章
- SSH连接问题:1.Software caused connection abort2.client_loop: send disconnect: Connection reset
- 英语发音表及读法_如何一个人练习英语口语?
- 1114:白细胞计数
- android4.3 Bluetooth(le)分析之startLeScan分析
- html二级页面内容滑动,jQuery+CSS实现的网页二级下滑菜单效果
- 第4章 第三节 内核同步
- C++11多线程实现银行存取款案例
- 打开Android Studio报错“Error running ***: Please select Android SDK”
- python 压缩文件(3)
- 从github下载的项目如何运行??---------本文以vue的项目为例
- KAKASI - 将日文转换为平假名/片假名/罗马音
- 3.关于python函数,以及作用域,递归等知识点
- 笔记本电脑无法进入睡眠状态_小方法解决电脑无法进入睡眠模式问题
- 树莓派用USB蓝牙适配器连接蓝牙设备
- 解决“无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有权限访问”的问题
- 水性建筑涂料行业调研报告 - 市场现状分析与发展前景预测
- 【7gyy】支招:自检性能搞定网速慢电脑卡的问题
- 520送什么给男朋友最好?送男朋友礼物排行榜
- 利用javascript实现表格数据自动从剪贴板录入
- 主成分回归预测matlab,科学网—Matlab: princomp() 主成分分析 - 杨建功的博文
热门文章
- layui table点击tr更改当前行颜色
- 我的世界java边境之地_我的世界边境之地怎么去?minecraft边境之地
- 计网复习——传输层习题
- 习题6 3.6.2 典型题例解析 3.6.3 自测训练
- 如何使用 K8s 实现跨集群管理,这篇文章告诉你了!赶紧收藏
- 【解决方案】如何搭建运动场体育赛事直播方案:EasyCVR综合智能化体育赛事直播
- 标准盒模型 和怪异盒模型
- 计算机组成原理db和dw,汇编中的DW是什么意思那DB 它们什么作用
- 【Datawhale组队学习Pytorch】Task 完结篇
- 私募量化策略超额收益来源分析