iOS 9音訊應用播放音訊之iOS 9音訊播放進度

大學霸發表於2016-01-07

iOS 9音訊應用播放音訊之iOS 9音訊播放進度

iOS 9音訊應用開發播放進度

音訊檔案在播放後經過了多久以及還有多久才可以播放完畢,想必是使用者所關注的問題。為了解決這一問題,在很多的音樂播放器中都會有一個播放進度,如圖2.32所示。本節將講解兩種檢視播放進度的方法。


2.32  QQ音樂

iOS 9音訊應用開發通過進度時間檢視進度

通過時間檢視進度就是在圖2.32中出現的兩個時間,它有一個當前播放的時間,還有一個音訊檔案的總時間。通過這兩個時間,使用者就可以知道音訊檔案播放了多久,還需要多久播放完畢。

1.顯示音訊總時間

對於音訊檔案中總時間的獲取可以使用到AVAudioPlayer類的duration屬性,其語法形式如下:


  • var duration: NSTimeInterval { get }


其中,該屬性是一個只讀屬性,獲取的值是一個NSTimeInterval型別(又名Double)的值,它是以秒為單位的。如果要想出現圖2.32中時間的效果,就需要將該值進行轉換,轉換的具體步驟如下:

1)獲取分鐘數:由於使用duration屬性獲取的值為以秒為單位的,不是使用者所理解的時間。由於音訊檔案往往都是幾分鐘,所以就不需要小時。將秒轉換為分鐘,只需要將duration屬性獲取的值除以60就可以了。其轉換格式如下:


  • AVAudioPlayer物件名.duration/60


注意:使用者所理解的時間格式如下:


  • 時:分:秒


2)將分鐘數轉換為整型:由於durationNSTimeInterval型別即雙精度型別,而分鐘數往往沒有小數點,所以需要將此型別的值轉換為整型,轉換格式如下:

Int(分鐘數)

3)獲取秒數:對於秒數的獲取就直接使用音訊檔案的總時間減去轉換為整型的分鐘數,其語法形式如下:


  • AVAudioPlayer物件名.duration - Int(分鐘數)


4)將秒數轉為為整型:和為分鐘數轉換型別一樣,需要將獲取的秒數轉換為整型,轉換格式如下:


  • Int(秒數)


【示例2-7】以下將以第一個例項為基礎,獲取音訊檔案的總時間,並顯示在Duration Label標註中。具體的操作步驟如下:

1)將主檢視中的Duration Label標籤控制元件與插座變數durationTime進行關聯。

2)開啟ViewController.swift檔案,編寫程式碼,實現音訊總時間的獲取。程式碼如下:


  • override func viewDidLoad() {
  •     super.viewDidLoad()
  •     // Do any additional setup after loading the view, typically from a nib.
  •     moreSettingsView.hidden=true
  •     let path=NSBundle.mainBundle().pathForResource("Liekkas", ofType: "mp3")
  • ……
  •     audioEffect?.pan = -1.0
  •     let durationMinutes:Int=Int(audioEffect!.duration/60)                                                                        //獲取分鐘數
  •     let durationSeconds=Int(audioEffect!.duration - Double(durationMinutes * 60))                        //獲取秒數
  •     durationTime.text="\(durationMinutes):\(durationSeconds)"
  • }


此時執行程式,會看到如圖2.33所示的效果。


2.33  主檢視

2.獲取iOS 9音訊應用開發當前播放的時間

獲取當前播放的時間,我們在2.3.2小節中提到過需要使用到AVAudioPlayer類中的currentTime屬性。

注意:此時獲取的當前播放時間也是NSTimeInterval型別(又名Double)。所以也需要進行轉換,型別與音訊檔案總時間的轉換。

【示例2-8】下面將以第一個例項為基礎,獲取音訊檔案當前播放的時間,並顯示在Current Time Label標註中。具體的操作步驟如下:

1)將主檢視中的Current Time Label標籤控制元件與插座變數currentTime進行關聯。

2)開啟ViewController.swift檔案,宣告一個時間定時器,程式碼如下:


  • var timer:NSTimer?=nil
(3)在playAudio()動作中,新增一行程式碼,實現定時器的建立,程式碼如下:
  • @IBAction func playAudio(sender: AnyObject) {
  •     audioEffect?.play()                                                                                  //播放聲音
  •     playButton.setBackgroundImage(UIImage(named: "pauseImage.png"), forState: UIControlState.Normal)
  • playButton.addTarget(self, action: ("pauseAudio"), forControlEvents: UIControlEvents.TouchUpInside)
  • //建立定時器
  •     timer=NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: ("updateProgress"), userInfo: nil, repeats: true)
  • }


4)新增updateProgress()方法,實現當前播放時間的更新。程式碼如下:


  • func updateProgress(){
  •     let  currentTimeMinutes=Int(self.audioEffect!.currentTime/60)                                                    //獲取分鐘數
  •     let  currentTimeSeconds=Int(audioEffect!.currentTime - Double(currentTimeMinutes*60))//獲取秒數
  •     currentTime.text="\(currentTimeMinutes):\(currentTimeSeconds)"
  • }


此時執行程式,會看到如圖2.34所示的效果。當輕拍播放按鈕後,會看到當前時間在不停的進行更新,如圖2.35所示。


2.34  初始狀態                         2.35  更新當前播放時間

注意:當使用者輕拍暫停按鈕後,此時的音訊檔案就會暫停播放,當前播放的時間停止更新,此時需要在pauseAudio()動作中新增一行程式碼,實現此功能,程式碼如下:


  • func pauseAudio(){
  •     audioEffect?.stop()                                                          //暫停
  •     playButton.setBackgroundImage(UIImage(named: "playImage.png"), forState: UIControlState.Normal)
  •     playButton.addTarget(self, action: ("playAudio:"), forControlEvents: UIControlEvents.TouchUpInside)
  •     timer?.invalidate()                                                                                                  //讓定時器失效
  • }


iOS 9音訊應用通過進度條檢視進度

通過進度條檢視進度可以讓使用者更為直接的看出音訊檔案播放了多少,還剩餘多少,在圖2.32中也使用到了此方法。在iOS中有兩個控制元件可以實現進度條的功能:一種是Progress View控制元件;另一種是Slider控制元件。在本書中為了更為直觀的看到音訊檔案多放了多少,還剩多少沒有播放,我們採用Slider實現進度條的功能。

【示例2-9】以下將以第一個例項為基礎,實現通過進度條檢視進度的功能。具體的操作步驟如下:

1)將主檢視中的Progress Slider滑塊控制元件與插座變數progressSlider進行關聯。

2)開啟ViewController.swift檔案,在updateProgress()方法中新增一行程式碼,對Slider控制元件的值進行設定,程式碼如下:


  • func updateProgress(){
  •     let  currentTimeMinutes=Int(self.audioEffect!.currentTime/60)
  •     let  currentTimeSeconds=Int(Double(audioEffect!.currentTime) - Double(currentTimeMinutes*60))
  •     currentTime.text="\(currentTimeMinutes):\(currentTimeSeconds)"
  •     self.progressSlider.value=Float(self.audioEffect!.currentTime/self.audioEffect!.duration)
  • }


此時執行程式,會看到如圖2.36所示的效果。當輕拍播放按鈕後,會看到當前時間在不停的進行更新,如圖2.37所示。


2.36  初始狀態                                 2.37  更新進度

iOS 9音訊應用拖動進度條播放

在音樂應用中,使用者都可以以拖動進度條的方式指定音訊檔案播放的位置。此功能的實現還需要使用到currentTime屬性。

【示例2-10】以下將以第一個例項為基礎,實現拖動進度條實現播放的功能。具體的操作步驟如下:


  • @IBAction func dragPlayAudio(sender: AnyObject) {
  • if(audioEffect!.playing){
  •     //設定當前播放的時間
  •         audioEffect!.currentTime=Double(progressSlider.value) * Double(audioEffect!.duration)
  •     }else{
  •         let alertController = UIAlertController(title: "提示", message: "音樂沒有播放,拖動無效", preferredStyle: UIAlertControllerStyle.Alert)
  •         let action = UIAlertAction(title: "知道了", style: UIAlertActionStyle.Default){
  •             (action: UIAlertAction!) -> Void in
  •             self.audioEffect?.currentTime=0.0
  •             self.progressSlider.value=0.0
  •         }
  •         alertController.addAction(action)
  •         self.presentViewController(alertController, animated: true, completion: nil)
  •     }
  • }


此時執行程式,在出現的模擬器介面中輕拍播放按鈕,此時iOS 9音訊應用開發音訊檔案就會播放。當開發者拖動進度條中的滑塊後,音訊檔案就會播放滑塊所在位置處的聲音。

注意:拖動iOS 9音訊應用開發進度條播放並需要在音訊檔案播放時實現,否則就會出現“音樂沒有播放,拖動無效”的警告檢視,如圖2.38所示。


2.38  警告檢視

本文選自:iOS 9音訊應用開發基礎教程大學霸內部資料,轉載請註明出處,尊重技術尊重IT人!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29597077/viewspace-1973185/,如需轉載,請註明出處,否則將追究法律責任。

相關文章