之所以要在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来查看配置就行了。
开始编译
- 打开终端,通过cd ~命令进入相对应的您解压的ffmpeg的根目录下
- 设置权限 chmod 777 build.sh
- 编译脚本 source build.sh
- 接下来就是等待了,等到成功了生成的文件都在/ff-pure-onelib文件夹里(或者您设置的目录下)
- 当然,编译过程中如果有遇到报错,就好好查看报错内容,一般都是找不到该目录下的文件,则需要您去查看ndk目录下是否存在该文件,没有的话则相对应的修改目录文件就行,比如:你配置了export PLATFORM=$NDK/platforms/android-14/arch-arm ,然而在编译过程中报错找不到android-14/arch-arm ,那你就得查看下/platforms目录下是否真的存在 android-14了,如果没有,就换成里面有的,以此类推,其他配置都一样,正常来说都可以编译成功的
- 如果出现错误,你改变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
- 打开终端,通过cd ~命令进入相对应的您解压的x264的根目录下
- 设置权限 chmod 777 build.sh
- 编译脚本 source build.sh
- 接下来就是等待了,等到成功了生成的文件都在/android文件夹里
最后
以上就是背后寒风最近收集整理的关于android ndk开发之一 编译ffmpeg的全部内容,更多相关android内容请搜索靠谱客的其他文章。
发表评论 取消回复