盒子
盒子
Posts List
  1. 前言
  2. 编译 opencore-amr

编译 opencore-amr for iOS

作者Talent•C
转载请注明出处

前言

最近好多人跟我反馈,我2年前写的关于SoundTouch的Demo,随着 xcode 版本的升级出现了一个问题就是不支持 bitcode, 最近正好项目上线了,时间比较充裕决定把它搞搞,将其下载下来分析看看发现主要有三个库不支持 bitcode, 分别是 lame(mp3音频格式编码库)opencore-amr(amr音频格式编/解码库两个库)

关于 bitcode 的相关介绍我之前就有过介绍以及如何支持 bitcode,点击这里查看。上面我提到 opencore-amr(amr音频格式编码库) 不支持 bitcode, 那么就需要将其重新编译,网上有很多关于编译 opencore-amr(amr音频格式编码库) 的文章,但几乎都不能正确编译,今天我们就自己动手试着编译 opencore-amr 库。

可能有人会说 iOS 本身是不支持 amr格式音频的, 为什么我们还在用?
amr 由欧洲通信标准化委员会提出,是在移动通信系统中使用最广泛的语音标准。他是被各大手机厂商认可的一种保存手机录音的格式。由于 amr 文件容量很小,因此即便是长达一分钟的音频文件,也能符合中国移动现行的彩信不超过50KB容量的技术规范,所以 amr 也是实现在彩信中加载人声的唯一格式。但是受体积所限,amr 在音质方面不太乐观。
摘自百度百科

由此可见,当我们的app 需要传递音频文件时,在不要求高音频质量是使用 amr 格式的音频会大大降低网络带宽使用量,减少通讯时间,提高app使用体验

编译 opencore-amr

opencore-amr 源码下载。 目前官网最新版本是 0.1.5,本文使用的版本为最新版本。

将下载好的源码放在桌面(任何地方都可以,只要你能找到就可以),源码有了,下一步就是编译这个库了,我们使用脚本来编译。
注: 本文使用的脚本来自网络,脚本部分内容被修改

在电脑中新建一个文件命名为 build_ios.sh,并将如下内容拷贝至文件中。文章结尾有完整文件下载链接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/sh
### Modified from http://blog.csdn.net/favormm/article/details/6772097
set -xe
DEVELOPER=`xcode-select -print-path`
DEST=`pwd .`"/opencore-amr-iOS"
ARCHS="i386 x86_64 armv7 armv7s arm64"
LIBS="libopencore-amrnb.a libopencore-amrwb.a"
# Note that AMR-NB is for narrow band http://en.wikipedia.org/wiki/Adaptive_Multi-Rate_audio_codec
# for AMR-WB encoding, refer to http://sourceforge.net/projects/opencore-amr/files/vo-amrwbenc/
# or AMR Codecs as Shared Libraries http://www.penguin.cz/~utx/amr
mkdir -p $DEST
./configure
for arch in $ARCHS; do
make clean
IOSMV=" -miphoneos-version-min=6.0"
case $arch in
arm*)
if [ $arch == "arm64" ]
then
IOSMV=" -miphoneos-version-min=7.0"
fi
echo "Building opencore-amr for iPhoneOS $arch ****************"
PATH=`xcodebuild -version -sdk iphoneos PlatformPath`"/Developer/usr/bin:$PATH" \
SDK=`xcodebuild -version -sdk iphoneos Path` \
CXX="xcrun --sdk iphoneos clang++ -arch $arch $IOSMV --sysroot=$SDK -fembed-bitcode-marker -isystem $SDK/usr/include" \
LDFLAGS="-Wl,-syslibroot,$SDK" \
./configure \
--host=arm-apple-darwin \
--prefix=$DEST \
--disable-shared
;;
*)
echo "Building opencore-amr for iPhoneSimulator $arch *****************"
PATH=`xcodebuild -version -sdk iphonesimulator PlatformPath`"/Developer/usr/bin:$PATH" \
CXX="xcrun --sdk iphonesimulator clang++ -arch $arch -fembed-bitcode-marker $IOSMV" \
./configure \
--host=$arch \
--prefix=$DEST \
--disable-shared
;;
esac
make -j3
make install
for i in $LIBS; do
mv $DEST/lib/$i $DEST/lib/$i.$arch
done
done
echo "Merge into universal binary."
for i in $LIBS; do
input=""
for arch in $ARCHS; do
input="$input $DEST/lib/$i.$arch"
done
xcrun lipo -create -output $DEST/lib/$i $input
done

脚本有了, 源码有了, 接下来我们开始操作:
1、找到刚才下载源码,将新建的脚本文件放入 “opencore-amr-0.1.5” 文件夹下(源码所有资源的根目录下)。
2、打开命令行工具 进入到 “opencore-amr-0.1.5” 目录下 (新建的脚本文件所在目录)。
3、执行命令 “./build_ios.sh”,等待几分钟,就会发现在其根目录下出现一个文件夹 opencore-amr-iOS 所有编译的静态库都在这里, 其中 xxx.a 为通用静态库, 其余静态库为对应架构下的静态库 如xxx.a.arm64等 以便于上线时可以将通用静态库替换成不包含模拟器架构的,以达到减少ipa包大小。
4、便已完毕后在 opencore-amr-iOS 目录下 会有两个子目录 libinclude 我们将两个目录中的 .h 文件 和 .a 文件 加入到工程中就可以使用了。

本文使用的脚本及源码下载

支持一下
扫一扫,支持Talent•C