用Swift編寫自動(dòng)錄音器
用swift編寫自動(dòng)錄音器,自動(dòng)錄音和一般錄音的不同點(diǎn)在于:不需要像微信里面需要按下錄音然后松手結(jié)束,而是根據(jù)說(shuō)話聲音的大小自動(dòng)判斷該錄音和該停止的點(diǎn),然后可以等到錄音結(jié)束之后馬上播放出來(lái)。此效果很像會(huì)說(shuō)話的湯姆貓那樣。
在自動(dòng)錄音的初始化階段需要建立兩個(gè)錄音對(duì)象,一個(gè)需要一直錄音充當(dāng)監(jiān)聽器的功能,另一個(gè)用來(lái)在需要的時(shí)刻錄音。具體流程大致如下
準(zhǔn)備工作
這個(gè)項(xiàng)目使用swift寫的,設(shè)置的成員變量如下
如果你不是在董鉑然博客園看到本文請(qǐng)點(diǎn)擊查看原文。
// 錄音器 var recoder:AVAudioRecorder! // 監(jiān)聽器 var monitor:AVAudioRecorder! // 播放器 var player:AVAudioPlayer! // 定時(shí)器 var timer:NSTimer! // 錄音器的URL var recordURL:NSURL! // 監(jiān)聽器的URL var monitorURL:NSURL!
當(dāng)然這些屬性不能直接敲出來(lái)需要先引入一個(gè)橋接文件并導(dǎo)入#import <AVFoundation/AVFoundation.h>
導(dǎo)入如果出現(xiàn)問題可以看下此文 : 怎么讓OC與swift混合開發(fā)
在程序啟動(dòng)時(shí)應(yīng)將錄音器,監(jiān)聽器,定時(shí)器一同初始化。
在那之前需要先設(shè)置好音頻的保存質(zhì)量,這其中會(huì)用到很多庫(kù)里自帶的key,AVSampleRateKey,AVFormatIDKey,AVNumberOfChannelsKey,AVEncoderAudioQualityKey這些key對(duì)應(yīng)的值一般為double類型或int類型。一一解釋沒有必要,大概意思就是保存聲音的Hertz(類似于QQ音樂的無(wú)損和普通),轉(zhuǎn)化率,保存的聲道,聲音品質(zhì)等等。有興趣的可以仔細(xì)去頭文件里研究研究。我就查了下所有參數(shù)的最高品質(zhì)發(fā)現(xiàn)錄完之后大小也可以接受就用最高品質(zhì)了。(但是微信說(shuō)話那種發(fā)的應(yīng)該是中下品質(zhì),省流量且時(shí)效性為主)
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, error:nil)
var recoderSetting:NSDictionary = NSDictionary(objectsAndKeys: 14400.0,AVSampleRateKey,kAudioFormatAppleIMA4,AVFormatIDKey,2,AVNumberOfChannelsKey,0x7F,AVEncoderAudioQualityKey)
這其中有個(gè)參數(shù)應(yīng)該是AVAudioQuality.Max類型但是swift不能識(shí)別,就直接查看里面的常量用十六進(jìn)制填進(jìn)去了??偟膩?lái)說(shuō)就是先用一個(gè)字典把所有的鍵值對(duì)都存好然后這個(gè)字典會(huì)用在后面實(shí)例化錄音器中的一個(gè)參數(shù)。
初始化錄音器的方法如下,監(jiān)聽器完全相似只需要另改一個(gè)URL
// 實(shí)例化錄音器
var recordPath = NSTemporaryDirectory().stringByAppendingPathComponent("record.caf")
recordURL = NSURL.fileURLWithPath(recordPath)
recoder = AVAudioRecorder(URL: recordURL, settings:recoderSetting as [NSObject : AnyObject], error: nil)
開始錄音
核心功能是錄音,錄音的原理是監(jiān)聽聲音分貝的大小,自己設(shè)置臨界點(diǎn)開啟和關(guān)閉錄音。
如果聲音一直很小不作處理。
如果聲音大了先判斷現(xiàn)在是否在錄音如果沒有則開始錄音。
如果聲音小了先判斷現(xiàn)在是否在錄音如果在錄音則停止錄音。
func updateTimer(){ // 更新測(cè)量器 self.monitor.updateMeters() // 獲得說(shuō)話的分貝 var power = self.monitor.peakPowerForChannel(0); println("-----》\(power)") if (power > -30){ if(!self.recoder.recording){ println("開始錄音") self.recoder.record() } }else { if(self.recoder.recording){ println("結(jié)束錄音") self.recoder.stop() self.play() } }
嘗試的結(jié)果如下打印,其中數(shù)值就是一直監(jiān)聽分貝數(shù)。極安靜的情況下是-160 嘈雜環(huán)境一般是-40起。
播放聲音
錄音完成后可以直接設(shè)置馬上播放聲音
func play(){ timer.invalidate() monitor.stop() // 刪除錄音緩存 monitor.deleteRecording() player = AVAudioPlayer(contentsOfURL: recordURL, error: nil) player.delegate = self player.play() }
上面圖中的定時(shí)器停止-監(jiān)聽器停止-刪除監(jiān)聽器的緩存 在這塊代碼中都有體現(xiàn)。這里建議設(shè)置一下代理,因?yàn)榧词故遣シ乓淮卧诓シ磐瓿珊笠埠芸赡軙?huì)做一些額外操作,并且此項(xiàng)目的期望是能夠循環(huán)的錄音播放。即播放完打開定時(shí)器,監(jiān)聽器重新開始總流程。
延展操作
代理遵守的是AVAudioPlayerDelegate 。并實(shí)現(xiàn)代理方法,在代理方法中調(diào)用之前開啟的方法
func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) { // 重新開啟定時(shí)器 self.setupTimer() } func setupTimer(){ self.monitor.record() self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "updateTimer", userInfo: nil, repeats: true) }
到此為止一個(gè)完整的錄音流程就結(jié)束了。
也可以做一些特殊操作就是類似于會(huì)說(shuō)話的湯姆貓并不是把你說(shuō)的話原話說(shuō)出,而是對(duì)聲音做了一定的處理再說(shuō)出的。如果想實(shí)現(xiàn)此功能需要再聲音播放前,先開啟聲音預(yù)播放,并且設(shè)置一些更改聲音的操作最后再播放以達(dá)到目的。大部分的屬性在修改前都需要打開一個(gè)BOOL值才能操作。舉例如下(把上面的play()換成下面代碼
// 允許更改速度
player.enableRate = true
// 設(shè)置速度
player.rate = 2
player.play()
這個(gè)屬性rate的取值范圍是0.5到2.0。原生的好像就找到這一個(gè)其他的改聲調(diào)等應(yīng)該還需要引用第三方庫(kù)。
以上內(nèi)容就是用Swift實(shí)現(xiàn)自動(dòng)錄音的功能,希望大家能夠喜歡
相關(guān)文章
swift中AnyObject和Any的介紹與區(qū)別詳解
雖然使用swift開發(fā)了一段時(shí)間,但是感覺對(duì)一些基礎(chǔ)的東西了解不是比較透徹,在查詢了許多資料以后還是打算自己動(dòng)手記錄一下,下面這篇文章主要給大家介紹了關(guān)于swift中AnyObject和Any的介紹與區(qū)別的相關(guān)資料,需要的朋友可以參考下。2017-12-12Swift、Objective-C、Cocoa混合編程設(shè)置指南
這篇文章主要介紹了Swift、Objective-C、Cocoa混合編程設(shè)置指南,需要的朋友可以參考下2014-07-07Swift使用transform 實(shí)現(xiàn)重復(fù)平移動(dòng)畫效果
這篇文章主要介紹了Swift使用transform 實(shí)現(xiàn)重復(fù)平移動(dòng)畫效果,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07在Swift中使用Objective-C編寫類、繼承Objective-C類
這篇文章主要介紹了在Swift中使用Objective-C編寫類、繼承Objective-C類等操作方法介紹,需要的朋友可以參考下2014-07-07如何在Swift?中使用?async?let?并發(fā)運(yùn)行后臺(tái)任務(wù)
Swift?異步編程是一種編寫允許某些任務(wù)并發(fā)運(yùn)行而不是按順序運(yùn)行的代碼的方法,這篇文章主要介紹了在Swift中使用async?let并發(fā)運(yùn)行后臺(tái)任務(wù),需要的朋友可以參考下2023-06-06Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例
這篇文章主要為大家介紹了Swift動(dòng)態(tài)更換app圖標(biāo)AppIcon的簡(jiǎn)單快速方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動(dòng)態(tài)倒計(jì)時(shí)功能
這篇文章主要介紹了Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動(dòng)態(tài)倒計(jì)時(shí)功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Swift學(xué)習(xí)筆記之邏輯分支與循環(huán)體
這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)筆記之邏輯分支與循環(huán)體的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12