【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月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
7月前
|
编解码 Android开发 数据安全/隐私保护
Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
好多开发者可能疑惑,外部数据实时预览播放,到底有什么用? 是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设备输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或部分智能硬件设备,回调出来的H.264/H.265数据,除了想转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至对数据做二次处理(视频分析、实时水印字符叠加等,然后二次编码),基于这样的场景诉求,我们开发了Android平台外部编码数据实时预览播放模块。
|
7月前
|
编解码 Android开发
Android native层实现MediaCodec编码H264/HEVC
Android平台在上层实现mediacodec的编码,资料泛滥,已经不再是难事,今天给大家介绍下,如何在Android native层实现MediaCodec编码H264/HEVC,网上千篇一律的接口说明,这里不再赘述,本文主要介绍下,一些需要注意的点,权当抛砖引玉,相关设计界面如下:
133 0
|
1月前
|
Ubuntu 网络协议 Java
在Android平板上使用code-server公网远程Ubuntu服务器编程
在Android平板上使用code-server公网远程Ubuntu服务器编程
|
2月前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
57 0
|
3月前
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
|
7月前
|
编解码 Android开发 开发者
Android平台GB28181设备接入模块如何实现实时视频和本地录像双码流编码
我们在做Android平台GB28181设备接入模块的时候,遇到这样的场景,比如执法记录仪或智慧工地等场景下,由于GB28181设备接入模块,注册到国标平台后,平时只是心跳保持,或还有实时位置订阅,查看视频的时候,是按需看,而且有时候,网络环境并不是太好,所以,催生了这样一个诉求:部分开发者希望能本地录像的时候,录制高分辨率(比如1920*1080),国标平台侧发起实时视频查看请求的时候,上传低分辨率(如1280*720)数据,有点类似于IPC的主码流和子码流。
|
7月前
|
编解码 Android开发 数据安全/隐私保护
Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放
我们在对接开发者的时候,遇到这样的诉求:除了正常的RTMP、RTSP直播播放外,有些硬件设备输出编码后(H.264/H.265)的数据,比如无人机或类似硬件产品,回调出来的H.264/H.265数据,除了正常转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至重新对数据做二次处理,基于这样的场景诉求,我们开发了外部编码后数据实时预览播放模块。
|
7月前
|
编解码 监控 网络协议
Android平台GB28181设备接入侧(编码前|编码后|RTSP|RTMP)支持功能浅析
在之前,我有写过Android平台GB28181设备接入模块的好多blog,包括参数设置、功能支持与扩展等,以数据接入为例,支持的数据类型涉及编码前、编码后或直接流数据(RTSP或RTMP流)。可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。
118 0
|
7月前
|
编解码 Android开发 数据安全/隐私保护
Android平台GB28181设备接入端对接编码前后音视频源类型浅析
今天主要对Android平台GB28181设备接入模块支持的接入数据类型,做个简单的汇总: 1. 编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型),其中,Android平台前后摄像头数据,或者屏幕数据,或者Unity拿到的数据,均属编码前数据; 2. 编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据); 3. 拉取RTSP或RTMP流并接入至GB28181平台(比如其他IPC的RTSP流,可通过Android平台GB28181接入到国标平台)。