GPU测试

ffmpeg -c:v h264_cuvid -rtsp_transport tcp -i rtsp://admin:Admin123@192.168.64.178/h264/1/main/av_stream -y -qscale 5 -f image2 -r 1 -t 0:5:0 /home/ffmpeg_1/%5d.jpg

 

watch -n 1 -d nvidia-smi

 

CUDA

CUDA是Nvidia出的一个GPU计算库,让程序员可以驱动Nvidia显卡的GPU进行各种工作,其中就包含了视频的编解码

安装CUDA

首先验证一下显卡驱动是否装好

nvidia-smi

https://www.jianshu.com/p/59da3d350488

 

准备工作

在$HOME下创建ffmpeg_sources目录

编译并安装依赖库

本节中的依赖库基本都是必须的,建议全部安装

nasm

汇编编译器,编译某些依赖库的时候需要

cd ~/ffmpeg_sources curl -O -L http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.bz2 tar xjvf nasm-2.13.02.tar.bz2 cd nasm-2.13.02 ./autogen.sh ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" make make install

yasm

汇编编译器,编译某些依赖库的时候需要

cd ~/ffmpeg_sources curl -O -L http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar xzvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" make make install

libx264

H.264视频编码器,如果需要输出H.264编码的视频就需要此库,所以可以说是必备

cd ~/ffmpeg_sources #git clone --depth 1 http://git.videolan.org/git/x264 #cd x264 #PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --enable-shared

如果出现

ffmpeg使用java ffmpeg使用gpu加速环境搭建_git

#PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --enable-shared --disable-asm #make #make install

 

使用Nvidia显卡GPU进行转码

CUDA计算库

CUDA是Nvidia出的一个GPU计算库,让程序员可以驱动Nvidia显卡的GPU进行各种工作,其中就包含了视频的编解码

安装CUDA计算库

首先验证一下显卡驱动是否装好

nvidia-smi

如果驱动正常的话,此命令会输出显卡的型号、驱动版本、现存/GPU占用等信息。如何安装显卡驱动本文不描述,请参考其他资料。

到CUDA官网https://developer.nvidia.com/cuda-downloads下载对应平台的发行包,这里我选择

linux运行:

#./cuda_9.2.148_396.37_linux.run

ffmpeg使用java ffmpeg使用gpu加速环境搭建_git_02

会出现这个,不要傻等,回车一直按着

注意如果按照错误有些可以跳过不安装,simples和openGL可以不装,如果已经装好驱动Driver第一步也可以不装

ffmpeg使用java ffmpeg使用gpu加速环境搭建_ffmpeg_03

 

验证安装

/usr/local/cuda-8.0/bin/nvcc -V

安装成功的话,会输出类似文本:

nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2018 NVIDIA Corporation Built on Tue_Jun_12_23:07:04_CDT_2018 Cuda compilation tools, release 9.2, V9.2.148

编译ffmpeg,需要ffmpeg3.3.9,测试发现4.0.2暂时不行。


要让ffmpeg能够使用CUDA提供的GPU编解码器,必须重新编译ffmpeg,让其能够通过动态链接调用CUDA的能力

#xz -d ffmpeg-3.3.9.tar.xz

#tar -xvf ffmpeg-3.3.9.tar

首先要编译安装nv-codec-headers库

#git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

#cd nv-codec-headers/ #make PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin" #make install PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin"

 

进入ffmpeg-3.3.9目录执行编译:

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include -I/usr/local/cuda/include" \ --extra-ldflags="-L$HOME/ffmpeg_build/lib -L/usr/local/cuda/lib64" \ --extra-libs=-lpthread \ --extra-libs=-lm \ --bindir="$HOME/bin" \ --enable-gpl \ --enable-libx264 \ --enable-nonfree \ --enable-cuda \ --enable-cuvid \ --enable-nvenc \ --enable-libnpp #make -j4

make时间有点久,-j提高速度,一般cpu核心数两倍为宜 #make install

 

vi /etc/profile

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-9.2/lib64:/root/ffmpeg_build/lib

 

验证安装

重新安装完ffmpeg,使用ffmpeg -hwaccels命令查看支持的硬件加速选项

Hardware acceleration methods: cuvid

可以看到多出来一种叫做cuvid的硬件加速选项,这就是CUDA提供的GPU视频编解码加速选项

 

然后查看cuvid提供的GPU编解码器ffmpeg -codecs | grep cuvid

使用GPU进行视频转码测试

ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport tcp -i "rtsp://admin:admin@192.168.57.192:554/H264?channel=1&subtype=0&unicast=true&proto=Onvif/video

" -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y /home/2.mp4

 

-hwaccel cuvid:指定使用cuvid硬件加速

-c:v h264_cuvid:使用h264_cuvid进行视频解码

-c:v h264_nvenc:使用h264_nvenc进行视频编码

-vf scale_npp=1280:-1:指定输出视频的宽高,注意,这里和软解码时使用的-vf scale=x:x不一样

转码期间使用nvidia-smi查看显卡状态,能够看到ffmpeg确实是在使用GPU进行转码:

+-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 62543 C ffmpeg 193MiB | +-----------------------------------------------------------------------------+

向不同GPU提交转码任务

-hwaccel_device N 指定某颗GPU执行转码任务,N为数字,如:

ffmpeg -hwaccel cuvid -hwaccel_device 0