如何在GPU云服务器上编译FFMPEG

2021-12-03 09:55:00 浏览数 (1)

0x00 前言

FFMPEG是目前流行且开源跨平台音视频流处理的框架级解决方案。其功能强大,从音视频记录、编解码、转码、复用、过滤到流化输出,FFMPEG的命令行工具都能高效处理。

NVIDIA GPU 包含一个或多个基于硬件的解码器和编码器,其独立于CUDA内核,可为多种流行的编解码器提供完全加速的基于硬件的视频解码和编码。解码/编码卸载后,其图形引擎和CPU还可进行其他操作。用于视频解码NVDEC和视频编码NVENC的GPU 硬件加速引擎支持比实时视频处理更快的速度,从而使其除了视频播放外还适用于转码应用。GPU编解码模块,其架构和特性如下图:

硬件编解码器架构示意硬件编解码器架构示意

通过腾讯云的GPU云服务器,并结合相应的NVIDIA codec库,我们可以方便地加速FFMPEG在多种场景下的编解码工作,进一步有效提升音视频流的处理效率。

而启用GPU加速的前提是正确编译FFMPEG源码,这个问题一直困惑着不少小伙伴。本文将为你解决这个疑问,一步步搞定在GPU云服务器上编译最新稳定版本的FFMPEG。

那么,现在就跟我一起,先从创建一台GPU云服务器开始吧~

0x01 GPU云服务器控制台开通

我们从腾讯云官网主页,点击选择最热门的计算产品——云服务器产品。它是腾讯云目前最安全稳定的云服务器类产品,为开发者提供了高可用强性能的计算服务。 在产品主页点选“立即选购”后,我们来到云服务器的购买配置页面,如下图所示,这是最重要的第一步哦:

云服务器计费模式选择云服务器计费模式选择

注意,在计费模式这里,如果你确定未来会长期频繁且高负载地使用云服务器,可以选择包年包月的模式。不过,对于我们这种短期的搭建环境的验证/实验类场景,选择按量付费是最划算的选择。因为我们可以在安装完所需的软件后,通过镜像制作来”沉淀“一台云服务器的状态,然后放心销毁实例即可。后续需要时随用随创建即可,灵活性是云服务器的最大优势哦。

在随心地选择地域和可用区后,我们开始选择配置机型啦,这里选择腾讯云的GPU计算型GN7机型。它搭载一颗NVIDIA T4 GPU,有着出色的性能(高达2560核心和16GB显存)和极高的性价比,是腾讯云非常受青睐的一款GPU机型产品,适合各类通用场景,强烈推荐。

GPU云服务器机型选择GPU云服务器机型选择

系统镜像上,我们选择Ubuntu 20.04 64bit LTS版本,因为在上面安装CUDA Driver/Toolkit非常方便。安装过程本文不重点介绍,有兴趣可以参考这篇文章:云 社区【文章】GPU云服务器(驱动篇)。但是不要忘记,安装完一定要进行验证,可用这个命令:

代码语言:javascript复制
nvidia-smi

来验证CUDA Toolkit的安装以及查看驱动版本。用以下命令:

代码语言:javascript复制
lsmod | grep nvidia

来查看NVIDIA官方的驱动已经正确加载至当前系统内核,如图:

验证CUDA正确安装验证CUDA正确安装

至此,云服务器的初始化就完成啦,我们开始下一步源码下载吧~

0x02 FFMPEG最新稳定版源码下载

Linux系统下,自定义软件安装的最大优势在于总可以安装最新的稳定Release版本,第一时间体验最新的功能特性。当然,对于FFMPEG也不例外。我们可以在FFMPEG官网,点选右侧最大的绿色Download按钮进入源码下载页面,如图:

FFMPEG官网源码下载FFMPEG官网源码下载

通过wget下载源码压缩包,当前最新版是4.4版本。再通过GPG签名来验证源码下载的完整性:

代码语言:javascript复制
wget https://www.ffmpeg.org/releases/ffmpeg-4.4.tar.xz
​
wget https://www.ffmpeg.org/releases/ffmpeg-4.4.tar.xz.asc
gpg --verify ffmpeg-4.4.tar.xz.asc ffmpeg-4.4.tar.xz

GPG命令验证结果如图:

GPG签名验证下载完整性GPG签名验证下载完整性

如果看到“Good signature”字样,恭喜,可以放心地解压缩准备编译啦~

0x03 FFMPEG编译配置准备

首先通过tar命令解源码压缩包,注意对于xz压缩方式要用-J参数哦

代码语言:javascript复制
tar -Jxvf ffmpeg-4.4.tar.xz

解压结束后会生成一个新的ffmpeg目录,我们进入该目录并执行后续的全部操作

代码语言:javascript复制
cd ffmpeg-4.4

注意这里,如果直接执行configure免不了会报如下错误:

代码语言:javascript复制
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
blablabla...

这是因为没有安装对应的汇编器工具所致,在系统种安装yasm即可

代码语言:javascript复制
sudo apt install yasm

此时我们虽然可以顺利执行configure,但是仍然不能结合最新的NVIDIA的编解码特性。即便编译成功,也只能利用cpu来执行。我们需要将NVIDIA编解码器的头文件安装到系统目录,运行如下命令:

代码语言:javascript复制
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers/
make install

然后可以真正的configure

代码语言:javascript复制
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64

命令输入如图:

configure(源码编译配置)configure(源码编译配置)

接下来我们准备编译吧~

0x04 FFMPEG编译及命令行验证

编译前,我们通过lscpu命令可以看到我们的云服务器有20个核心,确实强劲。

查看CPU核心数查看CPU核心数

我们在编译时指定并发度20,即可发挥出服务器的最大算力:

代码语言:javascript复制
make -j 20

通常情况,编译将会在1分钟内顺利完成。当前目录内就会新编译出的ffmpeg的可执行文件啦~

试着执行它并指定展示硬件加速信息:

代码语言:javascript复制
./ffmpeg -hwaccels

会看到输出的硬件加速方式中有cuda的显示,我们验证了编译选项以及CUDA的启用。开始安装:

代码语言:javascript复制
make install

/usr/local/bin目录下会有ffmpeg相关的工具命令了,如ffmpegffprobe等,它们均已在全局的PATH中,可以在系统中使用了。ffmpeg相关的库会被安装到/usr/local/lib目录下,包括动态库和静态库。

运行ffmpeg命令查看其支持的编解码器吧:

代码语言:javascript复制
ffmpeg -codecs | grep cuvid

FFMPEG编译验证FFMPEG编译验证

可以看到,新安装的ffmpeg已经包含了NVIDIA相关的编解码器。至此,我们的编译过程就顺利完成啦!

0x05 小结

至此,相信你已熟悉掌握了在腾讯云GPU云服务器上编译FFMPEG源码操作流程以及常见的踩坑点,是不是感觉信心满满呢?快去创建一台GPU实例,体验一下视频转码加速提升的快感吧~

0x06 参考资料

  • 腾讯云服务器CVM
  • FFMPEG官网Release版本下载
  • 如何用GPU加速ffmpeg视频编码
  • 云 社区【文章】GPU云服务器(驱动篇)
  • 云 社区【视频】如何搭建云上AI训练环境
  • 云 社区【文章】GPU实例上搭建Jupyter深度学习环境
  • https://developer.nvidia.com/nvidia-video-codec-sdk

0 人点赞