前文書(shū)咱們說(shuō)到IOS下如何錄制一個(gè)wav格式的音頻掠兄,然而現(xiàn)在的情況確實(shí)安卓不支持wav格式饱岸,于是有看官說(shuō)了,你個(gè)二百五徽千,就不能選個(gè)安卓支持的格式錄制么,我很負(fù)責(zé)任的說(shuō)汤锨,蘋(píng)果和谷歌掐架双抽,苦的就是我們這幫苦逼的技術(shù)人員。闲礼。牍汹。安卓的格式蘋(píng)果全不支持,看好是全不柬泽,不是全部慎菲,反過(guò)來(lái)蘋(píng)果的格式,安卓也不慣著锨并。露该。。第煮。
當(dāng)然上有政策下有對(duì)策是萬(wàn)年不變的真理解幼,Ios與安卓的音頻互通是難不倒我們偉大的程序員的抑党,而目前解決這個(gè)問(wèn)題方案有很多種但大致以下3種方式,且聽(tīng)我細(xì)細(xì)道來(lái)撵摆。
第一種方案對(duì)于服務(wù)器負(fù)荷較大底靠,不論是安卓端亦或是IOS端都將音頻傳輸?shù)椒?wù)器,通過(guò)服務(wù)器進(jìn)行轉(zhuǎn)換再進(jìn)行轉(zhuǎn)發(fā)特铝。這種做法可以不受系統(tǒng)限制暑中,但是信息量較大時(shí)對(duì)服務(wù)器負(fù)荷較大,對(duì)服務(wù)器端的要求很高鲫剿。據(jù)傳聞鳄逾,微信就是采用這種方式進(jìn)行的語(yǔ)音IM交互
第二種方案是不論IOS端還是安卓端都統(tǒng)一使用相同的第三方音頻庫(kù)進(jìn)行編解碼處理,然后再進(jìn)行網(wǎng)絡(luò)傳輸牵素,優(yōu)點(diǎn)是可供選擇的音頻庫(kù)非常多严衬,可以根據(jù)自己不同的需求選擇各種各樣的音頻格式,但是因?yàn)椴徽撌荌OS端還是安卓端都需要對(duì)其進(jìn)行i編碼解碼處理笆呆,而項(xiàng)目初期并沒(méi)有設(shè)計(jì)這方面的需求所以如果雙端都進(jìn)行修改修改量實(shí)在太大请琳。同樣據(jù)傳聞,同為語(yǔ)音IM的成熟案例微米就是依靠Speex的三方開(kāi)源庫(kù)來(lái)完成的赠幕,這種格式體積小俄精,能降噪,是目前比較受推崇的方式榕堰。
我采用的是第三種方式竖慧,amr格式的音頻文件是安卓系統(tǒng)中默認(rèn)的錄音文件,也算是安卓支持的很方便的音頻文件逆屡,IOS系統(tǒng)曾經(jīng)是支持這種格式的文件圾旨,自4.3以后才取消了對(duì)amr的支持(原因應(yīng)該不需要我多說(shuō)。魏蔗。砍的。),可見(jiàn)莺治,amr格式的音頻文件并非IOS處理不了的廓鞠,因?yàn)橛辛诉@樣的概念和潛意識(shí)的植入,我就開(kāi)始一門心思在網(wǎng)絡(luò)上找尋各種各樣的實(shí)例以及demo谣旁,我要做的就是把問(wèn)題盡量都解決在IOS端床佳。終于功夫不負(fù)有心人,最終讓我得以成功的在IOS端成功的轉(zhuǎn)換出安卓端可以使用的amr文件榄审。接下來(lái)砌们,我們就說(shuō)說(shuō)如何在IOS端完成wav與amr文件的互轉(zhuǎn)。
首先推薦給大伙提供一個(gè)demo在下面的連接下載。此demo轉(zhuǎn)載自中國(guó)開(kāi)源社區(qū)怨绣,本人發(fā)自內(nèi)心的向發(fā)布者Jeans
大人致以最崇高的敬意角溃。
http://www.oschina.net/code/snippet_562429_12400
demo下載打開(kāi)項(xiàng)目后將如下四個(gè)源碼文件以及兩個(gè)庫(kù)文件拖入自己的項(xiàng)目,引用AudioToolbox.framework篮撑、CoreAudio.framework以及AVFouncation.framework即可完成類庫(kù)的導(dǎo)入
打開(kāi)我們導(dǎo)入的頭文件就會(huì)發(fā)現(xiàn)有又大量的struct,而在開(kāi)啟ARC項(xiàng)目中是禁止使用struct和union的减细,而我們的項(xiàng)目確實(shí)可以開(kāi)啟ARC的,這里涉及到一個(gè)知識(shí)點(diǎn)赢笨,之前也在網(wǎng)絡(luò)上看到有人提問(wèn)在開(kāi)啟ARC后改如何使用struct未蝌,我也是接觸這個(gè)項(xiàng)目之后開(kāi)始涉及混編才了解該如何解決這個(gè)問(wèn)題, 只要將Compile Sources As(設(shè)置編譯源)的設(shè)置為Ojbective-C 或者將包含到聲名struct和union頭文件的實(shí)作文件的擴(kuò)展名改為.mm就可以在項(xiàng)目中使用struct和union了,但是請(qǐng)注意此時(shí)你編寫(xiě)的代碼不再是純粹的Objective-C語(yǔ)言了茧妒,而是涉及到Objective-C 萧吠,此處涉及到混編的問(wèn)題,我們?cè)俸竺孢€會(huì)再講解混編相關(guān)的內(nèi)容桐筏,但并不會(huì)很多纸型,感興趣的看官可以自己查找資料∶芳桑回到原題狰腌,如果在導(dǎo)入文件后遇到了編譯錯(cuò)誤,請(qǐng)點(diǎn)擊項(xiàng)目的TARGETS下的Build best online casino
Settings找到以下編譯設(shè)置并按照?qǐng)D內(nèi)容修改
[圖片上傳中牧氮。琼腔。。(2)]
注意踱葛,如果是新建空項(xiàng)目Compile Sources mobile casino
As的設(shè)置在According to File Type(依照文件類型選擇編譯源)的模式下應(yīng)該也可以正常編譯丹莲,盡量不要設(shè)置為Ojbective-C 進(jìn)行編譯,我是因?yàn)轫?xiàng)目中含有其他的SDK需要用到所以才如此設(shè)置尸诽,一旦設(shè)置成Ojbective-C 會(huì)和我們之后講的網(wǎng)絡(luò)傳輸篇中所使用的SDK產(chǎn)生一定沖突很那解決甥材。所以此最好保持According to File Type。
文件正常導(dǎo)入之后就可以直接使用轉(zhuǎn)換方法了性含,和常規(guī)的SDK不同洲赵,這個(gè)庫(kù)并非以累的形式封裝的,而是數(shù)個(gè)功能函數(shù)胶滋,所以并不需要我們?nèi)?gòu)造對(duì)象,接下來(lái)我們說(shuō)一下轉(zhuǎn)換時(shí)具體用到的方法悲敷,雖然這些方法簡(jiǎn)單易用究恤,但是我還是愿意為大家提供一點(diǎn)便利,所謂幫人到底送佛送到西后德,下面我每一個(gè)方法的名稱部宿、功能、參數(shù)說(shuō)明以及使用示例貼出以供大家參考~。
哦~對(duì)了不要忘記理张,我們的第一步永遠(yuǎn)都是導(dǎo)入頭文件
import “amrFileCodec.h”;
接下來(lái)我們開(kāi)始第一個(gè)函數(shù)EncodeWAVEFileToAMRFile從函數(shù)名稱中就可看出赫蛇,此方法是將WAV轉(zhuǎn)換為AMR文件的,我們先來(lái)看一下示例??
參數(shù)列表也并不是很復(fù)雜4個(gè)參數(shù)分別問(wèn):1.WAV的文件地址雾叭,2.AMR的文件地址悟耘,3.音頻通道數(shù),也就是我們上篇文章中所提到錄制音頻的最后一個(gè)參數(shù)织狐,聲道數(shù)量暂幼。4.編碼位數(shù),同樣在上一篇文章中我們也已經(jīng)介紹過(guò)不再贅述移迫。
接下來(lái)第二個(gè)函數(shù)旺嬉,DecodeAMRFileToWAVEFile這個(gè)參數(shù)與前一個(gè)功能正好相反,是從amr轉(zhuǎn)換為WAV厨埋,下面是具體代碼示例?
這個(gè)參數(shù)可以說(shuō)較上一個(gè)更加簡(jiǎn)單邪媳,第一個(gè)參數(shù)是需要一個(gè)AMR的文件地址也就是源,第二個(gè)參數(shù)則是目標(biāo)地址也就是一個(gè)WAV文件的地址荡陷,簡(jiǎn)單的兩個(gè)參數(shù)就可完成調(diào)用了雨效。需要注意的是,此處所使用的地址和之前我們?cè)偈褂肁VFouncation的時(shí)候又不同了亲善,它既不是要NSString的字符串设易,也不是NSURL對(duì)象而是一個(gè)const char的指針,但是這并不是問(wèn)題蛹头,實(shí)例代碼中所轉(zhuǎn)換的方法并不是最簡(jiǎn)的只是急于演示所以拖拽出來(lái)的顿肺,希望有心的看官可以自行過(guò)濾,過(guò)眼不過(guò)心是編程大忌渣蜗。
相對(duì)于導(dǎo)入可以說(shuō)使用的方法簡(jiǎn)單的一塌糊涂屠尊,并不需要我們多少功夫,也沒(méi)有那么高深莫測(cè)耕拷,但是測(cè)試還是要下一定功夫的讼昆,經(jīng)過(guò)實(shí)機(jī)檢測(cè)IOS下錄制出的WAV轉(zhuǎn)換為AMR之后放到安卓平臺(tái)可以正常播放,而安卓錄制的AMR文件拿到IOS下轉(zhuǎn)換出WAV一樣可以播放完全沒(méi)有任何問(wèn)題骚烧。但是這個(gè)方法也是有一定的弊端浸赫,音頻轉(zhuǎn)換的速度較慢,如果是時(shí)間較長(zhǎng)的音頻文件轉(zhuǎn)換起來(lái)會(huì)有短時(shí)間頓卡赃绊,但是用來(lái)實(shí)現(xiàn)語(yǔ)音IM聊天是完全可以滿足的
至此我們本地音頻處理篇的內(nèi)容全部完結(jié)既峡,也算是告一段落,但是我們現(xiàn)在只是在本地機(jī)器上實(shí)現(xiàn)了正確的音頻轉(zhuǎn)換以及播放碧查,想要完成語(yǔ)音IM聊天我們還差關(guān)鍵的環(huán)節(jié)就是與服務(wù)器的交互运敢,詳細(xì)的內(nèi)容校仑,我們將在下一篇文章中介紹,盡請(qǐng)關(guān)注IOS传惠、安卓IM語(yǔ)音聊天開(kāi)發(fā)初探部分心得——異步Socket傳輸篇