使用opencore-amr實現(xiàn)wav轉(zhuǎn)amr-8khz-16khz

opencore-amrDemo-iOS

演示了8Khz wav文件和amr文件互轉(zhuǎn) 和 16Khz wav文件和amr文件互轉(zhuǎn)

使用opencore-amr實現(xiàn)wav轉(zhuǎn)amr-8khz-16khz

轉(zhuǎn)自:博客

介紹

8khz 和 16khz兩個不同的采樣率的wav文件如果要使用AMR壓縮是使用兩個不同的庫黔宛,如果是8Khz的話是使用opencore-amr
里面提供的amrnb encode和decode的方法。

如果是16khz則使用了兩個庫厌秒,如果是AMR解碼則使用的是和8khz一樣亭枷,使用的是opencore-amr
里面提供的amrwb 的decode的方法哭懈。如果是AMR編碼則使用的是另外一個庫vo-amrwbenc,該倉單獨提供了一個獨立的編碼方法

編譯

  1. 首先新建一個文件夾,將下載到的壓縮包放到里面带到,然后進入這個文件夾,在里面創(chuàng)建build.sh文件,將以下腳本粘貼到文件里面英染。

如果是opencore-amr則使用下面的腳本:

#!/bin/sh
set -xe
 
#注意這里的版本要對應(yīng)到壓縮包的版本揽惹,注意一下解壓的時候名字要對應(yīng)下載下來的壓縮包的名字
VERSION="0.1.3" 
SDKVERSION="8.4"
LIBSRCNAME="opencore-amr"
 
CURRENTPATH=`pwd`
 
mkdir -p "${CURRENTPATH}/src"
tar zxvf ${LIBSRCNAME}-${VERSION}.tar -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

如果是vo-amrwbenc則使用下面的腳本:

#!/bin/sh

set -xe

#注意這里的版本要對應(yīng)到壓縮包的版本,注意一下解壓的時候名字要對應(yīng)下載下來的壓縮包的名字
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}"

# 設(shè)置環(huán)境變量并創(chuàng)建lib-ios文件夾四康,后續(xù)生成的.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 環(huán)境的類庫(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
  1. 修改build.sh的權(quán)限搪搏,打開終端,cd到新建的文件夾闪金,使用命令 chmod 777 build.sh 修改權(quán)限疯溺。

  2. 修改完成之后在終端執(zhí)行 ./build.sh 就會在對應(yīng)的倉庫里面里面生成一個lib-ios文件夾,里面就包含了對應(yīng)的靜態(tài)庫和頭文件。

使用

將Opencore-AMR拖到你的項目里面囱嫩,然后 #import "VoiceConverter.h"這個類里面提供了三個類方法恃疯。

  1. 轉(zhuǎn)換wav到amr(編碼)

    /**
    
  • 轉(zhuǎn)換wav到amr
  • @param aWavPath wav文件路徑
  • @param aSavePath amr保存路徑
  • @return 0失敗 1成功
    */
  • (int)EncodeWavToAmr:(NSString *)aWavPath amrSavePath:(NSString *)aSavePath sampleRateType:(Sample_Rate)sampleRateType;

    
    
  1. 轉(zhuǎn)換amr到wav(解碼)
/**
 *  轉(zhuǎn)換amr到wav
 *
 *  @param aAmrPath  amr文件路徑
 *  @param aSavePath wav保存路徑
 *
 *  @return 0失敗 1成功
 */
+ (int)DecodeAmrToWav:(NSString *)aAmrPath wavSavePath:(NSString *)aSavePath sampleRateType:(Sample_Rate)sampleRateType;
  1. 獲取采集聲音默認設(shè)置,當初始化AVAudioRecorder的時候需要提供一個采集聲音采樣率挠说,聲道的設(shè)置澡谭,可以使用該類的下面這個方法來設(shè)置一個默認的設(shè)置。
/**
 獲取采集聲音默認設(shè)置

 @param sampleRateType 采樣率
 @return
 */
+ (NSDictionary*)GetAudioRecorderSettingDictWithSampleRateType:(Sample_Rate)sampleRateType;
    self.recorder = [[AVAudioRecorder alloc]initWithURL:[NSURL fileURLWithPath:self.recordFilePath]
                                            settings:[VoiceConverter GetAudioRecorderSettingDictWithSampleRateType:Sample_Rate_8000]
                                               error:nil];

2018.8.16更新
由于有個哥們反映了舊的倉庫轉(zhuǎn)碼效率比上另外的庫時間慢上大概5倍左右损俭,所以編譯了最新的opencore-amr

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛙奖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杆兵,更是在濱河造成了極大的恐慌雁仲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琐脏,死亡現(xiàn)場離奇詭異攒砖,居然都是意外死亡,警方通過查閱死者的電腦和手機日裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門吹艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昂拂,你說我怎么就攤上這事受神。” “怎么了格侯?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵鼻听,是天一觀的道長。 經(jīng)常有香客問我联四,道長撑碴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任朝墩,我火速辦了婚禮醉拓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鱼辙。我一直安慰自己廉嚼,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布倒戏。 她就那樣靜靜地躺著怠噪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杜跷。 梳的紋絲不亂的頭發(fā)上傍念,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天矫夷,我揣著相機與錄音,去河邊找鬼憋槐。 笑死双藕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的阳仔。 我是一名探鬼主播忧陪,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼近范!你這毒婦竟也來了嘶摊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤评矩,失蹤者是張志新(化名)和其女友劉穎叶堆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斥杜,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡虱颗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔗喂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忘渔。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缰儿,靈堂內(nèi)的尸體忽然破棺而出辨萍,到底是詐尸還是另有隱情返弹,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布爪飘,位于F島的核電站义起,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏师崎。R本人自食惡果不足惜默终,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望犁罩。 院中可真熱鬧齐蔽,春花似錦、人聲如沸床估。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐巫。三九已至谈况,卻和暖如春勺美,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碑韵。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工赡茸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祝闻。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓占卧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親联喘。 傳聞我的和親對象是個殘疾皇子华蜒,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容