首页 > 系统 > Android > 正文

Ffmpeg编译Android库

2019-11-09 16:09:38
字体:
来源:转载
供稿:网友

说下自己的环境

win10 x64

VMware® Workstation 10.0.1 build-1379776

CentOS release 6.5

android-ndk-r10b

ffmpeg3.2.2

 

Step1

android-ndk-r10b的安装,超级简单,去官网按照自己的配置下载一个,然后放到你习惯的目录下(我直接放/home/android-build/目录下了)。最后export配置下就好了

export NDK_HOME=/home/android-build/android-ndk-r10b/

export PATH=$NDK_HOME:$PATH

Step2

到ffmpeg的官网下载最新的源码包http://www.ffmpeg.org/。并解压到你习惯的位置(我这里解压在/home/work/目录下)然后对他的配置文件稍作修改,原因是为了让编译出来的so库适合Android。

  这里主要是修改主目录下的configure文件,你也可以用vi编辑工具修改

  Vi /home/work/ffmpeg-3.2.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)'

这里无脑改即可,不需要做其它修改。

Step3

这步卡死了枭雄无数,关键在于网上很多说明不是很详细;其实就是一个configure的参数(至于参数的意思自己–help查看哈),ffmpeg的参数比较多根据个人的不同要求可以有不同的配置,网上很多写成*.sh的文件都是可以用的,只不过不清楚里面几个变量的意思含义的话很容易报错卡这里。我也是在这里卡了好一会,感谢github上大神的详解,这里抄袭下:

1.指定临时目录 export TMPDIR=/home/work/ffmpeg-tmp 指定一个临时目录,可以是任何路径,但必须保证存在,ffmpeg编译要用;

2.指定NDK路径 NDK=/home/android-build/android-ndk-r10b

3.指定使用NDK Platform版本 SYSROOT=$NDK/platforms/android-16/arch-arm/ 这里指定的ndk platform的路径,一定要选择比你的目标机器使用的版本低的,比如你的手机是android-15版本,那么就选择低于15的

4.指定编译工具链 TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

5.指定编译后的安装目录 PREFIX=/home/work/ffmpeg-out/这个目录是ffmpeg编译后的so的输出目录,会有一个include和lib文件夹生成在这里,这也是我们之后要在android apk中使用的.

上面的1--5分析了半天,其他总的来说就是下面这个编译脚本中的前几行的内容,在ffmpeg主目录下面创建android_build.sh,并赋权限,该脚本中的内容如下:

#!/bin/bash

export TMPDIR=/home/work/ffmpeg-tmp

NDK=/home/android-build/android-ndk-r10b

SYSROOT=$NDK/platforms/android-16/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

CPU=arm

PREFIX=/home/work/ffmpeg-out/

ADDI_CFLAGS="-marm"

#--disable-static 如果不需要静态库,就把这个放在下面的函数中

function build_one

{

./configure /

--prefix=$PREFIX /

--enable-shared /

--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

Step4

给sh文件设置可执行权限并执行下sh文件,然后休息几分钟。。。幸运的话 就可以看到结果了。。。顺便提下上面有需要的目录都是需要你事先手动建好顺便把权限设置下。。。 ok,假设你一步步走到这里了。打开你sh文件里指定的放编译结果的目录,$PREFIX 目录下生成include和lib两个文件夹,将lib文件夹中的pkgconfig 目录和so的链接文件删除,只保留so文件,然后include和lib两个目录拷贝出来这就是我们想要的了。

本文主要参考 http://blog.csdn.net/xiaoru5127/article/details/51524795

结合自己的编译环境做了少量修改,如有侵权请及时联系


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表