音頻文件在播放後通過了多久以及還有多久才能夠播放完畢,想必是用戶所關注的問題。爲了解決這一問題,在不少的音樂播放器中都會有一個播放進度,如圖2.32所示。本節將講解兩種查看播放進度的方法。swift
圖2.32 QQ音樂ide
經過時間查看進度就是在圖2.32中出現的兩個時間,它有一個當前播放的時間,還有一個音頻文件的總時間。經過這兩個時間,用戶就能夠知道音頻文件播放了多久,還須要多久播放完畢。spa
1.顯示音頻總時間.net
對於音頻文件中總時間的獲取可使用到AVAudioPlayer類的duration屬性,其語法形式以下:orm
var duration: NSTimeInterval { get }對象
其中,該屬性是一個只讀屬性,獲取的值是一個NSTimeInterval類型(又名Double)的值,它是以秒爲單位的。若是要想出現圖2.32中時間的效果,就須要將該值進行轉換,轉換的具體步驟以下:教程
(1)獲取分鐘數:因爲使用duration屬性獲取的值爲以秒爲單位的,不是用戶所理解的時間。因爲音頻文件每每都是幾分鐘,因此就不須要小時。將秒轉換爲分鐘,只須要將duration屬性獲取的值除以60就能夠了。其轉換格式以下:開發
AVAudioPlayer對象名.duration/60get
注意:用戶所理解的時間格式以下:it
時:分:秒
(2)將分鐘數轉換爲整型:因爲duration是NSTimeInterval類型即雙精度類型,而分鐘數每每沒有小數點,因此須要將此類型的值轉換爲整型,轉換格式以下:
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() //讓定時器失效
}
經過進度條查看進度可讓用戶更爲直接的看出音頻文件播放了多少,還剩餘多少,在圖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 更新進度
在音樂應用中,用戶均可以以拖動進度條的方式指定音頻文件播放的位置。此功能的實現還須要使用到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人!