本节介绍在Linux系统搭建FFmpeg开发环境的具体步骤,包括FFmpeg开发对于Linux系统的软硬件要求、如何在Linux上安装已编译的FFmpeg套件、如何在Linux上自行编译与安装FFmpeg等。
FFmpeg本身就在Linux系统下开发,而且C代码向来以高效著称,因此对硬件方面的配置要求较低,主要对软件环境有要求。对Linux服务器的基本要求如下:
(1)编译器要求GNU Make 3.81及以上版本。
(2)GCC要求4.8及以上版本。
(3)磁盘剩余空间在5GB以上,越大越好。
由于个人计算机较少安装Linux系统,因此建议读者在云服务环境上实践FFmpeg编程。
以上服务器配置要求很低,国内的云服务提供商都能满足。以华为云的最低档配置为例,编译器为GNU Make 4.3,GCC版本为10.3.1,磁盘空间为40GB,完全能够满足入门FFmpeg开发的环境要求。本书配套的C代码在华为云的EulerOS(欧拉系统,兼容CentOS)上调试通过。
对于初学者来说,搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能为FFmpeg集成编译好的第三方库。
考虑到初学者刚开始仅仅调用FFmpeg的函数,不会马上修改FFmpeg的源码,因此只要给系统安装编译好的FFmpeg动态库,即可着手编写简单的FFmpeg程序。比如这个网站:https://github.com/BtbN/FFmpeg-Builds/releases提供了已经编译通过的FFmpeg开发包,囊括Linux、Windows等系统环境的开发版本。对该网站提供的Linux版FFmpeg安装包而言,需要事先安装不低于2.22版本的glibc库,否则编译FFmpeg程序会报错:undefined reference to'_ZGVdN4vv_pow@GLIBC_2.22'。下面介绍在Linux系统安装已编译的FFmpeg的详细步骤。
因为GitHub编译好的FFmpeg依赖于glibc库,所以要在Linux环境安装版本号不低于2.22的glibc库。首先执行以下命令查看当前已安装的glibc版本。
rpm -qa | grep glibc
如果上面的命令返回的版本号不低于2.22,就无须再安装新版的glibc。只有返回的版本号低于2.22,才需要安装新版的glibc库。在华为云上实测发现,欧拉系统(Huawei Cloud EulerOS)自带的glibc版本号大于2.22,因此无须另外安装glibc库。
glibc库的安装步骤说明如下。
01 到https://ftp.gnu.org/gnu/glibc/下载2.23版本的glibc源码包。注意:虽然要求glibc版本不低于2.22,但是不宜安装过高版本的glibc,因为较高版本的glibc依赖于Python,安装Python环境又得费一番功夫,所以安装比2.22稍高一点的2.23版本就够了,也就是在https://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz下载压缩包。
02 先解压glibc源码包,再进入glibc源码目录,然后创建build目录并进入该目录,也就是依次执行以下命令:
tar zxvf glibc-2.23.tar.gz cd glibc-2.23 mkdir build cd build
03 在build目录下依次执行以下命令配置、编译与安装glibc。
../configure --prefix=/usr make make install
安装成功后,会在/usr/lib64目录下找到新的libc.so(还有libc.so.6和libc-2.23.so)和libmvec.so(还有libmvec.so.1和libmvec-2.23.so)等库文件。
安装glibc库后,再来安装已编译的FFmpeg,详细的安装步骤说明如下。
01 到https://github.com/BtbN/FFmpeg-Builds/releases下载Linux环境编译好的FFmpeg安装包,比如ffmpeg-master-latest-linux64-gpl-shared.tar.xz,注意区分32位系统和64位系统。
02 把下载好的FFmpeg安装包解压到/usr/local/ffmpeg目录,也就是依次执行以下命令:
cd /usr/local tar xvf ffmpeg-master-latest-linux64-gpl-shared.tar.xz mv ffmpeg-master-latest-linux64-gpl-shared ffmpeg
03 输入cd命令回到当前用户的初始目录,使用vi打开该目录下的.bash_profile,也就是依次执行以下命令:
cd vi .bash_profile
04 把光标移动到文件末尾,按a键进入编辑模式,然后在文件末尾添加下面两行环境变量的配置:
export PATH=$PATH:/usr/local/ffmpeg/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ffmpeg/lib
接着保存并退出文件,也就是先按Esc键退出编辑模式,再按“:”键,接着输入wq再按回车键,即可保存修改后的内容。
05 执行以下命令加载新的环境变量:
source .bash_profile
接着运行下面的环境变量查看命令:
env | grep PATH
发现控制台回显的PATH串包含/usr/local/ffmpeg/bin,同时LD_LIBRARY_PATH串包含/usr/local/ffmpeg/lib,说明FFmpeg的bin目录和lib目录的路径都已经加载到环境变量中了。
运行以下命令查看FFmpeg的版本信息:
ffmpeg -version
发现控制台回显如下的FFmpeg版本号,以及编译时的配置参数信息,说明FFmpeg程序成功运行起来了。
ffmpeg version N-110091-g261fb55e39-20230326 Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf)
由于别人编译的FFmpeg不可控,因此最好自己编译FFmpeg。尽管编译过程有点麻烦,但是整个安装过程都是受控的,更加符合开发者的定制需求。不过要在Linux系统编译FFmpeg,读者需要具备一定的Linux命令基础,Linux环境的FFmpeg编译与安装过程说明如下。
NASM是一款汇编工具,因为x264库和x265库都依赖于该库,所以要给Linux系统安装NASM库。它的安装方式有两种,一种是使用yum直接安装,另一种是通过编译源码来安装。使用yum安装NASM的命令如下:
yum install nasm
如果使用yum安装NASM失败,就要通过编译源码来安装,源码方式的安装步骤说明如下。
01 到https://www.nasm.us/pub/nasm/releasebuilds/下载最新的NASM源码,比如2022年12月发布的nasm-2.16,该版本的源码下载地址是https://www.nasm.us/pub/nasm/releasebuilds/2.16/nasm-2.16.tar.gz。将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令:
tar zxvf nasm-2.16.tar.gz cd nasm-2.16
02 进入解压后的NASM目录,运行下面的命令配置NASM:
./configure
03 运行下面的命令编译NASM。
make
04 编译完成后,运行下面的命令安装NASM。
make install
H.264格式的视频编解码用到了x264库,它的安装步骤说明如下。
01 到https://www.videolan.org/developers/x264.html下载最新的x264源码,比如新版的源码下载地址是https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.gz。将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令:
tar zxvf x264-master.tar.gz cd x264-master
02 进入解压后的x264目录,运行下面的命令配置x264:
./configure --enable-shared --enable-static
03 运行下面的命令编译x264:
make
04 编译完成后,运行下面的命令安装x264:
make install
H.265视频的编解码用到了x265库,因为x265库使用CMake编译,所以要事先在Linux下安装CMake工具。它的安装方式有两种,一种是使用yum直接安装,另一种是通过编译源码来安装。使用yum安装CMake的命令如下:
yum install cmake git
如果使用yum安装CMake失败,就要通过编译源码来安装,源码方式的安装步骤说明如下。
01 运行下面的命令,分别安装g++、openssl-devel和curl-devel,因为CMake依赖于这三个工具包。在安装过程中会提示[Y/n]确认是否继续安装,此时输入Y确定安装即可。
yum install g++ openssl-devel curl-devel
另外,还需执行下面的命令安装Git,虽然CMake不依赖于Git,但是只有安装了Git才能正常编译x265的动态库。
yum install git
02 到https://cmake.org/files/下载最新的CMake源码,比如2023年8月发布的cmake-3.27.3,该版本的源码下载地址是https://cmake.org/files/v3.27/cmake-3.27.3.tar.gz。将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令:
tar zxvf cmake-3.27.3.tar.gz cd cmake-3.27.3
03 进入解压后的CMake目录,运行下面的命令配置CMake。
./bootstrap --system-curl ./configure
04 运行下面的命令编译CMake。
make
05 编译完成后,运行下面的命令安装CMake。
make install
注意以上是通过源码方式安装CMake,如果发现源码编译失败,就只能直接安装编译好的CMake程序。详细步骤说明如下:
01 到https://cmake.org/files/下载最新的CMake安装包,比如2023年8月发布的cmake-3.27.3,Linux 64位x86环境的安装包下载地址是https://cmake.org/files/v3.27/cmake-3.27.3-linux-x86_64.tar.gz。将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令:
mv cmake-3.27.3-linux-x86_64.tar.gz /usr/local/ cd /usr/local/ tar zxvf cmake-3.27.3-linux-x86_64.tar.gz mv cmake-3.27.3-linux-x86_64 cmake
02 给环境变量PATH添加CMake解压后的bin目录。输入cd命令回到当前用户的初始目录,使用vi打开该目录下的.bash_profile,也就是依次执行以下命令:
cd vi .bash_profile
把光标移动到文件末尾,按a键进入编辑模式,然后在文件末尾添加下面一行环境变量的配置:
export PATH=$PATH:/usr/local/cmake/bin
接着保存并退出文件,也就是先按Esc键退出编辑模式,再按“:”键,接着输入wq再按回车键,即可保存修改后的内容。然后执行以下命令加载最新的环境变量:
source .bash_profile
03 运行以下命令检查CMake的版本号:
cmake -version
H.265格式的视频编解码用到了x265库,它的安装步骤说明如下。
01 到https://bitbucket.org/multicoreware/x265_git/downloads/下载最新的x265源码,比如2021年3月发布的x265_3.5,该版本的源码下载地址是https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz。将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令:
tar zxvf x265_3.5.tar.gz cd x265_3.5
02 进入解压后的x265目录的build目录,运行以下命令配置x265库:
cd build cmake ../source
03 运行以下命令编译x265:
make
04 编译完成后,运行以下命令安装x265:
make install
在前面的安装步骤中,x264和x265的.pc文件都安装到了/usr/local/lib/pkgconfig目录,因为FFmpeg正是根据这些.pc文件来查找对应的第三方配置,所以需要把该路径添加到环境变量PKG_CONFIG_PATH中,方便FFmpeg自动查找.pc文件,详细的加载步骤说明如下。
01 输入cd命令回到当前用户的初始目录,使用vi打开该目录下的.bash_profile,也就是依次执行以下命令:
cd vi .bash_profile
02 把光标移动到文件末尾,按a键进入编辑模式,然后在文件末尾添加下面一行环境变量的配置:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
接着保存并退出文件,也就是先按Esc键退出编辑模式,再按“:”键,接着输入wq再按回车键,即可保存修改后的内容。
03 执行以下命令加载最新的环境变量:
source .bash_profile
接着运行下面的环境变量查看命令:
env | grep PKG_CONFIG_PATH
发现控制台回显的PKG_CONFIG_PATH串包含/usr/local/lib/pkgconfig,说明pkgconfig目录的路径已加载到环境变量中了。
以上工具都安装之后,再来安装FFmpeg,详细的安装步骤说明如下。
01 到https://github.com/FFmpeg/FFmpeg/tags下载指定版本的FFmpeg源码包,比如2022年9月发布的FFmpeg-5.1.2,该版本的源码下载地址是https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n5.1.2.tar.gz。将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令:
tar zxvf FFmpeg-n5.1.2.tar.gz cd FFmpeg-n5.1.2s
02 进入解压后的FFmpeg目录,运行以下命令配置FFmpeg:
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-iconv --enable-gpl --enable-nonfree
注意configure后面的配置选项中,enable表示开启某项功能,disable表示关闭某项功能,常见的配置选项说明见表1-1。
表1-1 FFmpeg的配置命令选项说明
03 运行以下命令编译FFmpeg:
make
如果觉得make命令编译得太慢,可改成执行以下命令编译FFmpeg,“-j4”表示启动4个编译进程。在系统资源紧张的时候,多进程编译可能报错,此时再改回make命令即可。
make -j4
04 编译完成后,运行以下命令安装FFmpeg:
make install
05 把/usr/local/ffmpeg/bin添加到环境变量PATH中,把/usr/local/lib和/usr/local/ffmpeg/lib都添加到环境变量LD_LIBRARY_PATH中。也就是依次执行以下命令:
cd vi .bash_profile
把光标移动到文件末尾,按a键进入编辑模式,然后在文件末尾添加下面三行环境变量的配置:
export PATH=$PATH:/usr/local/ffmpeg/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ffmpeg/lib
接着保存并退出文件,也就是先按Esc键退出编辑模式,再按“:”键,接着输入wq再按回车键,即可保存修改后的内容。
然后执行以下命令加载最新的环境变量:
source .bash_profile
接着运行下面的环境变量查看命令:
env | grep PATH
发现控制台回显的PATH串包含/usr/local/ffmpeg/bin,同时LD_LIBRARY_PATH串包含/usr/local/lib和/usr/local/ffmpeg/lib,说明FFmpeg的bin目录和lib目录的路径都已经加载到环境变量中了。
06 运行以下命令查看FFmpeg的版本信息:
ffmpeg –version
发现控制台回显如下的FFmpeg版本号,以及编译时的配置参数信息,说明FFmpeg程序成功运行起来了。
ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 10.3.1 (GCC) configuration: --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-iconv --enable-gpl --enable-nonfree