今天花了很长的时间,边网上搜索资料,边操作电脑,终于在Linux系统下把ffmpeg编译成功了。 我用的是Windows10系统,装的虚拟机和ubuntu14.03系统。尽管网上有很多资料,我也参考了很多资料。 我觉得还是必须把今天的成果记录下来。以后要再编译的话就可以直接照葫芦画瓢了。
- 第一步:下载linux版本的ndk,下载地址我使用的是http://wear.techbrood.com/tools/sdk/ndk/,下载的版本是android-ndk32-r10b-linux-x86_64.tar.bz2。下载到linux系统中,比如我放在/home/ldm/Downloads文件夹下,然后直接解压成android-ndk-r10b文件夹。并配置NDK的环境变量(linux系统这种说法不知道对不对),终端执行:
export NDK_HOME=/home/ldm/Downloads/android-ndk-r10b
export PATH=$NDK_HOME:$PATH
- 第二步:下载ffepeg资源工具包,下载地址非官网莫属:https://ffmpeg.org/ 。我选择了最新版本:ffmpeg_3.2.orig.tar.xz,对应地址是:https://launchpad.net/ubuntu/+source/ffmpeg/7:3.2-2,同样下载到/home/ldm/Downloads文件夹下,然后解压后,文件夹名为ffmpeg-3.2。
下载页面图:
下载后linux下文件目录图:
- 第三步:为了让编译出来的so库适合Android,对下载的ffmpeg的配置文件configure进行修改:
vi /home/ldm/ffmpeg-3.2/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)'
修改好之后保存即可。
#!/bin/bash
export TMPDIR=/home/ldm/Downloads/android_ffmpeg
NDK=/home/ldm/Downloads/android-ndk-r10b
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=/home/ldm/Downloads/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
cpu=arm
PREFIX=/home/ldm/Downloads/arm
ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-doc \ --disable-symver \ --enable-small \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
文件内容相关介绍:
指定临时目录:指定一个临时目录,可以是任何路径,但必须保证存在,ffmpeg编译要用;
export TMPDIR=/home/ldm/Downloads/android_ffmpeg
指定NDK路径
NDK=/home/ldm/Downloads/android-ndk-r10b
3.指定使用NDK Platform版本:这里指定的ndk platform的路径,一定要选择比你的目标机器使用的版本低的,比如你的手机是android-15版本,那么就选择低于15的
SYSROOT=$NDK/platforms/android-16/arch-arm/
指定编译工具链
TOOLCHAIN=/home/ldm/Downloads/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
指定编译后的安装目录:这个目录是ffmpeg编译后的so的输出目录,会有一个include和lib文件夹生成在这里,这也是我们之后要在android apk中使用的.
TOOLCHAIN=/home/ldm/Downloads/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
保存android_arm.sh文件。
5.第五步:执行android_arm.sh文件等结果:
进入到文件所在的目录/home/ldm/Downloads/ffmpeg-3.2下,执行:
./android_arm.sh
等待了不到10分钟,结果就出来了。在arm文件夹下生成了includ及很多.so库文件,这就是我需要的.so库文件,如图:
最后将lib文件夹中的 pkgconfig 目录和so的链接文件删除,只保留so文件,然后将include 和lib两个目录一起copy到自己项目下去编译即可。
参考学习网址:https://github.com/dxjia/ffmpeg-compile-shared-library-for-android