其他分享
首页 > 其他分享> > FFmpeg`硬件加速并且在代码中使用`NVIDIA`的编解码器

FFmpeg`硬件加速并且在代码中使用`NVIDIA`的编解码器

作者:互联网

@datetime: 2021/06/14

@author: shenhao

文章目录


须知:一个章节如果标注了可跳过,那么它的子章节都需要跳过

FFmpeg硬件加速并且在代码中使用NVIDIA的编解码器

本文中所有步骤来自NVIDIA官方文档,以及参考了各大网友的做法总结和实践而成。另外本文只介绍一般的平台下的安装,不涉及特定的平台,如有需要,请参照NVIDIA官方文档

转载请标明出处。

前言

Windows上的FFmpeg的一般都已经集成了NVDIA的编解码器,但是为了在代码中使用,需要重新对FFmpeg进行重新编译。不建议在windows上编译,因为非常麻烦。而且不适合新手编译。本文介绍了三个不同平台下的**ffmpeg硬件加速方案**,还有如何在代码中如何使用GPU加速。刚开始本来是想先用windows的,因为便于测试,但是后来发现在windows平台下自己的内存不够,完不成编译(自己的内存是16G,最少的要求内存暂时还不知道),另外,在使用预先编译好的ffmpeg测试的时候,发现显卡又不支持h265的编解码,所以一直报no devices found或者codec not support。后来又使用虚拟机,但是又发现英伟达的显卡驱动不支持虚拟机递送(目前)。所以windows的用户确保自己的内存够用。另外,重要的是。不管是linuxwindows的用户,都要确保CUDA是否支持,对应的编解码是否支持。所以总结起来,先确保以下几点

另外:

CUDA简单介绍

CUDA® 是由 NVIDIA® 发明的并行计算平台和编程模型。 通过利用图形处理单元 (GPU) 的强大功能,它可以显着提高计算性能。注意,它只是一种架构。

1.Windows

1.1 准备工作

1.1.1 安装Msys2

​ 在Windows中编译FFmpeg需要Msys2(Msys2简单来说是在windows下可以兼容posix,说白了就是可以使用make && make install等)

Msys2下载地址

#更新
pacman -Syu
#安装相关工具
pacman -S make pkg-config diffutils yasm
#安装mingw64 mingw32的gcc
pacman -S mingw-w64-i686-nasm mingw-w64-i686-gcc mingw-w64-i686-SDL2 	mingw-w64_x86_64-gcc
#安装nasm汇编器
pacman -S nasm

1.1.2 编译libx264(可跳过)

​ 这一步的目的是避免有些机器没有NVDIA显卡,不能使用CUDA,所以作为候选,可以使用CPU编码.

git clone https://code.videolan.org/videolan/x264.git

成功安装所示

1.1.2.1 使用pexports

pexports可以在windows下把dll生成lib映射文件

下载地址

下载完成后,打开cmd,进入到pexport.exe所在的目录.

#注意:libx264后面的数字根据具体情况修改。
pexport.exe "x264源代码路径"/libx264-163.dll > libx264.def

这时候会在pexport目录中会有libx264.def生成

1.1.2.2 使用Visual Studio的Developer Cmd Prompt

打开后并cdpexport目录(也就是libx264.def所在的目录)

LIB /machine:x64 /DEF:libx264.def

此时会生成lib文件。注意这是动态库的lib文件,需要一起拷贝libx264-163.dll到文件夹中。

1.1.3 编译libx265(可跳过)

编译libx265需要cmake。自行下载。

cmake的编译比较简单。

#指定x64
cmake -Bbuild -A=x64
#Release
cmake --build build --config Release
cd build
cmake --install . --prefix="前缀路径"

注意:也可以不指定–prefix,但cmd要管理员权限运行,因为默认安装路径在Programs Files下

如图,分别生成了静态库和动态库

1.1.4 安装CUDA Toolkit

CUDA Toolkit下载。选择windows平台。

下载完成后,会在此目录下。此目录中有includelib

1.2 正式开始编译

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
git clone https://git.ffmpeg.org/ffmpeg.git
#以下操作在mingw64命令行中(由vs native tools 打开)
pacman -S diffutils make pkg-config yasm
#添加vc的cl.exe和link.exe所在的路径
export PATH="/c/Users/oaho/development/visual studio/2019/Community/VC/Tools/MSVC/14.29.30037/bin/Hostx64/x64":$PATH
#添加cuda sdk目录
export PATH="/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0/bin/":$PATH
make install PREFIX=/usr
./configure --enable-nonfree --enable-shared --enable-cuda-sdk --enable-libnpp --toolchain=msvc --extra-cflags="-I../nv_sdk" --extra-ldflags="-libpath:../nv_sdk"
--prefix="安装路径"

注意:如果想加入x264x265编解码器。可以在--extra-cflags中添加x264x265的头文件路径(空格隔开), 当然也在--extra-ldflags中添加库路径

编译非常耗内存

到此处完成编译。

2.Linux(centos7.9)和Unbuntu20.04安装

2.1 Linux

​ Linux中有两种安装方式。第一种为普通安装(centos7.9演示的则是普通安装),第二种是runfile安装.。Ubuntu20.04下,使用runfile的方式安装。简单说一下runfile安装和普通安装。runfile安装更简单,通用性高。但是如果在特定的平台,需要使用普通平台安装。

**注意:以下安装前的内核要求,必须按照以下表内给出的限制。**具体细节说明,请参照系统内核要求说明。另外请参照NVIDIA官方文档

内核支持的版本

2.1.1 安装前准备

uname -m && cat /etc/*release

#gcc的版本一定要6以上。对照上表进行。
yum install gcc
#对于cuda11.3来说,centos 7.9 Release的内核必须要为3.10.0-1136
uname -r
yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

2.1.2 安装CUDA

#(1)安装之前,先删除旧的,防止冲突
sudo /usr/local/cuda-X.Y/bin/cuda-uninstaller
sudo /usr/bin/nvidia-uninstall

wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda-repo-rhel7-11-3-local-11.3.1_465.19.01-1.x86_64.rpm

#看看输出是否为 028fd3c6c0c3e6c392f053afa52ce2f1
#如果不一致,则说明下载不完整,需要重新下载
md5sum cuda-repo-rhel7-11-3-local-11.3.1_465.19.01-1.x86_64.rpm
#(2) 下载驱动程序和库
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install subscription-manager
#这一步是为了之后的SDL2的依赖
yum install libX*
yum -y install yum-utils
#该驱动程序依赖于 /etc/X11/xorg.conf 中自动生成的 xorg.conf 文件。 如果存在自定义构建的 #xorg.conf 文件,则此功能将被禁用并且驱动程序可能无法运行。 删除现有的 xorg.conf 文件,或将 #/etc/X11/xorg.conf.d/00-nvidia.conf 的内容添加到 xorg.conf 文件中。 

#安装先前安装的rpm
rpm --install cuda-repo-rhel7-11-3-local-11.3.1_465.19.01-1.x86_64.rpm

#(3) 加入额外的依赖 
#此处可能需要加入yum代理,不然下载很慢
sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
#(4) 清除yum缓存
sudo yum clean expire-cache
#(5) 安装CUDA
sudo yum install nvidia-driver-latest-dkms
sudo yum install cuda
sudo yum install cuda-drivers

进行到这一步,CentOS7的用户请跳转到 [2.3 验证是否安装成功](#2.3 验证是否安装成功).

2.2 Ubuntu20.04

2.2.1 安装前准备

sudo apt-get install gcc
sudo apt-get install linux-headers-$(uname -r)

2.2.2 安装CUDA

wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.19.01_linux.run
sudo sh cuda_11.3.1_465.19.01_linux.run  --no-opengl-libs --run-nvidia-xconfig

安装成功后,路径在/usr/local/cuda-11.3

2.3 验证是否安装成功

https://static01.imgkr.com/temp/ae80d54e602d4fc28e788417ed6c2cfb.png

2.4 开始编译

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers && sudo make install
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
./configure --enable-nonfree -–enable-cuda-sdk –enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64

这里可以加入之前编译的x264库,根据自己选择

make && make install 

2.1.1 编译SDL2(可跳过)

./configure && make && make install

2.1.2 编译x264(可跳过)

git clone https://code.videolan.org/videolan/x264.git
cd x264 && ./configure --disable-asm --prefix=/usr/local/x264 --enable-shared && make && make install && sudo ldconfig
#加入pkg-config
export PKG_CONFIG_PATH=/usr/local/x264/lib/pkgconfig:${PKG_CONFIG_PATH}

2.1.3 编译FFmpeg

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
yum install -y build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}}
#注意,如果PKG_CONFIG_PATH是空的,不用加入":${PKG_CONFIG_PATH}"
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}
#检验ffnvcodec版本
pkg-config --modversion ffnvcodec
./configure --enable-nonfree -–enable-cuda-sdk –enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --prefix=/root/ffmpeg-lib-cuda

注意:这里需要更改lib和include的路径

make && make install

注意: 可以使用make -j8增加编译速度

注意:如果配置了安装前缀,则需要建立软链接

注意:如果动态链接了x264,需要加入动态库路径

2.5 完成编译

输入以下命令查看H264或者H265的编解码器

ffmpeg -codecs | grep nvenc

成功后如下图所示

3. NVIDIA编解码器的测试

3.1 FFmpeg使用NVIDIA编解码器

这里注意一下,要确定自己的显卡是否支持这些编码。

ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec hevc_nvenc -r 60 -y 2_60.265 
ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec hevc_nvenc -r 30 -y 2_30.265
ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec h264_nvenc -r 60 -y 2_60.264 
ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec h264_nvenc -r 30 -y 2_30.264
ffmpeg -i 1_60.264 -vcodec hevc_nvenc -r 60 -y 2_60_264to265.265 
ffmpeg -i 1_30.264 -vcodec hevc_nvenc -r 30 -y 2_30_264to265.265
ffmpeg -i 1_60.265 -vcodec h264_nvenc -r 60 -y 2_60_265to264.264 
ffmpeg -i 1_30.265 -vcodec h264_nvenc -r 30 -y 2_30_265to264.264

3.2 GPU使用情况查看

watch -n 1 nvidia-smi 

4. 代码中使用NVIDIA编解码器

在使用FFmpeg API的时候, AVCodec编解码器可以改成:

#使用nvidia的264的编码器
av_find_encoder_by_name(“h264_nvenc”); 
#使用nvidia的265的编码器
av_find_encoder_by_name(“hevc_nvenc”);

FAQ

API的时候,AVCodec`编解码器可以改成:

#使用nvidia的264的编码器
av_find_encoder_by_name(“h264_nvenc”); 
#使用nvidia的265的编码器
av_find_encoder_by_name(“hevc_nvenc”);

FAQ

标签:git,FFmpeg,--,编译,cuda,NVIDIA,硬件加速,安装,ffmpeg
来源: https://blog.csdn.net/qq_38576022/article/details/117907922