ffmpeg编译ubuntu下编译为android可用lib.

ffmpeg编译

好多东西有现成折就拿来用吧。因为要用到一个视频编码的android软件,网上找,说这个比较好用,就下了。这个东西确实做的比较完整了。应当有人东西基本全有。首先,它可以编译出一个在androidlinux下可用的命令行视频工具。andlroid linuxubuntu之类的linux区别是相当大,因为其lib库与ubuntu之类的完全不同,因ubuntu在类的库都是相近的,并且是可选安装的。android 的库因为适应与手机的性能,东西小,级别的,随手机的性能提高向ubuntu功能靠近,但他们还是走上了两个不同的路线。要编译ffmepg并在手机android下可用。需要
1,android NDK ,
我选反是r10e.其内有关于android版本的选择。

2,FFmpeg 这个我下载的是,3.3.6版本的

3, ubuntu系统,这个我选的是VMware,下安装12.04版本的。

4,手机android这个是一个旧手机,android2.3性能差,所以上边的全选的不是最新版的。

第一步:

建目录把两个源码copy进去。目录与最后的编译脚本中的一些路径有关。

第二步

编写脚本,下边是我参考网上修改的一个,编出的是android的ffmpeg.so,3.8MB 只有MPEG4的编解码功能。脚本放在ffmpeg的根目录。

#!/bin/bash

make clean

下面的路径与源码路径相关

exportNDK=/AndroidDisk/NDK-android/android-ndk-r10e

exportSYSROOT=$NDK/platforms/android-9/arch-arm/

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

export CPU=arm

export PREFIX=$(pwd)/android/$CPU

export ADDI_CFLAGS="-marm"

rm -r $PREFIX

./configure --target-os=linux \

--prefix=$PREFIX --arch=arm \

--disable-doc \

下需两个只能enable一个,如果是分成多个so,与现在的换一下。

--disable-shared \

--enable-static \

--disable-yasm \

--disable-symver \

--disable-gpl \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-avdevice \

--disable-debug \

--disable-everything \

--enable-decoder=mpeg4 \

--enable-encoder=mpeg4 \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-\

--enable-cross-compile \

--sysroot=$SYSROOT \

编译的选项参考GCC参数

--extra-cflags="-Os -fpic$ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make

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\

下面的包数量与功能选择有关。因为包只有4MB了所以就所加了。这里加不加内容相应的在configure里要enable或者disable.要不报找不到引用的错误。Configure生成了一些宏定义,从面上代码编译出的东西不一样。

        libavcodec/libavcodec.a \

        libavfilter/libavfilter.a \

         libswresample/libswresample.a \

        libavformat/libavformat.a \

        libavutil/libavutil.a \

        libswscale/libswscale.a \

       -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \

       $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.8/libgcc.a

补充说明:

网上有说如下的说法。但我实际感觉这个不是必须的。可能是configure自动配置脚本版本不同的原因,也有说需要定义一个temp目录的,但我在自已的脚本中也没定义。但如下的修改我是做了。因为在调别的不确定错误时,只能先改了试,后面也就没改回去。

 

然后更改文件configure里面的第3305行内容:

才能然生成的动态库是已.so结尾的,因为Android里面只认识.so结尾的库

#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)' 

提示我们要用屏蔽yasm才能执行,所以加上参数后的编译命令是:

./configure

./configure --disable-yasm

你可能感兴趣的:(普通)