android ndk开发之一 编译ffmpeg

之所以要在linux下编译ffmpeg,是因为在windows下的坑很多,而且在linux下编译方便快捷。

安装

现在大部分的电脑都是windows,所以我们可以先装个虚拟机,装个linux系统,这里不详细说了,网上教程很多,这里我用的虚拟机是Oracle VM VirtualBox,系统则用的是Ubuntu,只要网速快,都不是问题。。。

配置

ffmpeg源码:https://ffmpeg.org/
ndk下载:http://www.androiddevtools.cn/
以上源码解压到你新建的目录下就可以了

去版本后缀

FFMPEG默认编译出来的库后缀是有加版本号的,这种Android上似乎是加载不了哇!别着急,稍微改改就成。将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)'

新建脚本

在你解压后的ffmpeg源码的根目录下新建一个build.sh文件(记住这是个脚本文件),脚本代码如下,你只需复制进你新建的build.sh文件了,旨在将ffmpeg编译成单个类库(参照http://blog.csdn.net/leixiaohua1020/article/details/47011021):

make clean

export NDK=/home/loften/ffmpeg/android-ndk-r13b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-14/arch-arm
export PREFIX=../ff-pure-onelib
build_one(){
  ./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \
--enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a" 
}

build_one

make
make install

$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/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 libpostproc/libpostproc.a libavdevice/libavdevice.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

cd ..

说明:

指定NDK目录:

export NDK=/home/loften/ffmpeg/android-ndk-r13b

指定编译工具链 :

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt

指定使用NDK Platform版本 :

export PLATFORM=$NDK/platforms/android-14/arch-arm
这里指定的ndk platform的路径(确保目录里存在),一定要选择比你的目标机器使用的版本低的,比如你的手机是android-23版本,那么就选择低于23的

指定编译后的安装目录

(可修改成你想要的目录)
export PREFIX=../ff-pure-onelib

— 以上几点都是根据您解压的ndk来配置的,细节方面的修改应实际根据您下载的ndk来查看配置就行了。

开始编译

  1. 打开终端,通过cd ~命令进入相对应的您解压的ffmpeg的根目录下
  2. 设置权限 chmod 777 build.sh
  3. 编译脚本 source build.sh
  4. 接下来就是等待了,等到成功了生成的文件都在/ff-pure-onelib文件夹里(或者您设置的目录下)
  5. 当然,编译过程中如果有遇到报错,就好好查看报错内容,一般都是找不到该目录下的文件,则需要您去查看ndk目录下是否存在该文件,没有的话则相对应的修改目录文件就行,比如:你配置了export PLATFORM=$NDK/platforms/android-14/arch-arm ,然而在编译过程中报错找不到android-14/arch-arm ,那你就得查看下/platforms目录下是否真的存在 android-14了,如果没有,就换成里面有的,以此类推,其他配置都一样,正常来说都可以编译成功的
  6. 如果出现错误,你改变build.sh代码后想继续的话,可以把make clean注释下,即 修改为 “#make clean”,然后继续 source build.sh 就可以继续编译了。

编译成功

最后把拿到的库文件测试下效果,写一个jni的程序调用下。 在android studio中就可以通过cmake来开心的玩耍了。。。。

编译带x264的ffmpge

x264下载:http://www.videolan.org/developers/x264.html
ffmpeg下载:http://www.ffmpeg.org/download.html

编译x264

在你解压后的x264源码的根目录下新建一个build.sh文件,具体内容如下:

NDK=/home/loften/Android/android-ndk-r13b
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one(){
 ./configure --prefix=$PREFIX \
--enable-static \    
--enable-shared \    
--enable-pic \    
--disable-asm \   
--disable-cli \    
--host=arm-linux \    
--sysroot=$PLATFORM \    
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi-
make clean
make -j4
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
  1. 打开终端,通过cd ~命令进入相对应的您解压的x264的根目录下
  2. 设置权限 chmod 777 build.sh
  3. 编译脚本 source build.sh
  4. 接下来就是等待了,等到成功了生成的文件都在/android文件夹里

你可能感兴趣的:(ffmpeg)