iOS录音的伪教程
http://www.cnblogs.com/ipinka/archive/2012/09/24/2699816.html
這個(gè)星期我完成了一個(gè)具有基本錄音和回放的功能,一開始也不知道從何入手,也查找了很多相關(guān)的資料。與此同時(shí),我也學(xué)會(huì)了很多關(guān)于音頻方面的東西,這也對(duì)后面的錄音配置有一定的幫助。其中參照了《iPhone開發(fā)之音頻: 文件和數(shù)據(jù)類型(一)》,啟發(fā)比較大。
?
一、音頻格式
iPhone上支持的音頻編碼格式還是比較多的,而且有很多我是以前聽都沒有聽過的。我就先簡單列出來(以下是摘錄自《iPhone開發(fā)之音頻: 文件和數(shù)據(jù)類型(一)》):
- AAC: AAC其實(shí)是“高級(jí)音頻編碼(advanced audio coding)”的縮寫,它是被設(shè)計(jì)用來取代MP3格式的。你可能會(huì)想,它壓縮了原始的聲音,導(dǎo)致容量占用少但是質(zhì)量肯定會(huì)有所下降。不過這些質(zhì)量的損失 取決于聲音比特率的大小,當(dāng)比特率合適的時(shí)候,這些損失人耳是很難聽出來的。事實(shí)上,aac比mp3有更好的壓縮率,特別是在比特率低于128bit/s 的時(shí)候。
- HE-AAC: HE-AAC是AAC的一個(gè)超集,這個(gè)“HE”代表的是“High efficiency”。 HE-AAC是專門為低比特率所優(yōu)化的一種音頻編碼格式,比如streaming audio就特別適合使用這種編碼格式。
- AMR: AMR全稱是“Adaptive Multi-Rate”,它也是另一個(gè)專門為“說話(speech)”所優(yōu)化的編碼格式,也是適合低比特率環(huán)境下采用。
- ALAC: 它全稱是“Apple Lossless”,這是一種沒有任何質(zhì)量損失的音頻編碼方式,也就是我們說的無損壓縮。在實(shí)際使用過程中,它能夠壓縮40%-60%的原始數(shù)據(jù)。這種編碼格式的解碼速度非常快,這對(duì)iphone或者ipod這種小型設(shè)備來說非常適合。
- iLBC: 這是另一種專門為說話所設(shè)計(jì)的音頻編碼格式,它非常適合于IP電話等其它需要流式音頻的場(chǎng)合。
- IMA4: 這是一個(gè)在16-bit音頻文件下按照4:1的壓縮比來進(jìn)行壓縮的格式。這是iphone上面一種非常重要的編碼格式。
它的中文意思是基于線性脈沖編碼調(diào)制,用于將模擬聲音數(shù)據(jù)轉(zhuǎn)換成數(shù)字聲音數(shù)據(jù)。簡而言之,就是意味著無壓縮數(shù)據(jù)。由于數(shù)據(jù)是非壓縮的,它可以非常快的播放,并且當(dāng)空間不是問題時(shí),這是在iphone上面首選的音頻編碼方式。 - μ-law and a-law: 就我所知道的,這種編碼是交替的編碼模擬數(shù)據(jù)為數(shù)字格式數(shù)據(jù),但是在speech優(yōu)化方面比linear PCM更好。
- MP3: 這種格式是我們都知道也喜歡的,雖然很多年過去了,但MP3到目前為止仍然是一種非常流行的編碼格式,它也能被iphone很好地支持。
- LPCM也很早就被定義在DVD播放機(jī) 的標(biāo)準(zhǔn)內(nèi),為了和CD有所區(qū)別,DVD的的采樣規(guī)格為16bit/48KHz,隨著技術(shù)的發(fā)展,DVD的的采樣規(guī)格更提升到24bit/96KHz,以達(dá) 到更高的播放品質(zhì),用96KHz/24bit方式記錄的音頻信號(hào)所能達(dá)到的頻率上限是96÷2= 48KHz,而它的最大動(dòng)態(tài)范圍將可以達(dá)到24×6=144dB。從指標(biāo)上就可以看出:它的聲音比CD要好得多。pcm編碼的最大的優(yōu)點(diǎn)就是音質(zhì)好,最大的缺點(diǎn)就是體數(shù)據(jù)量大。
而我自己對(duì)此的理解是,主流格式iPhone都可以很好地支持了(APE、FLAC暫時(shí)忽略)。不過這里值得一提的就是,編碼格式與文件格式并不可以混為一談。為了省事,我就直接選用了caf文件格式,因?yàn)閏af能包含任何iphone支持的編碼格式的數(shù)據(jù),在iPhone上面它是推薦的文件格式。
文件格式選好以后,還是有很多的參數(shù)可以自己設(shè)定的,比特率、采樣率和位寬等。當(dāng)然,選用合適的音頻格式還是比較重要,因?yàn)椴煌母袷街g文件大小差異還是比較明顯的。就以AAC和LPCM對(duì)比為例,采樣率同為44100Hz,默認(rèn)的AAC一分鐘的大小約為500kB,但是16bit位寬的LPCM就可以達(dá)到5MB。但作為我用于錄音的用途,這么大的錄音文件,估計(jì)錄不了多少,用戶就會(huì)罵我的程序怎么占用這么多空間了。錄音務(wù)求能夠聽得出咬字清晰,不需要追求無損的音質(zhì)。因此,我就選擇了AAC格式,同時(shí)更小的空間占用也便于上傳。
?
二、調(diào)用錄音
想要調(diào)用關(guān)于音頻方面的API,就要使用到AVAudioSession了。根據(jù)參考庫的資料,AVAudioSession類參考和AVAudioSessionDelegate協(xié)議參考描述了一個(gè)管理音頻會(huì)話的精簡接口。如果要使音頻會(huì)話支持中斷,則可以直接使用基于C語言的音頻會(huì)話服務(wù)接口。它是屬于C級(jí)別的API,錄音前,要先將它設(shè)為活動(dòng)。
具體代碼
1 AVAudioSession *avSession = [AVAudioSession sharedInstance]; 2 [avSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 3 [avSession setActive:YES error:nil];?
這是錄音前的準(zhǔn)備,要實(shí)現(xiàn)錄音,還需要AVAudioRecorder對(duì)象。
1 NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 2 [NSNumber numberWithFloat:44100.0], AVSampleRateKey, 3 [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey, 4 [NSNumber numberWithInt:1], AVNumberOfChannelsKey, 5 nil]; 6 7 AVAudioRecorder *avRecorder = [[AVAudioRecorder alloc] initWithURL:recordUrl 8 settings:settings 9 error:nil];這就創(chuàng)建了一個(gè)編碼格式為AAC的AVAudioRecorder對(duì)象了,記得要將文件路徑轉(zhuǎn)換成NSURL。
1 [avRecorder prepareToRecord]; 2 [avRecorder peakPowerForChannel:0]; 3 [avRecorder record];這樣就可以開始錄音了,停止就調(diào)用
1 [avRecorder stop];?
當(dāng)然,還用再次將AVAudioSession的對(duì)象設(shè)為不活動(dòng),所以最好還是調(diào)用AVAudioRecorderDelegate的方法-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag。
1 [avSession setActive: NO error: nil];
那么,錄音的操作就已經(jīng)完成了。
?
三、回放錄音
本來這個(gè)和錄音都是大同小異,沒什么值得重復(fù)說,都要將會(huì)話設(shè)為活動(dòng),實(shí)現(xiàn)完成時(shí)的delegate方法。但是,我后來發(fā)現(xiàn),這么做有一個(gè)問題,回放的聲音超級(jí)小。起初我以為是音量有問題,就setVolume:1.0。但是依然不起作用,于是上網(wǎng)查了一下,原來要重新將AVAudioSession設(shè)一下。
1 [avSession setCategory: AVAudioSessionCategorySoloAmbient error: nil];其余的也就差不多,不多說了。
總結(jié)
- 上一篇: 智能手机背后隐藏的第二系统——RTOS
- 下一篇: 网站在线QQ代码