【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )(二)

简介: 【Android RTMP】音频数据采集编码 ( 音频数据采集编码 | AAC 高级音频编码 | FAAC 编码器 | Ubuntu 交叉编译 FAAC 编码器 )(二)

四、 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 . 编译完毕 :

image.png



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#



目录
相关文章
|
1月前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
27 1
|
19天前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
27 2
|
1月前
|
数据库 Android开发
Android 通过升级SettingsProvider数据强制覆盖用户的设置项
Android 通过升级SettingsProvider数据强制覆盖用户的设置项 【5月更文挑战第7天】
39 5
|
1月前
|
JSON Android开发 数据格式
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
34 2
|
1月前
|
Java Linux API
统计android设备的网络数据使用量
统计android设备的网络数据使用量
31 0
|
15天前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
13 1
|
19天前
|
XML 存储 JavaScript
50. 【Android教程】xml 数据解析
50. 【Android教程】xml 数据解析
17 1
|
1月前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
27 3
|
1月前
|
XML JSON API
转Android上基于JSON的数据交互应用
转Android上基于JSON的数据交互应用
19 1
|
1月前
|
Ubuntu Linux 开发工具
建立ubuntu下基于eclipse的android开发环境
建立ubuntu下基于eclipse的android开发环境
14 1