使用opencore_amr实现WAV 转 AMR (8Khz,16Khz)(更新版)

由于公司正在做声纹方面的开发,所以需要对语音数据做压缩,目前想到了三种压缩方式,1是AMR,2是Speex,3是Opus,这里先说第一种方式,在iOS4.0之前是可以进行amr格式的录音的,后来苹果取消了这个声音格式,但是可以使用opencore-amr来将wav格式转换为amr格式。

目前网上的例子大多数都是8Khz采样率的wav文件转AMR,具体可以参照iOS音频格式之AMR和WAV互转(更新支持64位),这里也要感谢这篇博文的作者黄俊鹏,他给我提供了帮助我才找到了方法。但是我们公司由于对于声音采集样本的要求比较高,所以我们要使用16Khz的采样率,那么问题就出现了,在opencore-amr中并没有提供amr-wb的encode方法,8kHZ使用的opencore-amrnb.a的静态库,其中提供了encode和decode的方法,但是对于16Khz使用的是opencore-amrwb的静态库,其中里面只提供了decode的方法,后来通过其他资料我我才明白encode在另外一个项目vo-amrwbenc里面,如果要使用的话必须要单独编译这个项目才可以,项目下载可以看opencore-amr,所以如果需要将16Khz wav文件转为amr文件,只需要编译这个库然后使用就可以了,如果要解码那么还是需要使用原来的opencore-amr库。

下面就可以编译vo-amrwebenc

1.首先新建一个文件夹,将下载到的vo-amrwbenc-0.1.3.tar.gz压缩包放到里面,然后进入这个文件夹,在里面创建build.sh文件,将以下脚本粘贴到文件里面

#!/bin/sh

set -xe

VERSION="0.1.3"

LIBSRCNAME="vo-amrwbenc"

CURRENTPATH=`pwd`

mkdir -p "${CURRENTPATH}/src"

tar zxvf ${LIBSRCNAME}-${VERSION}.tar.gz -C "${CURRENTPATH}/src"

cd "${CURRENTPATH}/src/${LIBSRCNAME}-${VERSION}"

# 设置环境变量并创建lib-ios文件夹,后续生成的.a类库都会放在这个文件夹里边

DEST="${CURRENTPATH}/lib-ios"

mkdir -p "${DEST}"

ARCHS="armv7 armv7s arm64 i386 x86_64"

LIBS="libvo-amrwbenc.a"

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 ****************"

# 编译 $arch 环境的类库(amr类型类型)

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 \

--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

2.修改build.sh的权限,打开终端,cd到新建的文件夹,使用命令 chmod 777 build.sh 修改权限。

3.修改完成之后在终端执行 ./build.sh 就会在vo-amrwbenc里面生成一个lib-ios文件夹,里面就包含了libvo-amrwbenc.a的静态库和enc_if_h的头文件。

最后我已经将编译好的项目放到github上面

vo-amrwbenc编译

-------------------2018.8.16更新---------------------------------------------
今天有收到issues说编码的效率很慢,然后需要更新open-amr的库然后重新编译,大家需要到opencore-amr下载最新的库,然后重新编译打包静态库,下面附上打包脚本,打包方法和上面一致。


#!/bin/sh
set -xe
 
VERSION="0.1.3"
SDKVERSION="8.4"
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 \
--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

你可能感兴趣的:(使用opencore_amr实现WAV 转 AMR (8Khz,16Khz)(更新版))