四、 Ubuntu 18.04.4 交叉编译 FAAC 编码器
1 . 将下载的 FAAC 编码器源码拷贝到 Ubuntu 的 /root/rtmp 目录下 ;
2 . 解压源码 :
$ tar xvf faac-1.29.9.2.tar.gz
3 . 查看源码路径 : 该源码中也有 configure 脚本 , 用于配置生成 Makefile 文件 ;
root@octopus:~/rtmp# cd faac-1.29.9.2 root@octopus:~/rtmp/faac-1.29.9.2# ls aclocal.m4 ChangeLog compile config.h.in configure COPYING docs include install-sh ltmain.sh Makefile.in NEWS TODO AUTHORS common config.guess config.sub configure.ac depcomp frontend INSTALL libfaac Makefile.am missing README
4 . 查看 configure 帮助信息 : 执行 ./configure --help 命令 , 可以查看编译配置信息 ;
$ ./configure --help # 默认情况下, 编译 FAAC 时, 会同时编译静态库和动态库, Android 交叉编译推荐只编译静态库 --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] # Android 中使用动态库时, 必须指定 pic, 表示编码出与位置无关的代码段 --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both]
5 . 交叉编译工具链 :
① 其它开源库的惯例 : 在 FFMPEG 和 x264 交叉编译时 , 都指定了 --cross-prefix 交叉编译工具链前缀 ;
② FAAC 中指定交叉编译工具链的方法 : 在 FAAC 中没有提供该配置 , 那就只能通过环境变量设置 , 将交叉编译工具链的 gcc 设置成环境变量 ;
③ 解析说明 FAAC 中的环境变量 :
Some influential environment variables: # C 编码器命令行, 即 gcc, 这里可以直接指定交叉编译工具链的 gcc CC C compiler command # 指定传递给 gcc 的参数 CFLAGS C compiler flags # 传递给链接器的参数 LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> # 传递给链接器的库 LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> # C++ 编译器 CXX C++ compiler command # C++ 编译器参数 CXXFLAGS C++ compiler flags LT_SYS_LIBRARY_PATH User-defined run-time library search path. CPP C preprocessor CXXCPP C++ preprocessor
6 . 交叉编译脚本 : 写一个 Shell 脚本 , 辅助交叉编译 FAAC 静态库 ;
参考之前的 FFMPEG 和 x264 的 Shell 编译脚本 ;
版本注意事项 : 基于 android-17 版本进行编译, Android Studio 开发时可以将最小兼容版本配置到 17 ;
#!/bin/bash # NDK 根目录 NDK_ROOT=/root/NDK/android-ndk-r17c # TOOLCHAIN 变量指向 gcc g++ 等交叉编译工具所在的目录 TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 # 具体的交叉编译工具链前缀 CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi # gcc 编译器参数, 这里指定使用 android-17 版本的库进行编译 FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=17 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC" # 编译结果输出路径 # 注意这里不能使用 ./android/armeabi-v7a, 报错 error: expected an absolute directory name # 改成绝对路径, 或者使用下面的方法 PREFIX=`pwd`/android/armeabi-v7a # FAAC 中没有指定交叉编译工具链的选项, 只能在此处通过环境变量的方式进行指定 # 这里指定使用 android-17 版本的库进行编译 export CC="$CROSS_COMPILE-gcc --sysroot=$NDK_ROOT/platforms/android-17/arch-arm" # 指定 gcc 编译器的参数 export CFLAGS="$FLAGS" # 配置 Makefile 生成规则 ./configure \ --prefix=$PREFIX \ --host=arm-linux \ --with-pic \ --enable-shared=no # 清除之前的编译内容 make clean # 开启新的 FFMPEG 编译安装过程 make install
7 . 执行编译脚本 :
# 赋予 build.sh 脚本 执行权限 $ chmod -R 777 build.sh # 执行编译脚本 $ ./build.sh
8 . 编译完毕 :
root@octopus:~/rtmp/faac-1.29.9.2# ls aclocal.m4 build.sh compile config.h.in config.sub COPYING frontend install-sh ltmain.sh Makefile.in README android ChangeLog config.guess config.log configure depcomp include libfaac Makefile missing stamp-h1 AUTHORS common config.h config.status configure.ac docs INSTALL libtool Makefile.am NEWS TODO root@octopus:~/rtmp/faac-1.29.9.2# cd android/ root@octopus:~/rtmp/faac-1.29.9.2/android# tree . └── armeabi-v7a ├── bin │ └── faac ├── include │ ├── faaccfg.h │ └── faac.h ├── lib │ ├── libfaac.a │ └── libfaac.la └── share └── man └── man1 └── faac.1 7 directories, 6 files root@octopus:~/rtmp/faac-1.29.9.2/android#