本人最近在研究音频视频这一块,考虑到后期开发要加很多功能,决定使用ffmepg去做,看的网上的东西都是比较陈旧,新版的工具编译会存在不少问题,于是本人决定自己挖坑
本文采用的是ndk下编译,想采用CMAKE编译的参考文章CMAKE编译FFMEPG
首先下载源码,这个没什么好讲,ffmepg源码下载地址http://ffmpeg.org/download.html
x264下载地址:http://www.videolan.org/developers/x264.html(有墙,如下载不了的,一会我会上传一份到博客)
安装android studio 和ndk,本文用的ndk 是ndk-r12d,版本较新,API版本是android 7.0,为以后版本适配解决后患
https://developer.android.com/ndk/downloads/index.html(ndk下载地址)
打开ffmepg源码根目录,将ffmepg源码的configure文件打开,因为android系统不能识别libxxxxx-.so.xx这样的so库,所以我们需要将配置文件修改下,将一下内容:
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
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_VERSION='$(SLIBNAME).$(LIBVERSION)'
# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
编译x264:
本文采用x264和ffmepg分开编译的形式,
在x264源码根目录下创建build.sh
其代码如下:
export ANDROID_NDK=/Users/wenxi/Library/Android/sdk/ndk-bundle#ndk目录根据你的安装目录
export TOOLCHAIN=../../fftoolchain #toolchain 安装目录
export SYSROOT=$TOOLCHAIN/sysroot/
export PLATFORM=$ANDROID_NDK/platforms/android-24/arch-arm
export PREFIX=../android-lib #编译结果的目录
#生成toolchain目录,这一段可以在第一次运行后注释掉
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
--toolchain=arm-linux-androideabi-4.9 \
--platform=android-24 --install-dir=$TOOLCHAIN
#
./configure \
--prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
make -j8
make install
保存后,打开终端,cd到源码的根目录,执行chmod 777 build.sh(修改文件权限为可读可写可执行)
执行./build.sh编译就可以
这里需要注意的地方,Mac默认是不带yasm的,如果没有yasm会编译不过去,这时候只要安装yasm就可以
安装方法,终端下执行以下五个命令:
curl http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz >yasm.tar.gz
tar xzvf yasm.tar.gz
cd yasm-1.2.0
./configure
make
sudo make install
安装完以后再重新编译可以通过
编译ffmepg:
在ffmepg源码根目录下创建build.sh
代码如下:
##!/bin/sh
export ANDROID_NDK=/Users/wenxi/Library/Android/sdk/ndk-bundle#ndk目录根据你的安装目录
export PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$ANDROID_NDK/platforms/android-24/arch-arm
export PREFIX=../android-lib #编译结果的目录
build_one(){
./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--disable-static \
--enable-shared \
--cc=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl \
--disable-static \
--enable-shared \
--enable-version3 \
--enable-small \
--disable-vda \
--disable-iconv \
--disable-encoders \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-encoder=pcm_alaw \
--enable-encoder=pcm_mulaw \
--disable-muxers \
--enable-muxer=mov \
--enable-muxer=ipod \
--enable-muxer=psp \
--enable-muxer=mp4 \
--enable-muxer=avi \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=pcm_alaw \
--enable-decoder=pcm_mulaw \
--disable-demuxers \
--enable-demuxer=h264 \
--enable-demuxer=mov \
--disable-parsers \
--enable-parser=aac \
--enable-parser=ac3 \
--enable-parser=h264 \
--disable-protocols \
--enable-protocol=file \
--enable-protocol=rtmp \
--disable-bsfs \
--enable-bsf=aac_adtstoasc \
--enable-bsf=h264_mp4toannexb \
--disable-indevs \
--enable-zlib \
--disable-outdevs \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-ffserver \
--disable-debug \
--extra-cflags="-I/Volumes/Data/android-lib/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-L/Volumes/Data/android-lib/lib"
make -j4 install
}
build_one
这里需要注意下几个地方--extra-cflags选项为刚刚编译出来的x264的头文件所在路径,根据自己需要改的,--extra-ldflags为x264的lib所在路径ANDROID_NDK为ndk所在的路径,其他的功能根据自己需要删减,这里需要和老版本的ndk做出区别的地方在于,新版本的ndk目录和配置有明显的变化,比如:
老版本的教程里通常有
在新版里面已经不是4.6,本文的ndk是4.9,所以配置为:
export PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
老版里面大多数用的是:
export PLATFORM=$NDK/platforms/android-8/arch-arm
新版本里面已经没有android-8,这都是很老的版本了,我们直接用24
export PLATFORM=$ANDROID_NDK/platforms/android-24/arch-arm
还有一个最大的区别在于,老版本的ndk有这样的路径,
$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm \
注意到linux-x86_64这个文件夹,打开自己的ndk可以看到,自己的ndk已经改为了darwin-x86_64
于是把所有的linux-x86_64文件夹全部的路径全部改为darwin-x86_64,保存
最后改权限chmod 777 build.sh
执行./build.sh,就会看到在预设的目录里面有相对应的so库了,本文编译出来的so如图:
X264源码:http://download.csdn.net/detail/qq_25817651/9617292
后续补一个遇到的问题:
x264编译出来的库是libx264.so.148,注意啦,这个坑啊,android 系统不能识别这样的库,会引发库打开异常,研究了半天,终于尝试到解决的办法,(注意,此处不能直接改文件名解决,因为改文件名并不会直接改变库的名字)
解决办法,打开x264的 configure文件,将"SONAME=libx264.so.$API"这里改为"SONAME=libx2641.so"(soname就是编译生成so库的名称的意思,这个名字不能是libx264.so,因为x264编译的时候会生成一个libx2641.so的中间文件,会冲突)
这里改成:
最后,重新编译x264和ffmepg,注意要执行make clean 在两个脚本里了都添加这个命令就可以
这回生成的就是我们能用的so了:
编译好的库,我已经上传,测试能用:http://download.csdn.net/detail/qq_25817651/9617990