AVAudioPlayer 可以按预定义的时间间隔触发事件吗?
can AVAudioPlayer trigger events on predefined intervals?
我需要在固定时间显示视图,同时 运行 播放 MP3 音频。我正在使用 Swift。有什么建议吗?
使用 NSTimer
或 AVAudioPlayer 的 addPeriodicTimeObserverForInterval:queue:usingBlock:
方法检查该值,当达到特定时间时(很可能)无法获得更新。
哦,对于 Swiftier NSTimer,我建议 this
如果绘图依赖计时器,我不喜欢使用它们。它们可能比屏幕重绘更频繁地触发或与屏幕绘图不同步。我改为使用 CADisplayLink。它类似于计时器,但设计为与屏幕的刷新率同步。你可以实现这样的东西。
var messagePlaybackTimer: CADisplayLink?
var player: AVAudioPlayer?
func playAudioData(){
let path = NSBundle.mainBundle().pathForResource("audio", ofType: "mp3")
var url: NSURL
if let audioResourcePath = path {
url = NSURL.fileURLWithPath(audioResourcePath)!
}else{
return;
}
player = AVAudioPlayer(contentsOfURL: url, error: nil)
messagePlaybackTimer?.invalidate()
messagePlaybackTimer = nil;
messagePlaybackTimer = CADisplayLink(target: self, selector: Selector("messagePlaybackTimerFired"))
messagePlaybackTimer?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
player?.play()
}
func messagePlaybackTimerFired(){
println(player?.currentTime)
}
在 messagePlaybackTimerFired() 中,您可以检查 AVAudioPlayer 的当前时间并根据它触发事件。 (例如 if player?.currentTime > 5 && player?.currentTime < 6 { do something } )
这将使您能够在尽可能接近 5 秒的时间内触发该方法,同时仍然是执行 UI 工作的最佳选择。
当您使用完 CADisplayLink 后(当播放器停止播放时)一定要使其无效。如果你不这样做,它会在你不再需要它时继续发射。
您可以做的另一件事是在 messagePlaybackTimerFired() 中触发 NSNotification,您的 UIViewController 可以订阅通知并在适当的时候显示视图。
我需要在固定时间显示视图,同时 运行 播放 MP3 音频。我正在使用 Swift。有什么建议吗?
使用 NSTimer
或 AVAudioPlayer 的 addPeriodicTimeObserverForInterval:queue:usingBlock:
方法检查该值,当达到特定时间时(很可能)无法获得更新。
哦,对于 Swiftier NSTimer,我建议 this
如果绘图依赖计时器,我不喜欢使用它们。它们可能比屏幕重绘更频繁地触发或与屏幕绘图不同步。我改为使用 CADisplayLink。它类似于计时器,但设计为与屏幕的刷新率同步。你可以实现这样的东西。
var messagePlaybackTimer: CADisplayLink?
var player: AVAudioPlayer?
func playAudioData(){
let path = NSBundle.mainBundle().pathForResource("audio", ofType: "mp3")
var url: NSURL
if let audioResourcePath = path {
url = NSURL.fileURLWithPath(audioResourcePath)!
}else{
return;
}
player = AVAudioPlayer(contentsOfURL: url, error: nil)
messagePlaybackTimer?.invalidate()
messagePlaybackTimer = nil;
messagePlaybackTimer = CADisplayLink(target: self, selector: Selector("messagePlaybackTimerFired"))
messagePlaybackTimer?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
player?.play()
}
func messagePlaybackTimerFired(){
println(player?.currentTime)
}
在 messagePlaybackTimerFired() 中,您可以检查 AVAudioPlayer 的当前时间并根据它触发事件。 (例如 if player?.currentTime > 5 && player?.currentTime < 6 { do something } )
这将使您能够在尽可能接近 5 秒的时间内触发该方法,同时仍然是执行 UI 工作的最佳选择。
当您使用完 CADisplayLink 后(当播放器停止播放时)一定要使其无效。如果你不这样做,它会在你不再需要它时继续发射。
您可以做的另一件事是在 messagePlaybackTimerFired() 中触发 NSNotification,您的 UIViewController 可以订阅通知并在适当的时候显示视图。