参考:

https://blog.csdn.net/JineD/article/details/128420330?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128420330%22%2C%22source%22%3A%22JineD%22%7Dhttps://blog.csdn.net/JineD/article/details/128420330?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128420330%22%2C%22source%22%3A%22JineD%22%7D

在FFmpeg官网Download FFmpeg可以下载到ubuntu/debian的发行包,其他Linux发行版需自行编译。同时,如果要使用GPU进行硬件加速的话,也是必须自己编译FFmpeg的,所以本节将介绍从源码编译安装FFmpeg的方法(基于 ubuntu)

安装依赖工具

apt install libtool autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git make mercurial pkgconfig zlib-devel

准备工作

在$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.t
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

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

安装 CUDA 和 Cudnn ,参考其它文章,本文不讲解

编译安装ffmpeg

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

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

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

进入~/ffmepg_sources/目录执行ffmpeg的编译和安装
注意 configure 命令参数

cd ~/ffmpeg_sources
curl -O -L https://ffmpeg.org/releases/ffmpeg-5.0.2.tar.bz2
tar -xjvf ffmpeg-5.0.2.tar.bz2
cd ffmpeg-5.0.2
export PATH="$HOME/bin:$PATH"
export 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 \--extra-libs=-ldl \--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

验证安装

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

Hardware acceleration methods:
cuvid

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

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

 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: libx264 libx264rgb h264_nvenc nvenc nvenc_h264 )DEV.L. hevc                 H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_nvenc )DEVIL. mjpeg                Motion JPEG (decoders: mjpeg mjpeg_cuvid )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 )DEV.L. vp8                  On2 VP8 (decoders: vp8 libvpx vp8_cuvid ) (encoders: libvpx )DEV.L. vp9                  Google VP9 (decoders: vp9 libvpx-vp9 vp9_cuvid ) (encoders: libvpx-vp9 )

所有带有"cuvid"或"nvenc"的,都是CUDA提供的GPU编解码器
可以看到,我们现在可以进行h264/hevc/mjpeg/mpeg1/mpeg2/mpeg4/vc1/vp8/vp9格式的GPU解码,以及h264/hevc格式的GPU编码

使用GPU进行视频转码

用GPU进行转码的命令和软转码命令不太一样,CPU转码的时候,我们可以依赖ffmpeg识别输入视频的编码格式并选择对应的解码器,但ffmpeg只会自动选择CPU解码器,要让ffmpeg使用GPU解码器,必须先用ffprobe识别出输入视频的编码格式,然后在命令行中指定对应的GPU解码器。

例如,将h264编码的源视频转码为指定尺寸和码率的h264编码视频:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y <output>
  • -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转码效率测试

在配有两颗Intel-E5-2630v3 CPU和两块Nvidia Tesla M4显卡的服务器上,进行h264视频转码测试,成绩如下:

  • GPU转码平均耗时:8s
  • CPU转码平均耗时:25s

并行转码时,CPU软转的效率有所提高,3个转码任务并行时32颗核心全被占满,此时的成绩

  • GPU转码平均耗时:8s
  • CPU转码平均耗时:18s

不难看出,并行时GPU的转码速度并没有提高,可见一颗GPU同时只能执行一个转码任务。那么,如果服务器上插有多块显卡,ffmpeg是否会使用多颗GPU进行并行转码呢?

很遗憾,答案是否。

ffmpeg并不具备自动向不同GPU分配转码任务的能力,但经过一番调查后,发现可以通过-hwaccel_device参数指定转码任务使用的GPU!

向不同GPU提交转码任务

ffmpeg -hwaccel cuvid -hwaccel_device 0 -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y <output>
ffmpeg -hwaccel cuvid -hwaccel_device 1 -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y <output>
  • -hwaccel_device N:指定某颗GPU执行转码任务,N为数字

此时nvidia-smi显示:

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

可以进行并行GPU转码了!

那么在占满服务器资源时,GPU转码和CPU转码的效率如下:

  • GPU转码平均耗时:4s
  • CPU转码平均耗时:18s

GPU效率是CPU的4.5倍

FFmpeg 使用 Nvidia GPU 进行转码加速相关推荐

  1. ffmpeg 调用 NVIDIA GPU 处理视频转码,笔记。和纯用CPU比起来,速度快5倍以上

    参考别人的文章 FFMPEG 使用显卡加速转码 ffmpeg 调用 NVIDIA GPU 处理视频转码 ffmpeg 硬件加速视频转码指南 ffmpeg 硬件加速 wmv 视频转码 自己的关于ffmp ...

  2. FFmpeg在Intel GPU上的硬件加速与优化

    英特尔提供了一套基于VA-API/Media SDK的硬件加速方案,通过在FFmpeg中集成Intel GPU的媒体硬件加速能力,为用户提供更多的收益.本文来自英特尔资深软件开发工程师赵军在LiveV ...

  3. FFmpeg集成到GPU

    FFmpeg集成到GPU GPU加速视频处理集成到最流行的开源多媒体工具中. FFmpeg是最流行的开源多媒体操作工具之一,它有一个插件库,可以应用于音频和视频处理管道的各个部分,并在世界各地得到广泛 ...

  4. 【FFmpeg在Intel GPU上的硬件编解码实现】

    用于记录Intel CPU开发qsv硬件解码过程中遇到的一些问题及解决方案 以下文章是在开发过程中参考的比较有意义的文章,供大家学习和参考~~ https://zhuanlan.zhihu.com/p ...

  5. NVIDIA GPU加速FFmpeg

    一.参考资料 使用GPU硬件加速FFmpeg视频转码 二.重要指令 查看支持的硬件加速选项 ffmpeg -hwaccels 查看cuvid提供的GPU编解码器 ffmpeg -codecs | gr ...

  6. 基于 NVIDIA GPU 和 RAPIDS 加速 Spark 3.0

    导读:今天给大家分享的主题是基于NVIDIA GPU和RAPIDS加速Apache Spark 3.0,首先会介绍Apache Spark的RAPIDS加速器及工作原理,然后分享我们对于Shuffle ...

  7. FFmpeg —— 查看NVIDIA显卡对硬件加速的支持

    起因      起初了解学习掌握ffmpeg的编解码,以为只是学会了相关API的使用就可以了,但现实却不是这样的.视频.音频.字幕等都是需要仔细的学习了解,更是对一个行业的涉足.      在对ffm ...

  8. 干货|TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法工程师 安装平台 1 平台 目前Tensor ...

  9. NVIDIA GPU 常用操作

    参考:https://blog.csdn.net/masound/article/details/81909323 1. nvidia-smi watch -n 2 nvidia-smi (间隔2秒查 ...

最新文章

  1. 使用Crypto++ ecdsa 进行签名和认证
  2. OVS DPDK vhost-user详解(十二)
  3. SPQuery 查询知多少
  4. 蓝色三角_梅山!长三角唯一近海蓝色海湾成网红打卡地
  5. 数据结构与算法 | 快速排序:Hoare法, 挖坑法,双指针法,非递归, 优化
  6. Python数据结构和算法
  7. Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法
  8. php firefox导出csv,如果文件名有空格,空格后面部分不会导出,后缀也没有
  9. Pojo、Po、Vo、Dto的含义
  10. 三插头内部结构图_两脚插头和三脚插头区别是什么 插座的结构特点有哪些
  11. VMware新建虚拟机步骤图解
  12. python中冒号报错_python冒号_python 冒号_python冒号报错 - 云+社区 - 腾讯云
  13. 10047.GNU Make 使用手册中译版(转)
  14. “似水无形” 的小程序化
  15. 小米手机短信拦截转发失败原因
  16. JVM调优实战:to-space exhausted Evacuation Failure
  17. python数据统计分析
  18. 酷睿 i7 12800H怎么样 相当于什么水平
  19. 进入社会一周年的些许感悟和经历
  20. baidupcsgo安卓_百度网盘资源下载器下载

热门文章

  1. jQuery阻止冒泡事件和默认事件
  2. 【数据结构】最小生成树问题(Prim算法和Kruskal算法)
  3. 中秋教师节活动方案打印选择哪个平台打印便宜
  4. 2019.12.24笔记——SpringBoot整合Elasticsearch及其使用
  5. 泰拉瑞亚服务器协议,泰拉瑞亚 云服务器
  6. 如何申请免费证书(HTTPS)
  7. opencv学习笔记八--答题卡识别
  8. WPF打印Datagrid表格
  9. 12306网站之我见
  10. 《深度学习进阶:自然语言处理》读书笔记:第2章 自然语言和单词的分布式表示