项目需求需要录制音频文件,而amr格式可以将音频文件压缩到很小(wav大小大概是amr的10倍),非常适用于移动端音频传输。在iOS4.0之前是可以直接进行录制amr格式音频的,后来苹果取消了;现在就需要将wav格式转换为amr格式。所以使用到了opencore-amr来进行格式转换。在这里记录一下转换步骤
1.首先下载 opencore-amr(当然也可以找别人编译好的.a文件)
2.执行编译脚本编译opencore-amr
编译脚本参考
参照上面链接的脚本如果i386不能编译成功,添加--host=x86_64-apple-darwin \
以下为修改过的脚本(opencore-amr-0.1.5):
#!/bin/sh
set -xe
VERSION="0.1.5"
SDKVERSION="12.1"
LIBSRCNAME="opencore-amr"
CURRENTPATH=`pwd`
mkdir -p "${CURRENTPATH}/src"
tar zxvf ${LIBSRCNAME}-${VERSION}.tar.gz -C "${CURRENTPATH}/src"
cd "${CURRENTPATH}/src/${LIBSRCNAME}-${VERSION}"
DEVELOPER=`xcode-select -print-path`
DEST="${CURRENTPATH}/lib-ios"
mkdir -p "${DEST}"
ARCHS="armv7 armv7s arm64 i386 x86_64"
# ARCHS="armv7"
LIBS="libopencore-amrnb.a libopencore-amrwb.a"
DEVELOPER=`xcode-select -print-path`
for arch in $ARCHS; do
case $arch in
arm*)
IOSV="-miphoneos-version-min=7.0"
if [ $arch == "arm64" ]
then
IOSV="-miphoneos-version-min=7.0"
fi
echo "Building for iOS $arch ****************"
SDKROOT="$(xcrun --sdk iphoneos --show-sdk-path)"
CC="$(xcrun --sdk iphoneos -f clang)"
CXX="$(xcrun --sdk iphoneos -f clang++)"
CPP="$(xcrun -sdk iphonesimulator -f clang++)"
CFLAGS="-isysroot $SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"
CXXFLAGS=$CFLAGS
CPPFLAGS=$CFLAGS
export CC CXX CFLAGS CXXFLAGS CPPFLAGS
./configure \
--host=arm-apple-darwin \
--prefix=$DEST \
--disable-shared --enable-static
;;
*)
IOSV="-mios-simulator-version-min=7.0"
echo "Building for iOS $arch*****************"
SDKROOT=`xcodebuild -version -sdk iphonesimulator Path`
CC="$(xcrun -sdk iphoneos -f clang)"
CXX="$(xcrun -sdk iphonesimulator -f clang++)"
CPP="$(xcrun -sdk iphonesimulator -f clang++)"
CFLAGS="-isysroot $SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"
CXXFLAGS=$CFLAGS
CPPFLAGS=$CFLAGS
export CC CXX CFLAGS CXXFLAGS CPPFLAGS
./configure \
--host=x86_64-apple-darwin \
--prefix=$DEST \
--disable-shared
;;
esac
make > /dev/null
make install
make clean
for i in $LIBS; do
mv $DEST/lib/$i $DEST/lib/$i.$arch
done
done
for i in $LIBS; do
input=""
for arch in $ARCHS; do
input="$input $DEST/lib/$i.$arch"
done
lipo -create -output $DEST/lib/$i $input
done
3.如果编译过程中出现xcrun: error: SDK "iphoneos" cannot be located
报错
//给Xcode命令行工具指定路径
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
//查看sdk路径
$ xcrun --sdk iphoneos --show-sdk-path
//查看所有可用sdk
$ xcodebuild -showsdks
4.编译成功后,得到如下文件
opencore-amrnb.a是针对8kHZ采样速率的,并提供了encode和decode的方法
opencore-amrwb.a是针对16Khz采样速率的,不过只提供了decode的方法
头文件 编译后的.a文件
5.网上有很多针对opencore-amr封装的工具类可以使用,核心实现方法都是一样的,下载下来和上面的.a文件、头文件导入到项目中,然后直接调用转换方法即可
如果嫌麻烦,可以用这个编译好的库和封装的工具类
网友评论