Swift:歌曲特定部分的火花动作(avaudioplayer)

Swift: Spark action at certain part of song(avaudioplayer)

我正在使用 AVAudioPlayer 播放歌曲,当歌曲播放到 30 秒时,我想触发一个动作(调用一个函数)。当歌曲像这样完成时,我知道如何做到这一点:

func play(url: NSURL) {
let item = AVPlayerItem(URL: url)

NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: item)

let player = AVPlayer(playerItem: item)
player.play()
}

func playerDidFinishPlaying(note: NSNotification) {
// Your code here
}

但是,我想做类似的事情,但是当歌曲达到 30 秒时。这可能吗?现在我必须使用 NSTimers 但它不可靠。

谢谢!

不确定这是否昂贵,但效果很好。

首先我 运行 一个经常调用 "checkForStrobe" 的循环:

var dpLink : CADisplayLink?
dpLink = CADisplayLink(target: self, selector: "checkForStrobe")
dpLink?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)

然后我简单地将其放入我的 checkForStrobe 函数中:

func checkForStrobe(){
    //This is being called repeatedly checking if its time to run strobe
    if(backgroundAudio.currentTime >= 38.5 && backgroundAudio.currentTime <= 38.6){
        runStrobe()
    }
    if(backgroundAudio.currentTime >= 63.5 && backgroundAudio.currentTime <= 63.6){
        stopStrobe()
    }
    if(backgroundAudio.currentTime >= 125.0 && backgroundAudio.currentTime <= 125.1){
        runStrobe()
    }
    if(backgroundAudio.currentTime >= 150.0 && backgroundAudio.currentTime <= 150.1){
        stopStrobe()
    }
}

这解决了我的问题。