博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[FFMPEG硬件加速]nvidia方案
阅读量:4183 次
发布时间:2019-05-26

本文共 4591 字,大约阅读时间需要 15 分钟。

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显卡驱动

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

3.3.1.删除旧驱动

sudo apt-get purge nvidia*

3.3.2.禁用自带nouveau nvidia驱动

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

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

blacklist nouveauoptions 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.runservice 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源码 () 下载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/bashbash 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路

你可能感兴趣的文章
628. Maximum Product of Three Numbers(排序)
查看>>
Linux内核-------同步机制(二)
查看>>
面试题31-------连续子数组的最大和(数组)
查看>>
epoll 实现Chat
查看>>
21. Merge Two Sorted Lists(链表)
查看>>
2. Add Two Numbers(链表)
查看>>
637. Average of Levels in Binary Tree(Tree)
查看>>
226. Invert Binary Tree(Tree)
查看>>
328. Odd Even Linked List(链表)
查看>>
199. Binary Tree Right Side View(Tree)
查看>>
230. Kth Smallest Element in a BST(Tree)
查看>>
求字符串的最长回文串-----Manacher's Algorithm 马拉车算法
查看>>
回溯法常用的解题模板和常见题型
查看>>
深入分析Java I/O 的工作机制
查看>>
动态规划的套路----左神
查看>>
KMP算法简解
查看>>
左神算法课进阶版总结
查看>>
左神算法基础班总结
查看>>
Linux性能优化
查看>>
进程间的通信---UNIX高级环境编程
查看>>