1. FFmpeg官网下载链接(推荐下载release的版本):Download FFmpeghttp://ffmpeg.org/download.html#releases
2. 下载压缩包,解压至自己想要的文件路径下即可。个人习惯用全英文路径,避免出现奇怪的问题。
3. Android Studio请预先下载好。点击AS右上角“SDK Manager”--“SDK Tools”,可在列表中找到ndk,不同版本的AS有默认的NDK版本,详见以下指导文章:
安装及配置 NDK 和 CMake | Android 开发者 | Android Developers (google.cn)https://developer.android.google.cn/studio/projects/install-ndk#apply-specific-versionAndroid Gradle 插件版本说明 | Android 开发者 | Android Developers (google.cn)https://developer.android.google.cn/studio/releases/gradle-plugin#compatibility-7-1-04. 同理,点击右上角“SDK Manager”--“SDK Tools”,可在列表中找到CMake,比如3.10.2版本。
5. 配置环境变量。在用户目录下创建配置文件( .bash_profile )。打开你的shell工具,执行:
- cd ~
- touch .bash_profile
- open -e .bash_profile
在编辑器中写入Android NDK路径等(请修改下述路径为你机器上的目标路径):
- export PATH=${PATH}:/Users/tao/Library/Android/sdk/tools
- export PATH=${PATH}:/Users/tao/Library/Android/sdk/platform-tools
-
- export NDK_ROOT=/Users/tao/Library/Android/sdk/ndk/21.4.7075529
- export PATH=${PATH}:${NDK_ROOT}
写完后保存并关闭该文件。执行更新环境变量命令:
source .bash_profile
可以使用 env 查看当前的所有环境变量。若不小心把路径写错了,则重新执行上述编辑、保存、更新等操作即可。
6. 修改FFmpeg文件夹下的configure文件。使用VS Code或者其它编辑软件打开configure文件。将以下代码进行修改:
- # origin code.
- # 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)'
-
- # added by tao.
- SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
- LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
- SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
- SLIB_INSTALL_LINKS='$(SLIBNAME)'
7. 请确定你要想要运行的目标Android设备的平台,例如 arm64-v8a。可使用以下命令获取你的Android设备的平台版本:
adb shell getprop ro.product.cpu.abi
8. 在该FFmpeg文件夹下创建编译脚本,可参考以下脚本(文件名自定义即可,例如 build_android.sh),请自行修改相应的参数(本人使用的测试设备是Redmi7,为arm64-v8a):
- #!/bin/bash
-
- NDK=/Users/tao/Library/Android/sdk/ndk/21.4.7075529
- TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
-
- API=28
-
- # 编译动态库:
- # enable-shared
- # disable-static
-
- # 编译静态库:
- # disable-shared
- # enable-static
-
- make clean
-
- function build_android
- {
- echo "Compile FFmpeg for $CPU start"
- ./configure \
- --prefix=$PREFIX \
- --disable-postproc \
- --disable-debug \
- --disable-doc \
- --disable-ffmpeg \
- --disable-ffplay \
- --disable-ffprobe \
- --disable-symver \
- --disable-doc \
- --disable-avdevice \
- --disable-static \
- --enable-shared \
- --enable-neon \
- --enable-hwaccels \
- --enable-jni \
- --enable-mediacodec \
- --enable-decoder=h264_mediacodec \
- --enable-decoder=hevc_mediacodec \
- --enable-decoder=mpeg4_mediacodec \
- --enable-hwaccel=h264_mediacodec \
- --cross-prefix=$CROSS_PREFIX \
- --target-os=android \
- --arch=$ARCH \
- --cpu=$CPU \
- --cc=$CC \
- --cxx=$CXX \
- --enable-cross-compile \
- --sysroot=$SYSROOT \
- --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
- --extra-ldflags="$ADDI_LDFLAGS"
-
- make clean
- make -j16
- make install
-
- echo "The Compilation of FFmpeg for $CPU is completed"
- }
-
- # note:
- # Redmi7(arm64-v8a)
-
- #armv8-a
- ARCH=arm64
- CPU=armv8-a
-
- CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
- CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
-
- SYSROOT=$TOOLCHAIN/sysroot
- CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
-
- PREFIX=$(pwd)/android/$CPU
- OPTIMIZE_CFLAGS="-march=$CPU"
-
- build_android
-
- # 交叉编译工具目录,对应关系如下
- # armv8a -> arm64 -> aarch64-linux-android-
- # armv7a -> arm -> arm-linux-androideabi-
- # x86 -> x86 -> i686-linux-android-
- # x86_64 -> x86_64 -> x86_64-linux-android-
9. 开始编译FFmpeg。执行(本人将该文件名命名为 build_android.sh):
./build_android.sh
10. 编译完成后,可在该FFmpeg文件夹下看到 android 文件夹(这是由步骤7中的 PREFIX 参数中定义的)。进入该文件夹,可以看到在 armv8-a 文件夹下有多个文件夹。include 文件夹下为头文件,lib 文件夹下为库(步骤7中编译的是动态库,即so库,若你想编译静态库,可自行修改脚本并重新编译)。
至此,编译完成。