用swift實現自動錄音器,swift實現錄音器
基本介紹
自動錄音與一般錄音區別在:不用像那樣按下錄音-鬆手結束,而是根據說話聲音的大小自動判斷該錄音和該停止的點,然後可以做到結束錄音之後馬上播放出來。類似於達到會說話的湯姆貓那樣的效果。
在自動錄音的初始化階段需要建立兩個錄音對象,一個需要一直錄音充當監聽器的功能,另一個用來在需要的時燒錄音。具體流程大致如下
// 錄音器 var recoder:AVAudioRecorder! // 監聽器 var monitor:AVAudioRecorder! // 播放器 var player:AVAudioPlayer! // 定時器 var timer:NSTimer! // 錄音器的URL var recordURL:NSURL! // 監聽器的URL var monitorURL:NSURL!
當然這些屬性不能直接敲出來需要先引入一個橋接檔案並匯入#import <AVFoundation/AVFoundation.h>
匯入如果出現問題可以看下此文 : 怎麼讓OC與swift混合開發
在程式啟動時應將錄音器,監聽器,定時器一同初始化。
在那之前需要先設定好音訊儲存品質,這其中會用到很多庫裡內建的key,AVSampleRateKey,AVFormatIDKey,AVNumberOfChannelsKey,AVEncoderAudioQualityKey這些key對應的值一般為double類型或int類型。一一解釋沒有必要,大概意思就是儲存聲音的Hertz(類似於QQ音樂的無損和普通),轉化率,儲存的聲道,聲音品質等等。有興趣的可以仔細去標頭檔裡研究研究。我就查了下所有參數的最高品質發現錄完之後大小也可以接受就用最高品質了。(但是說話那種發的應該是中下品質,省流量且時效性為主)
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, error:nil) var recoderSetting:NSDictionary = NSDictionary(objectsAndKeys: 14400.0,AVSampleRateKey,kAudioFormatAppleIMA4,AVFormatIDKey,2,AVNumberOfChannelsKey,0x7F,AVEncoderAudioQualityKey)
這其中有個參數應該是AVAudioQuality.Max類型但是swift不能識別,就直接查看裡面的常量用十六進位填進去了。總的來說就是先用一個字典把所有的索引值對都存好然後這個字典會用在後面執行個體化錄音器中的一個參數。
初始化錄音器的方法如下,監聽器完全相似只需要另改一個URL
// 執行個體化錄音器 var recordPath = NSTemporaryDirectory().stringByAppendingPathComponent("record.caf") recordURL = NSURL.fileURLWithPath(recordPath) recoder = AVAudioRecorder(URL: recordURL, settings:recoderSetting as [NSObject : AnyObject], error: nil)
開始錄音
核心功能是錄音,錄音的原理是監聽聲音分貝的大小,自己設定臨界點開啟和關閉錄音。(董鉑然)
- 如果聲音一直很小不作處理。
- 如果聲音大了先判斷現在是否在錄音如果沒有則開始錄音。
- 如果聲音小了先判斷現在是否在錄音如果在錄音則停止錄音。
func updateTimer(){ // 更新測量器 self.monitor.updateMeters() // 獲得說話的分貝 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("結束錄音") self.recoder.stop() self.play() } }
嘗試的結果如下列印,其中數值就是一直監聽分貝數。極安靜的情況下是-160 嘈雜環境一般是-40起。
播放聲音
錄音完成後可以直接設定馬上播放聲音
func play(){ timer.invalidate() monitor.stop() // 刪除錄音緩衝 monitor.deleteRecording() player = AVAudioPlayer(contentsOfURL: recordURL, error: nil) player.delegate = self player.play() }
上面圖中的定時器停止-監聽器停止-刪除監聽器的緩衝 在這塊代碼中都有體現。這裡建議設定一下代理,因為即使是播放一次在播放完成後也很可能會做一些額外操作,並且此項目的期望是能夠迴圈的錄音播放。即播放完開啟定時器,監聽器重新開始總流程。
延展操作
代理遵守的是AVAudioPlayerDelegate 。並實現代理方法,在代理方法中調用之前開啟的方法
func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) { // 重新開啟定時器 self.setupTimer() } func setupTimer(){ self.monitor.record() self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "updateTimer", userInfo: nil, repeats: true) }
到此為止一個完整的錄音流程就結束了。
也可以做一些特殊操作就是類似於會說話的湯姆貓並不是把你說的話原話說出,而是對聲音做了一定的處理再說出的。如果想實現此功能需要再聲音播放前,先開啟聲音預播放,並且設定一些更改聲音的操作最後再播放以達到目的。大部分的屬性在修改前都需要開啟一個BOOL值才能操作。舉例如下(把上面的play()換成下面代碼)
// 允許更改速度 player.enableRate = true // 設定速度 player.rate = 2 player.play()
這個屬性rate的取值範圍是0.5到2.0。原生的好像就找到這一個其他的改聲調等應該還需要引用第三方庫。
如果你不是在董鉑然部落格園看到本文請點擊查看原文。