今天说一下为IOS编译Opus音频库遇到的坑。

首先要编译IOS的库,得找一个mac环境,并且下载了XCode,Linux或者Windows下未试过,暂时不知道怎么操作。

其次IOS需要的库比较特殊,它需要的是一个集大成者,意思是这个库中需要保护多个平台架构的各种库,比如i386 x86_64 armv7 armv7s arm64等等,即编译各个平台下的库,然后用苹果自带的lipo命令将之合成。

最后将合成的库放到IOS下使用即可了。

下面提供一个比较暴力的脚本,集下载,编译,合成于一体,如果那里有失败的请自行修改。通过该脚本编译出的库在朋友的IOS APP中正常使用。

脚本默认编译1.2.1版本的opus库。

#!/bin/bashVERSION="1.2.1"
SDKVERSION="11.1"
MINIOSVERSION="8.0"# by default, we won't build for debugging purposes
if [ "${DEBUG}" == "true" ]; thenecho "Compiling for debugging ..."OPT_CFLAGS="-O3 -fno-inline -g"OPT_LDFLAGS=""OPT_CONFIG_ARGS="--enable-assertions --disable-asm"
elseOPT_CFLAGS="-Ofast -flto -g"OPT_LDFLAGS="-flto"OPT_CONFIG_ARGS=""
fi# No need to change this since xcode build will only compile in the
# necessary bits from the libraries we create
ARCHS="i386 x86_64 armv7 armv7s arm64"DEVELOPER=`xcode-select -print-path`
#DEVELOPER="/Applications/Xcode.app/Contents/Developer"#cd "`dirname \"$0\"`"
REPOROOT=$(pwd)# Where we'll end up storing things in the end
OUTPUTDIR="${REPOROOT}/dependencies"
mkdir -p ${OUTPUTDIR}/include
mkdir -p ${OUTPUTDIR}/libBUILDDIR="${REPOROOT}/build"# where we will keep our sources and build from.
SRCDIR="${BUILDDIR}/src"
mkdir -p $SRCDIR
# where we will store intermediary builds
INTERDIR="${BUILDDIR}/built"
mkdir -p $INTERDIR########################################cd $SRCDIR# Exit the script if an error happens
set -eif [ ! -e "${SRCDIR}/opus-${VERSION}.tar.gz" ]; thenecho "Downloading opus-${VERSION}.tar.gz"curl -LO http://downloads.xiph.org/releases/opus/opus-${VERSION}.tar.gz
fi
echo "Using opus-${VERSION}.tar.gz"tar zxf opus-${VERSION}.tar.gz -C $SRCDIR
cd "${SRCDIR}/opus-${VERSION}"set +e # don't bail out of bash script if ccache doesn't exist
CCACHE=`which ccache`
if [ $? == "0" ]; thenecho "Building with ccache: $CCACHE"CCACHE="${CCACHE} "
elseecho "Building without ccache"CCACHE=""
fi
set -e # back to regular "bail out on error" modeexport ORIGINALPATH=$PATHfor ARCH in ${ARCHS}
doif [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; thenPLATFORM="iPhoneSimulator"EXTRA_CFLAGS="-arch ${ARCH}"EXTRA_CONFIG="--host=x86_64-apple-darwin"elsePLATFORM="iPhoneOS"EXTRA_CFLAGS="-arch ${ARCH}"EXTRA_CONFIG="--host=arm-apple-darwin"fimkdir -p "${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk"./configure --enable-float-approx --disable-shared --enable-static --with-pic --disable-extra-programs --disable-doc ${EXTRA_CONFIG} \--prefix="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" \LDFLAGS="$LDFLAGS ${OPT_LDFLAGS} -fPIE -miphoneos-version-min=${MINIOSVERSION} -L${OUTPUTDIR}/lib" \CFLAGS="$CFLAGS ${EXTRA_CFLAGS} ${OPT_CFLAGS} -fPIE -miphoneos-version-min=${MINIOSVERSION} -I${OUTPUTDIR}/include -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk" \# Build the application and install it to the fake SDK intermediary dir# we have set up. Make sure to clean up afterward because we will re-use# this source tree to cross-compile other targets.make -j4make installmake clean
done########################################echo "Build library..."# These are the libs that comprise libopus.
OUTPUT_LIBS="libopus.a"
for OUTPUT_LIB in ${OUTPUT_LIBS}; doINPUT_LIBS=""for ARCH in ${ARCHS}; doif [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ];thenPLATFORM="iPhoneSimulator"elsePLATFORM="iPhoneOS"fiINPUT_ARCH_LIB="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk/lib/${OUTPUT_LIB}"if [ -e $INPUT_ARCH_LIB ]; thenINPUT_LIBS="${INPUT_LIBS} ${INPUT_ARCH_LIB}"fidone# Combine the three architectures into a universal library.if [ -n "$INPUT_LIBS"  ]; thenlipo -create $INPUT_LIBS \-output "${OUTPUTDIR}/lib/${OUTPUT_LIB}"elseecho "$OUTPUT_LIB does not exist, skipping (are the dependencies installed?)"fi
donefor ARCH in ${ARCHS}; doif [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ];thenPLATFORM="iPhoneSimulator"elsePLATFORM="iPhoneOS"ficp -R ${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk/include/* ${OUTPUTDIR}/include/if [ $? == "0" ]; then# We only need to copy the headers over once. (So break out of forloop# once we get first success.)breakfi
done####################echo "Building done."
echo "Cleaning up..."
rm -fr ${INTERDIR}
rm -fr "${SRCDIR}/opus-${VERSION}"
echo "Done."

编译IOS下Opus音频库相关推荐

  1. 交叉工具编译ARM平台Opus音频库

    最近项目中使用到opus音频库,这是一款开源的高效的音频库.其优点相对于AAC编码来说,编码效率高,据说相同带宽下,音频质量完爆AAC,而高带宽下音质接近原始音频(不喜勿喷^_^).详情及源码见官网h ...

  2. TensorFlow自带例子已经包含了android和ios下的摄像头图像分类示例Inception v1,这里补充一个Windows下的,使用AForge库(www.aforgenet.com)操作

    TensorFlow自带例子已经包含了android和ios下的摄像头图像分类示例Inception v1,这里补充一个Windows下的,使用AForge库(www.aforgenet.com)操作 ...

  3. 编译-POCO C++支持iOS平台的静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  4. 在Android中使用Opus 1.3.1(Ndk编译使用Opus so库)

    Android中使用Opus 1.3.1 Opus是一个开放格式的有损声音编码的格式,并在其使用上没有任何专利或限制.还可以处理各种音频应用,包括IP语音.视频会议.游戏内聊天.流音乐.甚至远程现场音 ...

  5. 移植Opus音频编解码库到FreeScale iMX6q(飞凌嵌入式的OKMX6Q-C开发板)平台

    移植Opus音频编解码库到FreeScale iMX6q(飞凌嵌入式的OKMX6Q-C开发板)平台 交叉编译器 使用飞凌提供的最新版交叉编译工具链,fsl-imx-x11-glibc-x86_64-m ...

  6. 编译高性能linux so库,关于如何在linux环境下生成a库和so库(改,附图)-Go语言中文社区...

    一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要i ...

  7. linux下交叉编译libusb的方法及编译一个使用了libusb库的test程序的方法

    linux交叉编译libusb的方法 下载libusb 下载网址:libusb - Browse Files at SourceForge.net 交叉编译libusb 将下载好的libusb压缩包解 ...

  8. python安装第三方库win10_音频处理 windows10下python三方库librosa安装教程

    librosa是处理音频库里的opencv,使用python脚本研究音频,先安装三方库librosa. 如下通过清华镜像源安装librosa: pip install -i https://pypi. ...

  9. win10环境下VTK7.1的编译和Qt调用VTK的详细教程二(VS2013编译支持Qt的VTK库)

    本文主要用于编译支持Qt的VTK库,重点在于编译VTK库,供Qt调用. 第1步:新建一个文件夹:vtkDir 第2步:在该文件夹下新建两个文件夹vtk_bin.vtk_src 第3步:将下载好的VTK ...

最新文章

  1. SAP PM 初级系列9 - 定义功能位置的安装
  2. ESP-12F模块转接板测试版调试说明,下载MicroPython程序。ESP8266-12F
  3. C++之全局对象、局部对象、静态对象详解
  4. FreeType, FFmpeg, SDL, 图像处理软件, Mac OS X, Objective-C
  5. 2.1php标签,语法,注释
  6. splitpane如何设置竖条的宽度_页面中有间隔的方格布局如何完美实现?
  7. (摘录)sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
  8. .NET、C#和ASP.NET三者之间的区别与联系
  9. win7和xp无线共享网络问题
  10. SQL结构化数据查询语言培训讲义
  11. R语言系列:分布一致性和离散一致性检验
  12. 世界第4疯狂的科学家,在103岁生日那天去世了
  13. python手撕链表_图解_leetcode707_设计链表
  14. 领克无线carplay适配方案展示
  15. TCP的乱序和丢包判断(附Reordering更新算法)-实例case
  16. 数据结构之2-3-4树与2-3树
  17. 自媒体人必不可少的多平台同步、一文多发小助手
  18. 线上java程序CPU占用过高问题排查
  19. PPT封面设计的一些心得
  20. 微型计算机拆的步骤视频,微型计算机拆卸.ppt

热门文章

  1. 共享软件大敌 简析十大破解工具
  2. js获取浏览器窗口可视区域大小
  3. 《那些年啊,那些事——一个程序员的奋斗史》——23
  4. 会声会影安装导向未完成,提示:安装时发生严重错误
  5. MiniWebClient,3秒实现一个Web桌面程序(Windows平台)
  6. Unity5.X导入FBX文件,播放动画时位置变动的解决方法
  7. 国内经常使用的网站访问统计系统比较
  8. 谷歌浏览器缓存无法清除?
  9. 2021华为软件精英赛初赛试题解析,欢迎讨论
  10. PhotoShop CC 2017软件工具面板使用---矩形选框工具