1.目标

<1>显卡性能参数;
<2>方案可行性;

2.平台信息

2.1.查看当前显卡信息

命令: 

lspci |grep VGA 

信息: 

01:00.0 VGA compatible controller: NVIDIA Corporation GK106 [GeForce GTX 645 OEM] (rev a1)

解析: 

GK106,是一个由英伟达公司制造的适配器图形处理和加速核心芯片。

从NVIDIA支持的矩阵表中查找出GK106支持格式分别为: 

NVDEC解码:MPEG-2 VC-1 H.264(AVCHD) 

NVENC编码:H.264 (AVCHD) YUV 4:2:0

3.NVIDIA

3.1.NVIDIA参考资料

3.2.NVIDIA性能参数

从NVIDIA的video encode performance中查找到Quadro K4000:支持同时编码16路1920 X 1080 H.264 (AVCHD) YUV 4:2:0,支持高性能和高质量,以及低延时模式;

注意:目前所有的NVIDIA都不支持 4:2:2编码 

支持的编码格式总集:

H.264 (AVCHD) YUV 4:2:0
H.264 (AVCHD) YUV 4:4:4
H.264 (AVCHD) Lossless
H.265 (HEVC) YUV 4:2:0
H.265 (HEVC) YUV 4:4:4
H.265 (HEVC) Lossless
H.265 (HEVC) 8k

支持的解码格式总集:

MPEG-2
VC-1
H.264(AVCHD)
H.265(HEVC)
VP8
VP9

3.3.NVIDIA显卡驱动

驱动网站打开较慢,因此把我的驱动上传到个人云盘NVIDIA驱动,里面有产品支持列表

3.3.1.删除旧驱动

sudo apt-get purge nvidia*

3.3.2.禁用自带nouveau nvidia驱动

gedit /etc/modprobe.d/blacklist-nouveau.conf

并在文件blacklist-nouveau.conf中添加以下内容:

blacklist nouveau
options nouveau modeset=0

更新:

update-initramfs -u

修改后需要重启系统。确认下Nouveau是否已经被禁用,使用命令:

lsmod | grep nouveau

3.3.3.安装驱动

重启系统,使用Ctrl+Alt+F1进入tty1控制台:

service lightdm stop
./NVIDIA-Linux-x86_64-375.26.run
service lightdm start
3.3.4.其他
   ./NVIDIA-Linux-x86_64-375.26.run --update     安装时先下载最新驱动包
./NVIDIA-Linux-x86_64-375.26.run --uninstall 卸载驱动

4.ffmpeg

4.1.ffmpeg对NVIDIA GPU的支持

  • 支持h.264和hevc硬件加速编码; 支持h.264, hevc, VP9, VP8, MPEG2和MPEG4的硬件加速解码;
  • 可设置跟视频编码质量相关的参数,如:preset, rate等;
  • 可使用FFmpeg中的filters进行端对端1:n编码或1:n转码视频硬件加速通道;
  • 能添加自己编写的高性能CUDA filters;
  • 同时支持Windows和Linux support;

此外, NVIDIA 也为GPU的视频处理任务提供的插件功能. 

GPU Resize:将一个输入转换为多个分辨率并行输出; 

GPU Zero-copy:使能GPU-accelerated插件就可以避免在处理视频时,系统和GPU内存间的数据拷贝;

4.2.ffmpeg对NVIDIA GPU的支持步骤

  • 下载FFmpeg源码 (https://git.FFmpeg.org/FFmpeg.git) 下载NVIDIA的最新Video Codec SDK 将NVIDIA的头文件复制到ffmpeg的编译环境中;
  • 下载安装NVIDIA驱动(apt install nvidia-375)
  • 添加如下的configure命令(nv_sdk应包含cuda的库和头文件) :
./configure \
--enable-nonfree \
--disable-shared \
--enable-nvenc \
--enable-cuda \
--enable-cuvid \
--enable-libnpp \
--extra-cflags=-Ilocal/include \
--extra-cflags=-I../nv_sdk \
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意:实际使用的是以下配置:

#! /bin/bash
bash configure \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-doc \
--enable-gpl \
--enable-pthreads \
--disable-w32threads \
--disable-os2threads \
--enable-debug \
--enable-nvenc \
--enable-cuda \
--enable-cuvid \
--extra-cflags="-Invidia_sdk -I/usr/local/cuda-8.0/include" \
--extra-ldflags="-Lnvidia_sdk -L/usr/local/cuda-8.0/lib64" \
--enable-nonfree \
--enable-libfreetype \
--enable-libfribidi \
--enable-libfontconfig \
--enable-libnpp \
--enable-gpl
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

4.3. 查看nvidia硬件加速编解码器:

ffmpeg -codecs | grep cuvid
信息如下:
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: h264_nvenc h264_vaapi nvenc nvenc_h264 )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: nvenc_hevc hevc_nvenc hevc_vaapi ) ffmpeg -codecs | grep nvenc
信息如下:
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: h264_nvenc h264_vaapi nvenc nvenc_h264 )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: nvenc_hevc hevc_nvenc hevc_vaapi )
DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_cuvid ) (encoders: mjpeg mjpeg_vaapi )
DEV.L. mpeg1video MPEG-1 video (decoders: mpeg1video mpeg1_cuvid )
DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_cuvid )
DEV.L. mpeg4 MPEG-4 part 2 (decoders: mpeg4 mpeg4_cuvid )
D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_cuvid )
D.V.L. vp8 On2 VP8 (decoders: vp8 vp8_cuvid )
D.V.L. vp9 Google VP9 (decoders: vp9 vp9_cuvid )

5.结论

  • 最后成功进行了硬件加速转码,由于显卡是GeForce系列,因此只能验证一路:
  • 从结果来看,使用硬件加速确实释放了CPU资源,编码速度也有明显提高,但质量相比X264有稍微的不足;
  • 抛开编解码质量和速度的严格要求,nvidia需要图形专业级别的显卡支持,方能做出产品;

6.后记

在20170125时,再一次投入nvidia的开发

7.工具

vmstat -w -n 1 

nvidia-bug-report.sh 

nvidia-cuda-mps-server 

nvidia-detector 

nvidia-modprobe 

nvidia-settings 可图形查看显卡使用情况 

nvidia-uninstall 

nvidia-cuda-mps-control 

nvidia-debugdump 

nvidia-installer 

nvidia-smi 

nvidia-xconfig

8.问题list

8.1.cannot load libcuda.so.1

原因:该问题是由于我升级了nvidia(ubuntu版本)的驱动(由375.39升级到375.51)引起的 

解决:卸载驱动,下载官方驱动375.39重新安装

8.2.解码阻塞

现象: 

1.源丢包时,解码函数总是被阻塞,使用新的接口解决; 

8.3.结果

采用M2000,最终极限并发能达到48路左右,但实际采用32路

【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案的更多相关文章

  1. FFmpeg再学习 -- 硬件加速编解码

    为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...

  2. 是否应该开启WebView硬件加速?

    android webview 在3.0+后显示flash要启用硬件加速,开启硬件加速也能够使绘制更加平滑. 开启硬件加速是在manifest中加入: android:hardwareAccelera ...

  3. 【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结

    2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用.Video Codec SDK包含完整的的高性 ...

  4. 【视频开发】【CUDA开发】ffmpeg Nvidia硬件加速总结

    原文链接:https://developer.nvidia.com/ffmpeg GPU-accelerated video processing integrated into the most p ...

  5. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

  6. 【视频开发】ffmpeg实现dxva2硬件加速

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.这是第二篇,记录用ffmpeg实现dxva2. 第一篇翻译的Direct3D device manager,链接:http: ...

  7. 【并行计算与CUDA开发】英伟达硬件加速编解码

    硬件加速 并行计算 OpenCL OpenCL API VS SDK 英伟达硬件编解码方案 基于 OpenCL 的 API 自己写一个编解码器 使用 SDK 中的编解码接口 使用编码器对于 OpenC ...

  8. 【ARM-Linux开发】【CUDA开发】NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南

    NVIDIA TEGRA X1:LINUX驱动程序包多媒体用户指南 转载请注明作者和出处:http://blog.csdn.net/u011475210 嵌入式平台:NVIDIA Jetson TX1 ...

  9. 【并行计算-CUDA开发】 NVIDIA Jetson TX1

    概述 NVIDIA Jetson TX1是计算机视觉系统的SoM(system-on-module)解决方案.它组合了最新的NVIDIAMaxwell GPU架构,其具有ARM Cortex-A57 ...

随机推荐

  1. python练习题(四)

    题目: 根据一个字符串返回一个ip数组,按照ip最后一位排序, 字符串: str = 'ss192.0.0.12?!289.0.0.1!0.0.0.0!192.163.10.28?192.0.0.5' ...

  2. Generator 函数和for...of循环,实现斐波那契数列

    function* fib () { let [prev, cur] = [0,1] for (;;) { yield cur [prev, cur] = [cur, cur+prev] } } fo ...

  3. python完成加密参数sign计算并输出指定格式的字符串

    加密规则: 1.固定加密字符串+字符串组合(key/value的形式,并通过aissc码排序), 2.通过sha1算法对排序后的字符串进行加密, 3.最终输出需要的参数sign 4.完成请求参数数据的 ...

  4. DNS隧道

    自己使用的dns隧道通过两种方法,一种是通过dnscat2工具,另一种通过cs上的beacon来进行通信. 第一种方法:dnscat2: 参考文章:https://xz.aliyun.com/t/22 ...

  5. Spark 缓存机制

    Spark中的缓存机制:避免spark每次都重算RDD以及它的所有依赖,cache().persist(). checkpoint(). 1.cache():会被重复使用,但是不能太大的RDD,将其c ...

  6. tensorflow2.0 学习(三)

    用tensorflow2.0 版回顾了一下mnist的学习 代码如下,感觉这个版本下的mnist学习更简洁,更方便 关于tensorflow的基础知识,这里就不更新了,用到什么就到网上取搜索相关的知识 ...

  7. 洛谷 P2512 [HAOI2008]糖果传递 题解

    每日一题 day47 打卡 Analysis 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小 ...

  8. gdb命令行

    1.当程序出现core dump时,使用下面的命令调试:       gdb 程序名 core.1234  或       gdb core.1234       gdb -c core.1234 程 ...

  9. 文件搜索命令find

    1.路径加文件名搜索(find): 查找的是etc目录下的以init为名字的文件. 加通配符后为模糊搜索,只要文件名中含有init即可. 查找etc目录下以init开头的七位文件名. 2.搜索时不区分 ...

  10. 【JZOJ6210】【20190612】wsm

    题目 定义两个非递减数列的笛卡尔和数列\(C = A \oplus B\) 为\((A_i+B_j)\)排序后的非递减数列 \(W\)组询问,问有多少对可能的数列,满足: \(|C|=s,|A| = ...