在研究Ubuntu下编译FFmpeg的时候,参考过很多大神写的博客。虽然网上很多大神的教程,但是我还是自己整理一下,方便自己和朋友使用。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我参考的文章步骤如下:
配置信息:
FFmpeg版本:ffmpeg-3.0.1
ubuntu版本:ubuntu kylin 14.04
Android NDK版本:android-ndk-r10b
一、配置编译环境和下载源码
a、安装Ubuntu14.04操作系统
b、sudo passwd root 配置root权限
c、sudo apt-get update 升级apt-get
d、sudo apt-get install Git –y 安装git版本工具
e、sudo apt-get install bison gcc-multilib g++-multilib -y 安装bison,gcc,g++编译工具
f、mkdir /home/AndroidNDK 新建一个NDK目录
在https://developer.android.com/ndk/downloads/index.html#download网站上NDK下载下来,复制到AndroidNDK目录下解压。
g、sudo apt-get install vim –y 安装vim文本编辑器
h、Vim /home/主机名/.profile 配置ndk环境变量,在文件末尾加入:
- 1
- 2
- 1
- 2
保存退出
i、source /home/主机名/.profile 使修改文件生效
j、Echo $NDK_HOME 如果输出环境变量值,则表示配置成功。
注:在FFmpeg官网下载FFmpeg源代码,复制到ndk的source目录下也可以使用git命令获取:git clone git://source.ffmpeg.org/ffmpeg.git /home/Hadoop/AndroidNDK/android-ndk-r10b/sources/FFmpeg
二、编译FFmpeg
A、第一种编译脚本
(1)、首先,我们需要进入FFmpeg源代码中对configure文件进行修改,目的是为了不生成版本号,因为android平台识别不了!
将:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
修改为:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
(2)、然后在FFmpeg源码目录下新建一个build_ffmpeg.sh脚本文件,将下面代码的复制进去。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
之后打开命令行终端,输入以下命令:
- 1
- 2
- 1
- 2
执行完必之后就会在你的当前android/lib目录下生成下列文件:
红色标记出来的文件是连接文件,可以删除掉。
B、第二种编译脚本
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
这种脚本是将第一种方法中的各类so文件打包成了一个文件。并且也不需要修改configure文件中的配置,当然你改了也无妨,这种生成的文件是xxx.a文件,如下图:
在build_one()方法中倒数第三行,配置了–enable-static –disable-shared 与第一种不同的是将两个值进行了对调。当然你也可以说对两个值的修饰符进行了对调。
-----------------------------------------------------------------------------------------------------------------------------------------------------
总结:
按照上面的方法一确实是可以编译成功多个so文件。按照方法二 确实是可以变成成多个.a的文件,但是不能聚合方法一所有的so为一个so文件。我是个执着的人,于是有去研究怎么样生成一个单独的so的方法,功夫不负有心人,最后我还是找到了编译成一个单独的so文件的方法了。
生成一个单独so文件的编译脚本:
#!/bin/bash
NDK=/home/lx/Downloads/android-ndk-r13b
SYSROOT=$NDK/platforms/android-19/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=arm
ARCH=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
#配置
./configure \
--prefix=$PREFIX \
--arch=$ARCH \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--extra-ldflags="$ADDI_LDFLAGS" \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--target-os=linux \
--enable-cross-compile \
--enable-gpl \
--disable-shared \
--enable-static \
--disable-doc \
--disable-debug \
--enable-small \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
$ADDITIONAL_CONFIGURE_FLAG
#编译
make clean
make -j4
make install
#打包
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
libpostproc/libpostproc.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
#strip
$TOOLCHAIN/bin/arm-linux-androideabi-strip $PREFIX/libffmpeg.so
如果编译提示文件目录找不到,可以检查ndk的配置是否正确。以下三行配置很重要,一定要仔细核对层级和文件是否都存在:
#配置NDK路径
export NDK=/home/hadoop/AndroidNDK/android-ndk-r10b
#配置工具链
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt
#配置平台
export PLATFORM=$NDK/platforms/android-8/arch-arm
-------------------------------------------------------------------------------------------------------------------------------------------
欢迎关注公众号: