ffmpeg编译
好多东西有现成折就拿来用吧。因为要用到一个视频编码的android软件,网上找,说这个比较好用,就下了。这个东西确实做的比较完整了。应当有人东西基本全有。首先,它可以编译出一个在android,linux下可用的命令行视频工具。andlroid linux与ubuntu之类的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