之前一直在linux下编译FFmpeg,最近换电脑了,尝试了下在mac下编译ffmpeg,特记录之。
一. 准备工作
1. 下载FFmpeg。(http://ffmpeg.org/download.html#releases),看了下最新的是4.1.4,我用的是3.4.6。
2. 下载mac上使用的NDK。(https://developer.android.google.cn/ndk/downloads/index.html), 我用的是android-ndk-r14b-darwin-x86_64.zip,不推荐使用ndk-bundle,有些头文件在ndk-bundle里没有,遇到过一次。
3. 修改FFmpeg3.4.6目录下的configure文件。如果不修改的话之后编译生成的版本号会加在so的后面,会导致android不能识别,切记。
修改的内容如下,将:
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)'
4. 编写编译用的脚本文件。这个网上有很多,我找到了两个可以用的:
用于编译 armeabi-v7a、arm64-v8a、x86_64版本的:
#!/bin/bash echo "进入FFmpeg编译脚本" # NDK环境 export NDK=/Users/haiyuegao/Library/Android/android-ndk-r14b export SYSROOT=$NDK/platforms/android-21/arch-arm export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 PREFIX=android-build COMMON_OPTIONS="\ --prefix=android/ \ --target-os=android \ --enable-shared \ --enable-runtime-cpudetect \ --enable-small \ --disable-static \ --disable-debug \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-doc \ --disable-symver \ --disable-asm \ --disable-stripping \ --disable-armv5te \ " function build_android { echo "开始编译FFmpeg..." # armeabi echo "开始编译FFmpeg(armeabi)" ./configure \ --libdir=${PREFIX}/libs/armeabi \ --incdir=${PREFIX}/include/armeabi \ --pkgconfigdir=${PREFIX}/pkgconfig/armeabi \ --arch=arm \ --cpu=armv6 \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$SYSROOT \ --extra-ldexeflags=-pie \ ${COMMON_OPTIONS} make clean make -j8 && make install echo "结束编译FFmpeg(armeabi)" # armeabi-v7a echo "开始编译FFmpeg(armeabi-v7a)" ./configure \ --libdir=${PREFIX}/libs/armeabi-v7a \ --incdir=${PREFIX}/include/armeabi-v7a \ --pkgconfigdir=${PREFIX}/pkgconfig/armeabi-v7a \ --arch=arm \ --cpu=armv7-a \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$SYSROOT \ --extra-cflags="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" \ --extra-ldexeflags=-pie \ ${COMMON_OPTIONS} make clean make -j8 && make install echo "结束编译FFmpeg(armeabi-v7a)" # arm64-v8a echo "开始编译FFmpeg(arm64-v8a)" ./configure \ --libdir=${PREFIX}/libs/arm64-v8a \ --incdir=${PREFIX}/include/arm64-v8a \ --pkgconfigdir=${PREFIX}/pkgconfig/arm64-v8a \ --arch=aarch64 \ --cpu=armv8-a \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$SYSROOT \ --extra-ldexeflags=-pie \ ${COMMON_OPTIONS} make clean make -j8 && make install echo "结束编译FFmpeg(arm64-v8a)" # x86_64 echo "开始编译FFmpeg(x86_64)" ./configure \ --libdir=${PREFIX}/libs/x86_64 \ --incdir=${PREFIX}/include/x86_64 \ --pkgconfigdir=${PREFIX}/pkgconfig/x86_64 \ --arch=x86_64 \ --cpu=x86_64 \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$SYSROOT \ --extra-ldexeflags=-pie \ ${COMMON_OPTIONS} make clean make -j8 && make install echo "结束编译FFmpeg(x86_64)" echo "编译结束" }; build_android