• 最基本的思想是使用 GPU 的运算能力完成原本需要 CPU 来进行的运算。 并行计算 GPU 是用来处理图形任务的图形处理器,其中一个非常大的优势在于它的并行处理能力。面对单指令流多数据流(SIMD),

    硬件加速

    硬件加速的学术名称是 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封装。这个项目缺点在于文档不是很丰富,研究起来有一定的难度。

    展开全文
  • 这篇文档介绍如何在 ffmpeg 中使用 nvenc 硬件编码器。 私有驱动 nvenc 本身是依赖于 nvidia 底层的私有驱动的,所以想要使用编码器首先需要安装 nvidia 的私有驱动。在 NVIDIA ... VIDEO CODEC SDK 的...

    这篇文档介绍如何在 ffmpeg 中使用 nvenc 硬件编码器。

    私有驱动

    nvenc 本身是依赖于 nvidia 底层的私有驱动的,所以想要使用编码器首先需要安装 nvidia 的私有驱动。在 NVIDIA VIDEO CODEC SDK 的介绍中说明,最新版本的 nvenc sdk 5.0 在 linux 需要 346.22 以上的驱动,在windwos 下则需要 347.07 以上的驱动

    The latest NVENC SDK version available is 5.0, which requires NVIDIA GPUdriver 347.09 or above for Windows and 346.22 or above for Linux.

    目前 Ubuntu 15.04 上的驱动满足这个要求,Windows 平台可以直接到官网上下载最新的驱动安装。(个人不建议去官网下载最新的 Linux 驱动,因为我试了很多次都没有安装成功,最终会导致无法进入系统)。

    在 Ubuntu 15.04 下使用下面的命令安装最新的驱动。

    sudo apt-get install nvidia-346 \
                         nvidia-346-vum \
                         nvidia-modprobe \
                         nvidia-opencl-icd-346 \
                         nvidia-prime \
                         nvidia-settings
    

    注意 nvidia-modprobe 必须要安装,因为私有驱动使用的内核模块,需要安装这个包在系统启动的时候加载这些内核模块。安装完成之后可能无法进入系统,这个应该是 nvidia 中的一个 BUG,你可以重启之后选择 grub 中的 ubuntu 高级 选项 中低版本的内核进入系统之后重启再选择高版本的内核进入系统。这一点非常的诡异,目前没有找到原因。

    启动系统之后使用 lsmod | grep nvidia 应该会得到类似下面的结果:

    nvidia_uvm             69632  0
    nvidia               8380416  36 nvidia_uvm
    drm                   348160  7 i915,drm_kms_helper,nvidia
    

    直接通过 sudo modprobe nvidia_uvm 好像也无法成功的加载需要的模块。

    另外安装驱动安装完成之后会在 /dev 下面创建几个和 nvidia 相关的设备,通过ls /dev/nvidia* 应该会得到类型以下的结果:

    /dev/nvidia0  /dev/nvidiactl  /dev/nvidia-uvm
    

    编译 FFMPEG

    要想在 FFMPEG 中使用 nvenc 编码器,你需要在编译选项中加入 enable-nvenc选项。这个选项依赖于 nvEncodeAPI.h 头文件,这个头文件并没有包含在私有驱动中,你需要到 NVIDIA VIDEO CODEC SDK 中下载 SDK,解压后在Samples/common/inc 目录下有这个头文件,把它拷贝到可以链接到的目录中去。

    之后编译就可以顺利的通过,得到包含 nvenc 编码器的库。

    使用 nvenc

    FFMPEG 中直接使用 av_find_encoder_by_name("nvenc") 就可以找到这个这个编码器并使用它。nvenc.c 的 pix_fmts_nvenc 变量定义来看,这个编码器应该是支持 YUV420PYUV444P 和 NV12 三种格式的,但是测试的过程中发现YUV420P 没办法使用,所以应该吧 AVCodecContext 的 pix_fmt 设置成NV12

    展开全文
  • 编解码可以软实现(CPU),或者硬(GPU),当然还可以使用专用的编解码卡(IC),他们各有优点,但是基于硬件的处理往往速度更快。但是也有人说软有更大的可调节性。这里我们只记录硬的硬件支持情况,尤其是软...

     编解码可以软编实现(CPU),或者硬编(GPU),当然还可以使用专用的编解码卡(IC),他们各有优点,但是基于硬件的处理往往速度更快。但是也有人说软编有更大的可调节性。这里我们只记录硬编的硬件支持情况,尤其是软编效率没有上来的情况下这显得尤其重要。

    废话不多说,先上intel GPU QSV硬编解情况:

    摘自:https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video#Hardware_decoding_and_encoding

    ffmpeg qsv使用方法:https://trac.ffmpeg.org/ticket/5899

    重点:

    CQ:

    ./ffmpeg_g -y -i in.mp4 -an -c:v hevc_qsv -load_plugin hevc_hw -q 30 out.mp4
    

    CBR:

    ./ffmpeg_g -y -i in.mp4 -an -c:v hevc_qsv -load_plugin hevc_hw -b 5M -maxrate 5M out.mp4

    注意:hevc_qsv只输出IB帧,无P帧。我反复尝试了N次后依然如此,尤其是其中有个-r 1(no B frames)给人无B帧的希望

    。有段Intel人员给的解释如下:

     Sorry for a delayed response. Media SDK HW HEVC encoder uses Low Delay B-frames (LDB) or Generalized P/B (GPB) instead of P-frames. So, instead of encode P-frame with L0, Media SDK encodes LDB or GPB with the same L0 and L1. That's why you see just such LDB or GPB frame where both the L0 and L1 lists have the same I frame for reference and no P-frames. 
    出处:https://software.intel.com/en-us/forums/intel-media-sdk/topic/623600

    nvidia nvenc:


    摘自:https://developer.nvidia.com/nvidia-video-codec-sdk#NVENCFeatures

    https://developer.nvidia.com/video-encode-decode-gpu-support-matrix#Encoder

    展开全文
  • NVIDIA显卡H.264/H.265硬编解码参考文档,别的地方下载
  • 解决思路:利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。一、OpenCV中的硬解码OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下。 1 int main(int argc,....

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈。

    解决思路:

    利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。

    一、OpenCV中的硬解码

    OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下。

    复制代码
     1 int main(int argc, const char* argv[])
     2 {
     3     if (argc != 2)
     4         return -1;
     5     const std::string fname(argv[1]);
     6     cv::namedWindow("GPU", cv::WINDOW_OPENGL);    
     7     cv::gpu::setGlDevice();
     8     
     9     cv::gpu::GpuMat d_frame;
    10     cv::gpu::VideoReader_GPU d_reader(fname);
    11     d_reader.dumpFormat(std::cout);
    12     for (;;)
    13     {
    14         if (!d_reader.read(d_frame))
    15             break;
    16         //....
    17         cv::imshow("GPU", d_frame);
    18         if (cv::waitKey(3) > 0)
    19             break;
    20     }
    21     return 0;
    22 }
    复制代码

    阅读OpenCV中VideoReader_GPU源码,可发现其底层实现是借助于视频解码库CUVID。

    二、视频解码库CUVID

    CUVID是基于CUDA的视频解码库,利用CUVID进行解码,主要包括以下四个步骤:

    1.解析视频数据文件

    2.在GPU端解码

    3.转换解码后的数据(YUV420、NV12 ---> RGBA)

    4.将RGBA数据显示出来

    下图为利用CUVID解码的伪代码示意图,其中VideoSource用来解析视频数据文件,VideoParser用来解码数据。

    VideoSource的回调函数HandleVideoData(),当VideoSource的状态设置为Started时,开始解析视频文件,并创建VideoParser,解码数据。

    VideoParser的回调函数:

    HandleVideoSequence() 创建解码器或重设解码器

    HandlePictureDecode() 解码每帧视频数据

    HandlePictureDisplay() 转换,处理,显示解码后的数据

    OpenCV中VideoReader_GPU可以方便地利用GPU读取视频文件,加速解码过程,但OpenCV中VideoReader_GPU无法读取rtsp视频流数据。

    这是因为CUVID中CuvideoSource不支持rtsp视频流数据,不能由rtsp地址创建VideoSource

    三、CUVID解码rtsp视频流

    基本思路:跳过VideoSource模块,利用其他方式解析视频数据文件。

    基本步骤:

    1.利用FFmpeg解析rtsp视频流

    2.创建VideoParser

    3.利用FFmpeg读取数据包(AVpacket)

    4.将数据包传输到VideoParser(AVpacket ---> CUVIDSOURCEDATAPACKET)

    5.VideoParser解码数据包

    其示例伪代码如下图所示

    展开全文
  • OpenCL API VS SDK英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器使用 SDK 中的编解码接口使用编码器对于 OpenCL 和 SDK 的封装 硬件加速 硬件加速的学术名称是 GPGPU(General-...
    
    

    硬件加速

    硬件加速的学术名称是 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封装。这个项目缺点在于文档不是很丰富,研究起来有一定的难度。

    展开全文
  • 官网资料: 不同显卡的支持情况: ...每代GPU体系对硬解码的支持: https://developer.nvidia.com/nvidia-video-codec-sdk 如下图: 可以看到对于H264编码,最大分辨率支持到4096x4096,也就意味着8K的H2...
  • NVIDIA显卡H.264/H.265硬编解码参考文档,包括API接口和相关参数结构的详细描述。
  • 适用于nvidia显卡硬解码的套装,包含视频播放器,解码插件以及设置示意图。本人已经全部优化调整过了,适用于gtx1030-2080的显卡,显卡驱动建议安装工作室的那个版本。自动补帧设置好了,
  • 作者:诗颖摘要:日前,英伟达 Developer Blog 上一篇博文详细陈述了英伟达 Volta Tensor Core GPU 在深度学习社群取得的巨大突破,以及种种...
  • 目前在Linux系统下,NVIDIA已经提供了官方的高清播放支持。...为了解决这个问题,目前的显卡厂家都在显卡核心GPU中嵌入了部分视频解码格式的支持,来希望能够释放CPU,来保证系统的顺利运行。只是要释放CPU,实现GP
  • 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器,编码出的frame download到内存,然后做scale处理,将scale后的帧和...
1 2 3 4 5 ... 20
收藏数 720
精华内容 288