最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Swift編寫自動錄音器

 更新時間:2015年07月27日 15:55:10   作者:董鉑然  
這篇文章主要介紹了用Swift編寫自動錄音器,有需要的朋友可以借鑒下

用swift編寫自動錄音器,自動錄音和一般錄音的不同點在于:不需要像微信里面需要按下錄音然后松手結(jié)束,而是根據(jù)說話聲音的大小自動判斷該錄音和該停止的點,然后可以等到錄音結(jié)束之后馬上播放出來。此效果很像會說話的湯姆貓那樣。

在自動錄音的初始化階段需要建立兩個錄音對象,一個需要一直錄音充當監(jiān)聽器的功能,另一個用來在需要的時刻錄音。具體流程大致如下

準備工作
這個項目使用swift寫的,設(shè)置的成員變量如下

如果你不是在董鉑然博客園看到本文請點擊查看原文。

// 錄音器
var recoder:AVAudioRecorder!
// 監(jiān)聽器
var monitor:AVAudioRecorder!
// 播放器
var player:AVAudioPlayer!
// 定時器
var timer:NSTimer!
// 錄音器的URL
var recordURL:NSURL!
// 監(jiān)聽器的URL
var monitorURL:NSURL!

當然這些屬性不能直接敲出來需要先引入一個橋接文件并導入#import <AVFoundation/AVFoundation.h>

導入如果出現(xiàn)問題可以看下此文 : 怎么讓OC與swift混合開發(fā)

在程序啟動時應將錄音器,監(jiān)聽器,定時器一同初始化。

在那之前需要先設(shè)置好音頻的保存質(zhì)量,這其中會用到很多庫里自帶的key,AVSampleRateKey,AVFormatIDKey,AVNumberOfChannelsKey,AVEncoderAudioQualityKey這些key對應的值一般為double類型或int類型。一一解釋沒有必要,大概意思就是保存聲音的Hertz(類似于QQ音樂的無損和普通),轉(zhuǎn)化率,保存的聲道,聲音品質(zhì)等等。有興趣的可以仔細去頭文件里研究研究。我就查了下所有參數(shù)的最高品質(zhì)發(fā)現(xiàn)錄完之后大小也可以接受就用最高品質(zhì)了。(但是微信說話那種發(fā)的應該是中下品質(zhì),省流量且時效性為主)

復制代碼 代碼如下:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, error:nil)
var recoderSetting:NSDictionary = NSDictionary(objectsAndKeys: 14400.0,AVSampleRateKey,kAudioFormatAppleIMA4,AVFormatIDKey,2,AVNumberOfChannelsKey,0x7F,AVEncoderAudioQualityKey)


這其中有個參數(shù)應該是AVAudioQuality.Max類型但是swift不能識別,就直接查看里面的常量用十六進制填進去了。總的來說就是先用一個字典把所有的鍵值對都存好然后這個字典會用在后面實例化錄音器中的一個參數(shù)。

初始化錄音器的方法如下,監(jiān)聽器完全相似只需要另改一個URL

復制代碼 代碼如下:

// 實例化錄音器
var recordPath = NSTemporaryDirectory().stringByAppendingPathComponent("record.caf")
recordURL = NSURL.fileURLWithPath(recordPath)
recoder = AVAudioRecorder(URL: recordURL, settings:recoderSetting as [NSObject : AnyObject], error: nil)

 
開始錄音
核心功能是錄音,錄音的原理是監(jiān)聽聲音分貝的大小,自己設(shè)置臨界點開啟和關(guān)閉錄音。

如果聲音一直很小不作處理。
如果聲音大了先判斷現(xiàn)在是否在錄音如果沒有則開始錄音。
如果聲音小了先判斷現(xiàn)在是否在錄音如果在錄音則停止錄音。

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("結(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()
}

上面圖中的定時器停止-監(jiān)聽器停止-刪除監(jiān)聽器的緩存 在這塊代碼中都有體現(xiàn)。這里建議設(shè)置一下代理,因為即使是播放一次在播放完成后也很可能會做一些額外操作,并且此項目的期望是能夠循環(huán)的錄音播放。即播放完打開定時器,監(jiān)聽器重新開始總流程。

 
延展操作
代理遵守的是AVAudioPlayerDelegate 。并實現(xiàn)代理方法,在代理方法中調(diào)用之前開啟的方法

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)
}

到此為止一個完整的錄音流程就結(jié)束了。

也可以做一些特殊操作就是類似于會說話的湯姆貓并不是把你說的話原話說出,而是對聲音做了一定的處理再說出的。如果想實現(xiàn)此功能需要再聲音播放前,先開啟聲音預播放,并且設(shè)置一些更改聲音的操作最后再播放以達到目的。大部分的屬性在修改前都需要打開一個BOOL值才能操作。舉例如下(把上面的play()換成下面代碼

復制代碼 代碼如下:

// 允許更改速度
player.enableRate = true
// 設(shè)置速度
player.rate = 2
player.play()

這個屬性rate的取值范圍是0.5到2.0。原生的好像就找到這一個其他的改聲調(diào)等應該還需要引用第三方庫。

以上內(nèi)容就是用Swift實現(xiàn)自動錄音的功能,希望大家能夠喜歡

相關(guān)文章

  • SwiftUI?引導頁界面實現(xiàn)示例

    SwiftUI?引導頁界面實現(xiàn)示例

    這篇文章主要為大家介紹了SwiftUI?引導頁界面實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Swift 3.0基礎(chǔ)學習之下標

    Swift 3.0基礎(chǔ)學習之下標

    這篇文章主要介紹了Swift 3.0基礎(chǔ)學習之下標的相關(guān)資料,文中介紹的非常詳細,對大家學習或者使用swift具有一定的參考價值,需要的朋友下面來一起看看吧。
    2017-03-03
  • OpenStack的Swift組件詳解

    OpenStack的Swift組件詳解

    這篇文章主要介紹了OpenStack的Swift組件,對swift感興趣的同學,可以參考下
    2021-04-04
  • Swift流程控制之循環(huán)語句和判斷語句詳解

    Swift流程控制之循環(huán)語句和判斷語句詳解

    這篇文章主要介紹了Swift流程控制之循環(huán)語句和判斷語句詳解,文中還使用了一個游戲例子來講解循環(huán)語句和判斷語句的使用,需要的朋友可以參考下
    2014-07-07
  • 淺析Swift中struct與class的區(qū)別(匯編角度底層分析)

    淺析Swift中struct與class的區(qū)別(匯編角度底層分析)

    這篇文章主要介紹了Swift中struct與class的區(qū)別 ,本文從匯編角度分析struct與class的區(qū)別,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Swift開發(fā)之UITableView狀態(tài)切換效果

    Swift開發(fā)之UITableView狀態(tài)切換效果

    這篇文章主要介紹了Swift開發(fā)之UITableView狀態(tài)切換效果的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Swift 4.2使用self做為變量名淺析

    Swift 4.2使用self做為變量名淺析

    這篇文章主要給大家介紹了關(guān)于Swift 4.2使用self做為變量名的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • Swift教程之屬性詳解

    Swift教程之屬性詳解

    這篇文章主要介紹了Swift教程之屬性詳解,屬性是描述特定類、結(jié)構(gòu)或者枚舉的值,計算屬性存在于類、結(jié)構(gòu)與枚舉中,存儲屬性僅僅只在類與結(jié)構(gòu)中,需要的朋友可以參考下
    2015-01-01
  • Swift中定義二維數(shù)組的方法及遍歷方法示例

    Swift中定義二維數(shù)組的方法及遍歷方法示例

    這篇文章主要介紹了Swift中定義二維數(shù)組的方法及遍歷方法示例,本文直接給出代碼示例,需要的朋友可以參考下
    2015-07-07
  • Swift hello world!Swift快速入門教程

    Swift hello world!Swift快速入門教程

    這篇文章主要介紹了Swift hello world!Swift快速入門教程,本文在快速了解Swift編程語言,需要的朋友可以參考下
    2014-07-07

最新評論

同德县| 南陵县| 黑河市| 泗水县| 恩平市| 镇巴县| 宁乡县| 大同市| 若羌县| 策勒县| 静安区| 百色市| 衡水市| 平顶山市| 同心县| 哈尔滨市| 榆中县| 濮阳县| 扶风县| 巴彦淖尔市| 娄烦县| 手游| 农安县| 南召县| 普安县| 兴隆县| 白城市| 孝义市| 延庆县| 广灵县| 美姑县| 江口县| 镇远县| 铜陵市| 卢龙县| 望江县| 涿州市| 广西| 雅江县| 张掖市| 新兴县|