当前位置: 首页 > news >正文

英伟达硬件加速编解码

硬件加速

硬件加速的学术名称是 GPGPU(General-purpose computing on graphicsprocessing units),中文名称是通用图形处理器。最基本的思想是使用 GPU 的运算能力完成原本需要 CPU 来进行的运算。

并行计算

GPU 是用来处理图形任务的图形处理器,其中一个非常大的优势在于它的并行处理能力。面对单指令流多数据流(SIMD),并且数据处理的运算量远大于数据调度和传输的需要时,GPU 的并行处理效率要高于传统的 CPU 的处理。

为了充分的利用 GPU 的并行处理能力,大部分的显卡厂商都推出了自己的 GPU 开发SDK,比如:

  • NVIDIA —— CUDA
  • Intel —— Intel® Media SDK
  • AMD —— AMD APP SDK(前身是 ATI Stream)

当然这些厂商都是各自为阵,推出的 SDK 都是只能用于自己的显卡的 SDK,所以代码想要在不同的平台上能够统一是比较困难的。

OpenCL

OpenCL(Open Computing Language,开放计算语言),是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。这种语言主要是为了异构平台的并行运行设计的。

从本质上来说,它和 CDUA 等等 SDK 上是不同的,它是一种语言,相当于是 Java语言这个级别,而后者是一个开发包,相当于 JDK 这个级别。

OpenCL 目前的语言规范已经到了 2.1(Preview),支持最好的 AMD 的 SDK,最新版本已经支持了 OpenCL 2.0,其他两个只支持 OpenCL 1.2。

OpenCL 提供了一个统一的 API,这个 API 在上述的厂商的 SDK 中都有实现。所以安装 CUDA 会包含 OpenCL 组件,它是英伟达对于 OpenCL 语言的一种实现。

OpenCL API VS SDK

OpenCL API 最大的优势在于它的跨平台,可以在不同的架构上运行,所以理论上它比 SDK 更有竞争力。但是它最大的问题在于它的 API Level 比较基础,直接使用它进行视频的编解码处理难度比较大。

此外 OpenCL API 的实现是依赖于底层的 GPU 架构的,不同的厂商提供了不同的实现,使用之前需要安装不同厂商提供的实现,从这个角度考虑 OpenCL 的跨平台并没有想象中那么完美。

SDK 的问题在于不同的厂商的 SDK 是不兼容的。但是它提供了比 OpenCL API 更加丰富的功能,比如 NVIDIA 直接提供了视频编解码相关的接口,使用起来会比OpenCL API 更加的轻松。

英伟达硬件编解码方案

实现英伟达的 GPU 硬件编解码可以使用如下几种方案:

基于 OpenCL 的 API 自己写一个编解码器

这的难度非常大,首先你需要对于 OpenCL API 非常的熟悉,其次你需要对于编解码的知识了解的非常透彻。这两个问题的任何一个都有非常大的难度,以目前已有的技术来说成功的概念不是特别大。

MainConcept 公司做了这件事情,它提供了基于 OpenCL 的 H264/AVC 编码器,但是这个编码器是商用的(此外它还提供了基于 CUDA 的编码器和基于 Intel QSV 的编解器,以及包装过前面几者的编码器)。

所以从技术可行性上来说这个是可行的,只是目前来说个人还不具备这个实力。

使用 SDK 中的编解码接口

英伟达关于视频的编解码提供了两个相关的 SDK

  • NVENC
  • NVCUVID

前者负责硬件编码,二后者负责硬件解码。

NVENC 是一个单独的 SDK,集成在最新的显卡驱动上面,安装最新的驱动之后可以找到相关的库文件。在 Ubuntu 14.04 中,可以在 /usr/lib/nvidia-352/ 目录下面找到相关的库文件。

NVCUVID 是 CUDA 的组件,包含在最新的 CUDA Toolkit 中。不过在显卡的类库中可以找到 libnvcuvid.so 这个库文件。在之前版本的显卡驱动中其他还包含一个称之为 NVCUVENC 的硬件编码器和 NVCUVID 相对应,不过目前这个组件已经被 NVENC 替代了。

使用编码器对于 OpenCL 和 SDK 的封装

这种方式是个人认为最理想的方式,FFMPEG 目前存在一个编码器 nvenc 是对于英伟达的 NVENC 的封装,通过使用它可以和 FFMPEG 无缝的整合起来。此外它也包含对于 Intel QSV 的封装。AMD 的相关接口目前没有找到相关的资料。

不过 FFMPEG 只存在 NVENC 的接口,不存在 NVCUVID 的封装。如果需要实现相关的解码器可能需要自己实现 FFMPEG 接口。

libx264 有对于 OpenCL 的封装,不过我在 windows 中尝试这个功能的时候并没有成功。

另外还存在一个开源的格式转换器 HandBrake,它包含对于 Intel QuickSync的封装,以及使用 OpenCL 进行图象的拉伸处理和使用 x264 的 opencl封装。这个项目缺点在于文档不是很丰富,研究起来有一定的难度。

转载于:https://www.cnblogs.com/lifan3a/articles/7463364.html

相关文章:

  • python字典属于无序序列_五:Python序列之字典
  • Excel作为数据源TesTNG做数据驱动完整代码
  • ps工具预设_「设计干货」不要浪费时间调整设计效果图了,20款灯光预设送你用...
  • 游戏设计的236个技巧pdf
  • python index函数应用_Python pandas.DataFrame.set_index函数方法的使用
  • Nginx的配置安装和使用
  • pythonpygame游戏代码_使用Python第三方库pygame写个贪吃蛇小游戏
  • onchange事件实现编辑_Openlayer——绘制可编辑几何要素
  • Vue.js 基础学习 v-on 指令
  • python中多线程和多进程的区别_python 多线程和多进程的区别 mutiprocessing theading...
  • super关键字
  • c盘清理工具_学会这几招,让你的电脑从此告别C盘空间不足
  • Python 之 threading
  • c++自底向上算符优先分析_C语言运算符及其优先级汇总表口诀
  • dump分析工具_百因必有果,JVM调优(工具篇)建议收藏
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 「面试题」如何实现一个圣杯布局?
  • egg(89)--egg之redis的发布和订阅
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • golang中接口赋值与方法集
  • Java 网络编程(2):UDP 的使用
  • php的插入排序,通过双层for循环
  • Quartz初级教程
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring核心 Bean的高级装配
  • Swoft 源码剖析 - 代码自动更新机制
  • 不上全站https的网站你们就等着被恶心死吧
  • 复杂数据处理
  • 后端_MYSQL
  • 看域名解析域名安全对SEO的影响
  • 前端之Sass/Scss实战笔记
  • 深度学习入门:10门免费线上课程推荐
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #HarmonyOS:基础语法
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (4)logging(日志模块)
  • (Python第六天)文件处理
  • (万字长文)Spring的核心知识尽揽其中
  • (一)插入排序
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net - 类的介绍
  • .NET CLR Hosting 简介
  • .net 获取url的方法
  • .net 流——流的类型体系简单介绍
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net中的集合
  • @Controller和@RestController的区别?
  • [ NOI 2001 ] 食物链
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限