FFmpeg4Android:FFmpeg编译(Windows + Linux)

2 FFmpeg4Android:FFmpeg编译(Windows + Linux)

各操作系统编译环境介绍:

  • Windows:需要用到MinGW+msys或Cygwin;
  • Linux(推荐):有现成的命令可使用,省去很多麻烦(Windows下可装虚拟机或买云主机);
  • Mac:与Linux类似。

在2.1节与2.2节分别介绍Windows下与Linux下的编译,看官可以自行选择查看。

2.1 在Windows环境下编译FFmpeg

这里我使用的Windows编译环境为:
开发工具:Android Studio 2.3.2
操作系统:Win7 64位
编译工具:MinGW + msys
NDK版本:r12b
FFmpeg版本:3.3.6

说明:ffmpeg2.x版本要用NDK r11以下的版本来编,ffmpeg3.x以上的版本一般用r12以上的NDK来编,具体的对应关系还有待研究

2.1.1 安装编译工具(MinGW+msys)

step 1:下载MinGW,并安装,我这里安装的目录为D:/MinGW;
安装完成后弹出一个MinGW安装管理器,如下图:

image.png

选中左边的"Basic Setup",在右边选择要安装的编译工具:

下述"勾选"对应的操作为:点击该选择Mark for Installation

  • mingw-devoloper-toolkit:MinGW可用的msys,勾选;
  • mingw32-base:基本MinGW,勾选;
  • mingw32-gcc-ada:Ada(一种程序设计语言)编译器,不选;
  • mingw32-gcc-fortran:FORTRAN编译器,不选;
  • mingw32-gcc-g++:c/c++编译器,勾选;
  • mingw32-objc:Objective-c编译器,不选;
  • msys-base:msys,选上则不需要另外安装,勾选;

当然,嫌麻烦可以全选上,但是不能少选。
选好后,点击工具栏Installation->Apply Changes,即可安装。

step 2:配置环境变量
添加:D:\MinGW\msys\1.0\bin与D:\MinGW\bin到系统Path变量。

step 3:打开MinGW

打开目录D:/MinGW/mysys/1.0下的msys.bat,弹出如如命令窗口,一会我们会在这里输入命令进行编译。


image.png

到此,MinGW与msys就安装好了。

2.1.1 下载、安装NDK

step 1:下载NDK,我这里是android-ndk-r12b版本,解压到D:\ndk,可不配置环境变量。

2.1.2 下载FFmpeg源码、编写编译脚本

step 1:下载ffmpeg源码,我这里下载的是ffmpeg-3.3.6版本,解压到D:\ffmpeg目录。

image.png

step 3:下载FFmpeg源码之后,首先需要对源代码中的configure文件进行修改。由于编译出来的动态库文件名的版本号在.so之后(例如“libavcodec.so.5.100.1”),而android平台不能识别这样文件名,所以需要修改这种文件名。在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)'

step 3:在当前目录下新建一个build_android.sh脚本文件
内容为:

#!/bin/bash
make clean
export NDK=D:/ndk/android-ndk-r12b
export SYSROOT=$NDK/platforms/android-18/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
  • 对于NDK=D:/ndk/android-ndk-r12b,如果不是这个目录的,改成自己的目录;
  • 对于TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64,这里是用windows版本,如果是在linux下编译要写windows-x86_64。

2.1.3 编译.so文件

cd到ffmpeg目录下,运行脚本./build_android.sh,回车后没有任何反应,不要惊慌,其实脚本正在运行,等待一段时间会有信息输出。


image.png

如果运行./build_android.sh后报找不到configure.mak,可以先运行./configure --disable-yasm

大约2、3分钟后会开始编译。


image.png

再过大约10-20分钟后编译成功,可以看到在D:\ffmpeg\ffmpeg-3.3.6下生成了一个android目录,里面就是我们要的.so文件。


image.png

如果运行脚本时出错,一般是你的脚本不对或格式有问题,可以自行baidu解决。

2.2 在Linux环境下编译FFmpeg

这里我使用的编译环境为:
开发工具:Android Studio 2.3.2
操作系统:Ubuntu 16.04 64位
NDK版本:r10e
FFmpeg版本:2.6.9
当然也可以用高版本:
NDK版本:r12以上
FFmpeg版本:3.x以上

说明:ffmpeg2.x版本要用NDK r11以下的版本来编,ffmpeg3.x以上的版本一般用r12以上的NDK来编,具体的对应关系还有待研究

2.2.1 下载、安装NDK

step 1:下载NDK,我这里是android-ndk-r10e版本,并解压到/usr/ndk/。

step 2:配置NDK环境变量:
打开配置文件:vim ~/.bashrc(没装vim的“sudo apt-get install vim-gtk”安装一下,如果 安装出错,且看下面的补充),按i切换输入模式,在文件末尾添加

export NDKROOT=/usr/ndk/android-ndk-r10e
export PATH=$NDKROOT:$PATH

按ESC退出回到命令模式,再按shift + zz(即:ZZ), 保存修改。
更新环境变量:source ~/.bashrc
输入ndk-build -version命令,如果出现如下信息,说明NDK安装成功。


image.png

补充:linux基本命令与vim安装、配置
1)linux基本命令介绍
进入编辑模式,i
进入命令模式,Esc
命令模式:
shift + :退出;q!强制退出;
shift + z z保存退出;
x删除,dd删除行;
2)vim安装:apt-get install vim-gtk
对于用虚拟机或云主机编译,并第一次使用apt-get install命令,可能会报错,需apt-get update更新一下仓库,再apt-get install vim-gtk安装即可。
可能还会报用户名不正确等奇怪的错,不用怕,这些都比较简单,自行百度解决即可。
3)vim配置
vim安装好后,vim /etc/vim/vimrc打开配置文件,在文件末尾添加如下配置:
set nu //行号显示
set tabstop=4 //tab为4空格(默认为8个)
set cursorline //高亮显示光标所在行
set ruler //右下角显示光标坐标

2.2.2 下载FFmpeg源码、编写编译脚本

step 1:下载ffmpeg源码,我这里下载的是ffmpeg-2.6.9版本,unzip ffmpeg-2.6.9.zip解压到ffmpeg-2.6.9目录(unzip用sudo apt-get install unzip命令安装)。

step 2:下载FFmpeg源码之后,首先需要对源代码中的configure文件进行修改。由于编译出来的动态库文件名的版本号在.so之后(例如“libavcodec.so.5.100.1”),而android平台不能识别这样文件名,所以需要修改这种文件名。在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)'

step 3:在当前目录下新建一个build_android.sh脚本文件
内容为:

#!/bin/bash
make clean
export NDK=/usr/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

在这个脚本前面,配置了三个变量(NDK、SYSROOT、TOOLCHAIN),都是指定好NDK的一些工具,目录的,NDK指定自己所用的NDK安装路径。要注意的是在:SYSROOT里面,我编译的platform是android-9的(过高的版本编译ffmpeg2.x会报错,3.x可用android-19),因为NDK对platform有时会有一些影响的,做过深入的NDK开发的同学应该清楚,所以这个要看具体的需要进行更改什么的。

  • --enable-static --disable-shared:这两个是看编译出来的库是静态库(.a)还是动态库(.so),如果要编译成动态库就--enable-shared --disable-static,或者两个都编译出来。
  • --disable-ffmpeg:不要ffmpeg这个工具,ffmpeg是一个命令行工具,非常强大,在官网也可以看到,但我们通过代码开发,就不需要它了
  • --disable-ffplay --disable-ffprobe --disable-ffserver:这些都是不需要的工具,当然也可以编译出来看看
  • --disable-avdevice:这个库是用来操作一些硬件设备的,如摄像头这些,但Android中感觉不需要它,也可以编译出来试试能不能使用在Android上
  • --disable-doc:取消文档
  • --disable-symver:禁用 symbol versioning
  • PREFIX=(pwd)/android/CPU:指定编译成功的库所在的目录,这个配置是:当前目录下的android目录下的指定的cpu平台目录下

动态库与静态库:

动态库就是只要Android设备里面有公开这个so,那APP就可以使用,就是只要一次安装,其他APP就可以使用了,但APP打包进去的so都是在当前APP的私有目录下的,不能被其他APP使用的,所以动态库的优势就没有了, 而且就暴露了它的缺点,就是so非常大的时候,就会形成Apk包非常大。
静态库就是会把需要的代码打包到自己的so里面,所以这样子就可以解决动态库上面的那个缺点
所以这里我们编译出来的是静态库,因为编译出来的库有50多M,所以使用静态库的方式,可以使打包出来的apk最小化。

2.2.3 编译.so文件

接下来输入命令:./build_android.sh。

如果build_android.sh文件是在Windows下创建的,编译会报错,报错的原因是因为编码格式问题,解决方式:
1)用Notepad++打开设置成“utf-8 无BOM”格式,然后上传到Linux,并用doc2unix工具(sudo apt-get install doc2unix命令安装)对脚本格式进行转换:doc2unix build_android.sh;
2)在Linux环境下创建.sh文件,传输到Windows下修改文件内容,再上传到Linux。

因为编译是比较耗时的,编译个20分钟是很正常的,电脑性能好的,会快点,差的可能半小时都正常。
经过一段时间的编译,我们就可以在脚本里面定义的那个目录里面看到编译成功的库了。在当前目录下就会有一个android的目录,点进里面后,就会看到编译成功的库了,如下图:


image.png

可以看到有16个.so文件,有带数字与不带数字的,我们要用的是带数字的,共8个,这些数字是类似与版本号的东西,ffmpeg3.x编出来的.so文字数字会大些。

这样,我们就把ffmpeg2.6.9编译好了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容