程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 用Swift編寫主動灌音器

用Swift編寫主動灌音器

編輯:更多關於編程

用Swift編寫主動灌音器。本站提示廣大學習愛好者:(用Swift編寫主動灌音器)文章只能為提供參考,不一定能成為您想要的結果。以下是用Swift編寫主動灌音器正文


用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。原生的似乎就找到這一個其他的改音調等應當還須要援用第三方庫。

以上內容就是用Swift完成主動灌音的功效,願望年夜家可以或許愛好

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved