ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢

ffmpeg实现GPU(硬编码)加速转码


# 项目场景:

提示:ubuntu16将视频流(监控流)数据转码,使用GPU实现加速转码:
例如:将一个路径中的h265编码视频流数据转换为h264编码视频流数据,并输出到另一个路径中



准备工作

确定服务器有GPU
lspci | grep NVIDIA # 查看NVIDIA显卡
ubuntu-drivers devices
先在$HOME目录下创建名为 ffmpeg_sources 的目录(文件夹)

1、依赖库安装:

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
make
make install

libx265
H.265/HEVC视频编码器。
如果不需要此编码器,可以跳过,并在ffmpeg的configure命令中移除–enable-libx265
此路径下载很慢,条件允许你,可以直接去https://bitbucket.org/multicoreware下载到window上,然后移动到该路径

cd ~/ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265_git
cd ~/ffmpeg_sources/x265/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make
make install

libfdk_acc
AAC音频编码器,必备

cd ~/ffmpeg_sources
git clone --depth 1 --branch v0.1.6 https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

libmp3lame
MP3音频编码器,必备

cd ~/ffmpeg_sources
curl -O -L http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xzvf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
make
make install

libops

OPUS音频编码器
如果不需要此编码器,可以跳过,并在ffmpeg的configure命令中移除–enable-libopus

cd ~/ffmpeg_sources
curl -O -L https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz
tar xzvf opus-1.2.1.tar.gz
cd opus-1.2.1
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

libogg
被libvorbis依赖

cd ~/ffmpeg_sources
curl -O -L http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.gz
tar xzvf libogg-1.3.3.tar.gz
cd libogg-1.3.3
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install

libvorbis

Vorbis音频编码器
如果不需要此编码器,可以跳过,并在ffmpeg的configure命令中移除–enable-libvorbis

cd ~/ffmpeg_sources
curl -O -L http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
tar xzvf libvorbis-1.3.5.tar.gz
cd libvorbis-1.3.5
./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared
make
make install

libvpx

VP8/VP9视频编/解码器
如果不需要此编/解码器,可以跳过,并在ffmpeg的configure命令中移除–enable-libvpx

cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make
make install

2、编译安装ffmpeg 3.3.8

若想安装其他版本的ffmpeg,可以在这个路径       http://ffmpeg.org/releases/      下载,然后移动到虚拟机中,从下面第三行解压执行就行
cd ~/ffmpeg_sources
curl -O -L https://ffmpeg.org/releases/ffmpeg-3.3.8.tar.bz2
tar xjvf ffmpeg-3.3.8.tar.bz2
cd ffmpeg-3.3.8
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" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs=-lpthread \
  --extra-libs=-lm \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libfdk_aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree
make
make install
hash -r

验证安装

ffmpeg -h

至此,我们就可以使用ffmpeg转码视频了,但是是cpu进行的软编码方式转码,效率低,占用cpu资源高


实现GPU转码(硬编码):

1、安装cuda

首先确保安装了NVIDIA驱动(显卡驱动)
nvidia-smi
watch -n 10 nvidia-smi   #每10s查看一次

若输出如下,则说明已经安装好了显卡驱动
ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢_第1张图片
若输出为
在这里插入图片描述
则说明驱动有问题,需要接下来在安装cuda的时候将显卡驱动一起安装(安装cuda的时候就会提醒是否安装显卡驱动,若没有显卡驱动则选则y ,毕竟这种方式安装显卡驱动最便捷)



到CUDA官网下载CUDA安装包 https://developer.nvidia.com/cuda-downloads,选择对应的版本

如:
ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢_第2张图片
输入安装命令后将会进入该界面(前面的协议,一直按住enter键跳过即可)
ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢_第3张图片

下载执行完毕,安装完毕后,可通过命令查看     nvcc -V
输出类似文本
ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢_第4张图片
若未显示,通过    /usr/local/cuda-9.2/bin/nvcc -V   尝试一下,若也没有,则cuda未安装成功,若有上图输出,则说明安装成功,只需要配置cuda环境变量就行
配置方法:

1、  sudo vim ~/.bashrc

2、  在文件末尾加入下面两行
	export  PATH=/usr/local/cuda-10.1/bin:$PATH
	export  LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64$LD_LIBRARY_PATH

3、   保存退出

4、	  source ~/.bashrc

2、重新编译安装ffmpeg 3.3.8,使其支持GPU转码

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-libfdk_aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree \
  --enable-cuda \
  --enable-cuvid \
  --enable-nvenc \
  --enable-libnpp
make
make install
hash -r

安装完成后,输入命令     ffmpeg -hwaccels    即可查看支持的硬件加速方式
ffmpeg转码cpu很高,ffmpeg实现GPU(硬编码)加速转码,解决ffmpeg转码速度慢_第5张图片
命令   ffmpeg -codecs | grep cuvid   查看提供的编码器
在这里插入图片描述
事例:将h265编码的视频(我这儿是监控流)数据通过GPU方式转码为h264编码

ffmpeg -y -vsync 0 -hwaccel cuvid -c:v hevc_cuvid -i rtsp://admin:mm852456@192.168.0.209:554/h264/ch1/main/av_stream -c:v h264_nvenc -b:v 1024k -f flv -y rtmp://192.168.0.98:11937/live/h265_1

-hwaccl cuvid         指定使用cuvid硬件加速(vdpau、cuvid)
-c:v hevc_cuvid      解码规则
-i rtsp://admin:[email protected]:554/h264/ch1/main/av_stream      输入文件(流数据)
-c:v h264_nvenc     编码规则
-f flv                        文件输出类型指定
-y rtmp://192.168.0.98:11937/live/h265_1           输出到哪儿指定路径


你可能感兴趣的:(程序人生,经验分享,服务器,ubuntu)