作为音视频的爱好者,不可避免是要接触这些厉害的三方库,ffmpeg作为其中的佼佼者,更是深受广大读者的喜爱,今天就来一起学习一下如何编译ffmpeg。
首先编译ffmpeg需要一些必备条件。
-
搭建Ubuntu系统
-
配置NDK环境(用于编译到安卓平台)
-
下载FFmpeg源代码
-
编译FFmpeg
我列了几个重要的点,读者可以跟随节点一点点实现(作者用的是mac系统,下面一些软件展示的界面可能和window的不一致,但是无伤大雅)。
-
搭建Ubuntu系统
我这里是通过VMware虚拟机创建的Ubuntu系统,我下载的是:VMware-Fusion-11.5.1-15018442.dmg版本的,这个版本影响应该不大,朋友们可以自行选择,安装之后需要填写序列号,我这里有个现成的:7HYY8-Z8WWY-F1MAN-ECKNY-LUXYX,但是后来VMware提示我升级到最新版就是免费的,叫我升级(我下载的时候你不告诉我?)
VMware下载地址
下载好了之后我们还需要下载Ubuntu的镜像(就是ubuntu系统),我的版本是:ubuntu-19.10-desktop-amd64。
Ubuntu下载地址
好了,俩个下载之后,我们打开VMware,然后把ubuntu的镜像拖到VMware中,大概走下面这个流程
走完这五步之后,接下来等待系统安装完毕即可,时间可能几个小时以上,中途可能会下载东西,请保证网络流畅。
安装完成之后,我们输入密码就可以进入系统,Ubuntu系统桌面如下:
然后我们需要使用一些命令行来安装一些系统需要的软件包,apt-get是Linux系统控制软件升级安装的命令行,我们使用这些命令可以安装文件等,我们在控制台,快捷键:control + alt + t 打开控制台,依次输入下面命令行:
apt-get update
apt-get install yasm
apt-get install pkg-config
apt-get install gcc
如果提示权限不够,我们就在每个命令行前面添加 sudo 然后执行。
最后可以用过yasm --version等命令行查看是否安装成功,如下:
默认Ubuntu系统使用的是英文,想切换成中文显示和中文输入法的,往下看8个步骤。
上面是进行下载中文输入法语言包,大概100多m,需要等待,下载结束后,关闭这个页面,然后打开系统设置页面,找到如下:
上面这是设置系统显示的语言,不是输入法,然后再往下:
我这一步就显示了中文是因为我第五步完成后,重启系统了,语言就会切换过来,但是也可以第五六步一起做,第五步做完后,重新系统,会弹出下面:
提示了是否需要更改目录名称从英文到中文,可自行选择,然后我们看一下系统右上角:
至此,系统语言和输入法我们算是配好了,可以正常在浏览中输入了,这一步成功,可以开始下一步了。
-
配置NDK环境(用于编译到安卓平台)
搭建NDK的环境主要是为了能够将FFmpeg功能编译到安卓平台上进行使用,我这用的版本是:android-ndk-r19c。
NDK下载地址。
下载之后我们需要放在Ubuntu里面的解压,当然,在window或mac解压后拖入Ubuntu系统中也可以,我这里是放在根目录下新建的ndk文件夹中。
然后配置一下NDK的环境变量,我们按快捷键:control + alt + t
,打开命令行终端,输入:sudo vi /etc/profile,然后可能提示需要输入密码,就输入我们之前设置的系统密码即可,然后打开后可以看到如下:
,我们需要把刚才配置的NDK路径放在这个文件的末尾中,形如:
export NDK_HOME=/home/simpo/ndk/android-ndk-r19c
export PATH=$NDK_HOME:$PATH
这里需要注意的是,我上面说了我NDK放在了根目录的新建ndk目录下,但是我这里写的是/home/simpo/ndk/android-ndk-r19c,其实这里的simpo就是我们的用户名,这里是必不可少的,不然之后的编译会出现各种莫名其妙的问题(我都不想说了),android-ndk-r19c则是我们解压后的NDK文件,添加后,形如:
这里我们可能会遇到打错一个单词就删除不了情况,按delete或者上下左右都没作用,只是切换字母,我们可以按一下ESC,然后就可以控制上下左右了,需要删除某一个字母就把光标移动到字母上,然后按 : 再按字母d,再按enter,就删除这个字母,如果想删除一整行,光标就移动到这一行,然后按 : 再按字母dd,再按enter,就可以删除整行(要说为什么这么复杂,为什么不问问神奇的海螺呢?)。
做好之后,我们按 : 再按wq,就可以保存并退出了,退出之后再输入命令行:source /etc/profile,使之生效。那如何检测是否配置好了呢,我们可以再输入命令行:
echo $NDK
就会打印出刚才设置的NDK路径,再输入命令行:
ndk-build -v
如果终端打印如下:
那就恭喜你,配置成功了,可以进行下一步了。
-
下载FFmpeg源代码
关于FFmpeg的代码,我们可以从官网上进行下载,FFmpeg下载地址,这里我选的版本是:FFmpeg-n4.1.3.tar.gz。首先选择需要下载的系统,有三分,我这里选了Linux,点击下面红框部分:
然后往下滚动,点击下载,下载按钮如下:
下载我们文件其实不大,也就10m左右,解压后如下图:
这里就不再解释各个文件的作用了,然后把FFmpeg的整个代码放在Ubuntu系统中,到此这一步成功完成。
-
编译FFmpeg
终于到最后一步了,如果我们需要编译成到安卓平台的so文件,我们就按下面的步骤开始。
首先打开源代码目录,找到文件名为:configure,打开,并且找到如下部分:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
更改为:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
其实高版本中已经有了安卓的配置,上面的不替代其实也无妨,如果不懂的最好写上。
然后我们需要新建一个文件build.sh,注意是文件,不是文件夹,有的同学可能不知道怎么新建文件,我们可以打开终端,然后逐步cd到我们的FFmpeg源代码目录下,然后运行命令行:
touch build.sh
我们再看就发现生成了一个build.sh文件,然后双击打开,然后复制以下配置(只需要替换其中的ndk安装的路径即可),下面的配置对应的ndk版本是17,ffmpeg的版本是4.1.3,如果不懂编译配置的,最好ndk和ffmpeg的版本和我这里的保持一致,因为不同的版本都有不同的写法:
#!/bin/bash
export TMPDIR=../temp
NDK=/home/simpo/ndk/android-ndk-r17c
SYSROOT=${NDK}/platforms/android-23/arch-arm/
PLATFORM=${NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build
{
./configure \
--prefix=$PREFIX \
--target-os=android \
--arch=$CPU \
--enable-shared \
--enable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-symver \
--enable-cross-compile \
--sysroot=$SYSROOT \
--cross-prefix=$PLATFORM/bin/arm-linux-androideabi- \
--cross-prefix-clang=$PLATFORM/bin/arm-linux-androideabi- \
--extra-cflags="-I$SYSROOT/usr/include -isysroot $NDK/sysroot -I$NDK/sysroot/usr/include/arm-linux-androideabi" \
--extra-ldflags="-L$SYSROOT/usr/lib"
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
}
CPU=arm-v7a
PREFIX=../os
build
有时候遇到错误提示不要怕,拿去百度会有很多解答。
里面的NDK后面跟的内容,我们需要设置成我们安装的NDK位置,我们需要更改以下,我就是放在根目录下的新建ndk文件中,仍然需要注意的是,多了一个simpo是我们的用户名,这一个一定要写上!!!(作者被这个不起眼的问题折腾了很久)
然后保存后我们再打开终端,逐步到FFmpeg的根目录下,运行以下命令行:
chmod +x build.sh
这是给予文件权限,然后运行:
./build.sh
开始运行,等待10分钟左右不出意外就可以编译成功。有的朋友好奇为什么命令行这么写,这是shell的语法,包括我们的build.sh这文件内都是shell的语法,需要更多的了解请前往:
shell语法
编译成功后我们可以在FFmpeg的根目录下发现一个android文件夹,打开如下,会看见我们编译支持的cpu架构文件夹,接着进入,如下:
到这我们算是整个编译成功了,如果andorid平台需要使用FFmpeg的功能,就可以使用lib文件夹下面的so文件了,这里不做更多介绍。