[FFMPEG硬件加速]nvidia方案

news/2024/7/10 19:21:51 标签: NVIDIA, 转码, 硬件加速, FFMPEG, 显卡

##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)
  • CUDA工具集
  • 添加如下的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 \

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

#! /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

###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路

8.4 配置错误

ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec

If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.

解决:

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
make
sudo make install

http://www.niftyadmin.cn/n/1335988.html

相关文章

java.util.concurrent.RunnableFuture 接口 源码

2019独角兽企业重金招聘Python工程师标准>>> 线程池相关 源码&#xff1a; package java.util.concurrent;public interface RunnableFuture<V> extends Runnable, Future<V> {//在未被取消的情况下&#xff0c;将此 Future 设置为计算的结果void run()…

UBUNTU系统镜像定制

1.背景 本文基于ubuntu server 16.04版本&#xff0c;主要研究镜像包括修改显示的OEM信息&#xff0c;软件包的删除和添加&#xff0c;实现"系统尽可能的小&#xff0c;安装尽可能的简单傻瓜" 2.简述 UBUNTU安装CD主要包含三个部分&#xff1a; 启动引导器&#…

[网络调优]网卡中断与CPU绑定

1.背景 ​ 在Linux的网络调优方面&#xff0c;如果你发现网络流量上不去&#xff0c;那么有一个方面需要去查一下&#xff1a;网卡处理网络请求的中断是否被绑定到单个CPU或跟处理其它中断的是同一个CPU。 先说一下背景&#xff0c;网卡与操作系统的交互一般有两种方式&#x…

JAVA入门到精通-第18讲-排序查找

插入排序法&#xff1a;从后往前比较&#xff0c;大的往后移动&#xff1b;如果2小于1&#xff0c;移动&#xff1b; insetrVal<arr[index];否则&#xff0c;将2插入到适当位置&#xff1b; arr[index1]insertVal;[index1] -110&#xff1b;插入排序比选择排序速度更快&am…

好未来谢华亮:AI 在教育行业中的应用

11 月 23 日&#xff0c;在以「AI 产业技术的渗透与融合」为主题的 NIUDAY 北京站中&#xff0c;好未来 SEG 智慧教育事业部技术总监谢华亮为大家带来了关于「AI 在教育行业中的应用」的分享。 本文是对分享内容的实录整理。 大家好&#xff0c;特别感谢七牛云邀请我来做这个分…

[网络丢包]网卡MISX和MSI之争

1.背景 操作系统ubuntu server 16.04和ubuntu server 18.04&#xff1b;8个网口&#xff0c;其中7个作为数据输入&#xff0c;1个网口作为数据输出&#xff0c;PHY芯片为82574&#xff0c;1000Mbps全双工&#xff1b; 2.现象 1台设备源出500Mbps码率&#xff0c;过交换机后&…

红帽高级总监谈OpenJDK的未来:Java的未来从未如此光明

随着Java 11的发布&#xff0c;Java最终完成了到OpenJDK一等项目的过渡。使用专有OracleJDK二进制文件的日子已经结束了。对Java开放性和免费的关注自然而然将Oracle以外的公司的贡献带入到了聚光灯下。最近&#xff0c;InfoQ采访了Red Hat中间件产品管理高级总监Rich Sharples…

浏览器的兼容问题 (不断更新)

1、清除浮动的兼容性&#xff08;低版本的浏览器不兼容问题&#xff09; .clearfix:after{ content:""; clear:both; display:block; visibility:hidden; height:0; } .clear{ *zoom:1; } 2、透明度的兼容性 opacity:0.3; filter:alpha(opacity30); 3、各种国外浏览器…