Opus 交叉编译实现


简介

要将一个开源库移植到Android 上面,那么有一个重要的步骤就是要尝试的采用NDK交叉编译来编译,从而确定这个库是否能够移植到Android上面,如果能够交叉编译成功,后面的步骤
就是移植到Android Studio 中来编译,实现一个可以调试的NDK环境,所以这篇文章就是介绍在Ubuntu下面,采用Ndk 交叉编译最新版的Opus,

由于最新版的NDK 已经不能指定编译armeabi了,所以我们直接编译armv7-a的

环境准备

1.采用的是ubuntu16.04来编译
2.NDK采用的是android-ndk-r14b
3.下载Opus需要使用的库,具体可以参照官网的最新稳定介绍 https://www.opus-codec.org/downloads/
opus-tools 0.1.10 https://archive.mozilla.org/pub/opus/opus-tools-0.1.10.tar.gz
opusfile 0.9 https://archive.mozilla.org/pub/opus/opusfile-0.9.tar.gz
libopus 1.2.1 https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz
libogg-1.3.3 https://ftp.osuosl.org/pub/xiph/releases/ogg/libogg-1.3.3.tar.gz
flac-1.3.2 https://ftp.osuosl.org/pub/xiph/releases/flac/flac-1.3.2.tar.xz
openssl-1.0.2m https://www.openssl.org/source/openssl-1.0.2m.tar.gz

需要的文件结构图

目标

目标是我们要编译出opus-tools里面的可执行程序,然后放到手机里面跑,看是否能够正常工作,在此之前,我们可以先看下官网提供的opus-tools可执行的程序
这个是官网提供的最新版的 Window下的可执行程序下载地址 https://archive.mozilla.org/pub/opus/win64/opus-tools-0.1.10-win64.zip
下面了解他们是干嘛用的,提供了什么功能

压缩包文件内容

opusdec.exe是用来将一个opus文件还原成一个wav文件

opusenc.exe 是用来将一个wav文件,压缩成一个opus格式的文件

opusinfo.exe 可以用来显示一个opus文件的信息

交叉编译实现

构建交叉编译链

使用交叉编译链比较方便,下面是构建的脚本

#!/bin/bash

export ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b

$ANDROID_HOME/build/tools/make_standalone_toolchain.py \
   --arch arm --api 16 \
   --install-dir $ANDROID_HOME/toolchain

cd $ANDROID_HOME

mkdir -p usr/local/lib/pkgconfig

上述脚本执行之后的结果

编译 libogg-1.3.3

下面是脚本文件,这里构建一个静态库

#!/bin/bash
ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b

TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
PREFIX=$ANDROID_HOME/usr/local
LOCAL_DIR=$ANDROID_HOME/usr/local
TOOL_BIN_DIR=$ANDROID_HOME/toolchain/bin
PATH=${TOOL_BIN_DIR}:$PATH
DEST=$ANDROID_HOME/usr/local
#-march=CPU  按照特定的CPU进行优化
CC="$HOST-gcc -march=armv7-a"
CXX=$HOST-g++
#LDFLAGS="-L$DEST/lib 指定要连接库的时候,寻找的地方
LDFLAGS="-L$DEST/lib -march=armv7-a"
#CPPFLAGS="-I$DEST/include 指定头文件寻找的地方
CPPFLAGS="-I$DEST/include -march=armv7-a"
CXXFLAGS=$CFLAGS

# c-ares library build
  PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` 
--prefix=$PREFIX  --enable-static --disable-shared
  make
  make install

echo "build ogg complete!"

编译的结果为红色部分指定的

编译 flac-1.3.2,

下面是脚本文件,这里构建一个静态库

#!/bin/bash

ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
PREFIX=$ANDROID_HOME/usr/local
LOCAL_DIR=$ANDROID_HOME/usr/local
TOOL_BIN_DIR=$ANDROID_HOME/toolchain/bin
PATH=${TOOL_BIN_DIR}:$PATH
DEST=$ANDROID_HOME/usr/local
CC="$HOST-gcc -march=armv7-a"
CXX=$HOST-g++
LDFLAGS="-L$DEST/lib -march=armv7-a"
CPPFLAGS="-I$DEST/include -march=armv7-a"
CXXFLAGS=$CFLAGS

# c-ares library build
  PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` 
--prefix=$PREFIX  --enable-static --disable-shared
  make
  make install

echo "build flac complete!"

这里要知道的是编译flac库需要使用到ogg库,所以ogg库放在第一个编译,而且我们的 LDFLAGS=”-L$DEST/lib CPPFLAGS=”-I$DEST/include 指定了链接查找的地方,所以可以他可以自动的查找到
编译的结果为红色部分指定的

编译 libopus 1.2.1

下面是脚本文件,这里构建一个静态库

#!/bin/bash
ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b

TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
PREFIX=$ANDROID_HOME/usr/local
LOCAL_DIR=$ANDROID_HOME/usr/local
TOOL_BIN_DIR=$ANDROID_HOME/toolchain/bin
PATH=${TOOL_BIN_DIR}:$PATH
DEST=$ANDROID_HOME/usr/local
CC="$HOST-gcc -march=armv7-a"
CXX=$HOST-g++
LDFLAGS="-L$DEST/lib -march=armv7-a"
CPPFLAGS="-I$DEST/include -march=armv7-a"
CXXFLAGS=$CFLAGS

  PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` 
--prefix=$PREFIX
  make
  make install

编译的结果为红色部分指定的

编译 openssl-1.0.2m

下面是脚本文件

 #!/bin/bash
ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b

TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
PREFIX=$ANDROID_HOME/usr/local
LOCAL_DIR=$ANDROID_HOME/usr/local
TOOL_BIN_DIR=$ANDROID_HOME/toolchain/bin
PATH=${TOOL_BIN_DIR}:$PATH
DEST=$ANDROID_HOME/usr/local
CC="$HOST-gcc -march=armv7-a"
CXX=$HOST-g++
LDFLAGS="-L$DEST/lib -march=armv7-a"
CPPFLAGS="-I$DEST/include -march=armv7-a"
CXXFLAGS=$CFLAGS

  PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
./Configure --prefix=$PREFIX android
  make
  make install

编译的结果为红色部分指定的

编译 opusfile 0.9

下面是脚本文件

#!/bin/bash
ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
PREFIX=$ANDROID_HOME/usr/local
LOCAL_DIR=$ANDROID_HOME/usr/local
TOOL_BIN_DIR=$ANDROID_HOME/toolchain/bin
PATH=${TOOL_BIN_DIR}:$PATH
DEST=$ANDROID_HOME/usr/local
CC="$HOST-gcc -march=armv7-a"
CXX=$HOST-g++
LDFLAGS="-L$DEST/lib -march=armv7-a"
CPPFLAGS="-I$DEST/include -march=armv7-a"
CXXFLAGS=$CFLAGS

  PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` --prefix=$PREFIX
  make
  make install

编译的结果为红色部分指定的

编译 opus-tools 0.1.10

下面是脚本文件


#!/bin/bash
ANDROID_HOME=/home/yuhui/WorkSpace/android-ndk-r14b
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
PREFIX=$ANDROID_HOME/usr/local
LOCAL_DIR=$ANDROID_HOME/usr/local
TOOL_BIN_DIR=$ANDROID_HOME/toolchain/bin
PATH=${TOOL_BIN_DIR}:$PATH
DEST=$ANDROID_HOME/usr/local
CC="$HOST-gcc -march=armv7-a"
CXX=$HOST-g++
LDFLAGS="-L$DEST/lib -march=armv7-a"
CPPFLAGS="-I$DEST/include -march=armv7-a"
CXXFLAGS=$CFLAGS

PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` --prefix=$PREFIX
  make
  make install

要注意的是这个opus-tools 需要依赖opus库,ogg库,flac库 编译的结果为红色部分指定的

验证编译的结果

我们可以将编译之后产生的文件拷贝到手机里面,手机里面有一个目录可以不用root进入的,就是/data/local/tmp目录,这个目录是所有的手机都是可以访问的,所以选择放在这个目录
然后进入使用adb shell 进入命令行模式

push到手机的目录以及内容,这里是将整个local的内容push到手机上

opusinfo使用结果

opusdec使用结果

opusdec使用结果

将压缩之后,还有解压缩生成的文件,可以直接使用音乐播放器播放,qq音乐也是支持直接播放opus文件的,还有google浏览器也是支持的,我们可以根据这个来判断是否生成有问题

总结

至此,Opus交叉编译已经完成,接下来一篇文章会介绍怎么集成到Android Studio中,而且实现边录音边压缩,边解压缩边播放


文章作者: AheadSnail
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AheadSnail !
评论
  目录