仓库代码: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解码相关推荐

  1. ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战

    注意: VAAPI 是inter gpu 提供的硬编解码接口 VDPAU 是 video decode present api for unix nvdec / ncvid 都是nivida产出的硬解 ...

  2. FFmpeg深度学习模块的历史、现状和计划

    本文来自英特尔资深图形图像软件工程师 郭叶军在LiveVideoStack线上分享的内容,详细介绍了FFmpeg中深度学习模块的历史.现状及未来计划,并针对深度学习模块总体架构与代码实践做详细解析. ...

  3. SOPHON BM1684芯片解码性能以及支持的文件格式

    SOPHON BM1684芯片解码性能相关问题 1. BM1684芯片的编解码性能数据 2. BM1684解码性能对于H264/H265有差别吗?如果调整码率的话,最多可以解多少路呢?有没有对应的数据 ...

  4. 激光雷达模块支持提高高速公路速度

    激光雷达模块支持提高高速公路速度 LiDAR module supports increased highway speed What's LIDAR? 自动驾驶技术的出现,无疑地扩大了激光成像探测和 ...

  5. ubuntu16.04中源码安装仅仅支持CPU的TensorFlow

      直接用pip3安装的tensorflow在运行代码时,总是会提醒另一种更加高效率的编译模式,很烦人,再加上据说在CPU上计算速度会加倍,于是就尝试用tensorflow的源码进行安装,主要参考了T ...

  6. 【LiveVideoStack线上分享】FFmpeg深度学习模块架构与代码实践

    FFmpeg可谓是音视频开发中的一把瑞士军刀,其中filter提供了很多音视频特效与图像处理的功能,除了传统的FFmpeg+OpenGL/OpenCV以外,深度学习模块提供了一种新的方式.本周四晚19 ...

  7. 用python操作浏览器的三种方式_python的webbrowser模块支持对浏览器进行一些操作...

    python 的 webbrowser 模块支持对浏览器进行一些操作 主要有以下三个方法: webbrowser.open(url, new=0, autoraise=True) webbrowser ...

  8. 让模块支持“导入”“导出”功能

    让模块支持"导入""导出"功能 DNN模块可以支持导入导出功能,通过将模块内容导入到XML文件可以便于模块内容备份和转移,也可将模块内容事先以XML格式保存通过 ...

  9. q87主板支持cpu型号_INTEL的10代和9代的区别,型号和价格都有哪些,入手哪个性价比高...

    英特尔10代Comet Lake-S的CPU和主板解禁已经有两天啦,猫猫今天整理出来了它们的具体参数.价格来供头条的小可爱们参考的喽. 10代平台的硬件喜欢尝鲜的小伙伴儿们可以入手啦.不过考虑到性价比 ...

最新文章

  1. SSH连接问题:1.Software caused connection abort2.client_loop: send disconnect: Connection reset
  2. 英语发音表及读法_如何一个人练习英语口语?
  3. 1114:白细胞计数
  4. android4.3 Bluetooth(le)分析之startLeScan分析
  5. html二级页面内容滑动,jQuery+CSS实现的网页二级下滑菜单效果
  6. 第4章 第三节 内核同步
  7. C++11多线程实现银行存取款案例
  8. 打开Android Studio报错“Error running ***: Please select Android SDK”
  9. python 压缩文件(3)
  10. 从github下载的项目如何运行??---------本文以vue的项目为例
  11. KAKASI - 将日文转换为平假名/片假名/罗马音
  12. 3.关于python函数,以及作用域,递归等知识点
  13. 笔记本电脑无法进入睡眠状态_小方法解决电脑无法进入睡眠模式问题
  14. 树莓派用USB蓝牙适配器连接蓝牙设备
  15. 解决“无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有权限访问”的问题
  16. 水性建筑涂料行业调研报告 - 市场现状分析与发展前景预测
  17. 【7gyy】支招:自检性能搞定网速慢电脑卡的问题
  18. 520送什么给男朋友最好?送男朋友礼物排行榜
  19. 利用javascript实现表格数据自动从剪贴板录入
  20. 主成分回归预测matlab,科学网—Matlab: princomp() 主成分分析 - 杨建功的博文

热门文章

  1. layui table点击tr更改当前行颜色
  2. 我的世界java边境之地_我的世界边境之地怎么去?minecraft边境之地
  3. 计网复习——传输层习题
  4. 习题6 3.6.2 典型题例解析 3.6.3 自测训练
  5. 如何使用 K8s 实现跨集群管理,这篇文章告诉你了!赶紧收藏
  6. 【解决方案】如何搭建运动场体育赛事直播方案:EasyCVR综合智能化体育赛事直播
  7. 标准盒模型 和怪异盒模型
  8. 计算机组成原理db和dw,汇编中的DW是什么意思那DB 它们什么作用
  9. 【Datawhale组队学习Pytorch】Task 完结篇
  10. 私募量化策略超额收益来源分析