2015-04-07 156 views
3

一定時間停止AVAudioPlayer我嘗試播放聲音剪輯的片段。如何在特定時間停止AVAudioPlayer?在斯威夫特

我有一個功能,從滑塊值調用時,將播放時間設置爲一個給定的地方。 (songStart和SongEnd只是歌曲的一個百分比) 我可以建立什麼功能來阻止它在某個點上?

func setSongConstraints(songStart: Double, songEnd: Double){ 
     audioPlayer.currentTime = audioPlayer.duration * songStart 
    } 

我知道一個選項是設置一個等待計時器或其他東西,然後在這段時間之後再調用stop。

不過,我想功能,允許歌曲的結束點的歌曲開始之後被改變。等待計時器在這種情況下不起作用,因爲它在啓動後需要更改。

回答

7

您應該只使用NSTimer並檢查AVAudioPlayer對象的currentTime屬性。

對於實例

在這裏,我開始定時器viewDidLoad,但實際上你會想,當你開始播放音頻做到這一點。

var timer:NSTimer! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "checkTime", userInfo: nil, repeats: true) 
} 

然後創建一個定時器運行的每一秒鐘檢查音頻播放器當前的時間對自己的值,其中END_TIME可以更新或您的songEnd邏輯替代的作用。

var END_TIME = 10.0 

func checkTime() { 
    if self.audioPlayer.currentTime >= END_TIME { 
     self.audioPlayer.stop() 
     timer.invalidate() 
    } 
} 

裁判:AVAudioPlayerNSTimer

+0

這似乎不必要的昂貴和粗糙......音頻只停留在一秒鐘的邊界,你必須每秒鐘輪詢一次。我的解決方案下面重置計時器,以便它只需要觸發一次,然後殺死音頻。 – RehcsifMit

+0

@RehcsifMit很酷,你能展示一些代碼來幫助展示它嗎? – Wez

0

我知道你不想做一個等待計時器,但你總是可以只跟蹤有多少時間已經過去,並重置計時器,當新的數據是可用的。或者我猜在某種循環中調查NSDate。

+0

發生了什麼的NSDate有什麼關係呢? – Wez

+0

說你要在5秒鐘內暫停, 你檢查的NSDate傳遞這家5秒大關,然後停止; 例如 'let myDate = NSDate() while(1 == 1){if(myDate.timeLapseSinceNow <-5){end song}}' 這不是測試代碼,只是一個在計時器外面的想法 – Knight0fDragon

+0

你仍然需要每秒發一張支票,似乎矯枉過正讓一個日期對象等待5秒鐘。 – Wez

0

您可以使用等待計時器。如果用戶重置歌曲的端點,只需將計時器重置爲 - 的新增量即可。你可以通過殺死現有的定時器併產生一個新的定時器,或者改變現有定時器的fireDate來做到這一點。一定要處理新端點早於當前時間的情況...然後您應該調用stop並終止現有的定時器。