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()
}
}
这解决了我的问题。
我正在使用 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()
}
}
这解决了我的问题。