AVAudioPlayer 可以在预定义的时间间隔触发事件吗?
Posted
技术标签:
【中文标题】AVAudioPlayer 可以在预定义的时间间隔触发事件吗?【英文标题】:can AVAudioPlayer trigger events on predefined intervals? 【发布时间】:2015-05-20 23:20:22 【问题描述】:运行 MP3 音频时,我需要在固定时间显示视图。我正在使用斯威夫特。有什么建议吗?
【问题讨论】:
【参考方案1】:如果绘图依赖于计时器,我不喜欢使用计时器。它们可能比屏幕重绘或与屏幕绘图不同步更频繁地触发。我改用 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 的当前时间并基于此触发事件。 (例如,如果 player?.currentTime > 5 && player?.currentTime
这将允许您在尽可能接近 5 秒的时间内触发该方法,同时仍然是进行 UI 工作的最佳选择。
当您完成 CADisplayLink(当播放器停止播放时)时,请务必使其无效。如果你不这样做,它会在你不再需要它时继续发射。
您可以做的另一件事是在 messagePlaybackTimerFired() 中触发 NSNotification,您的 UIViewController 可以订阅通知并在适当时显示视图。
【讨论】:
【参考方案2】:使用 NSTimer
或 AVAudioPlayer 的 addPeriodicTimeObserverForInterval:queue:usingBlock:
方法来检查值,(很可能)到达特定时间时无法获取更新。
哦,对于更快捷的 NSTimer,我建议 this
【讨论】:
以上是关于AVAudioPlayer 可以在预定义的时间间隔触发事件吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 5 中使用 AV 音频播放器在特定时间间隔内快进或快退音频(如歌曲)?
自定义 tableviewcell 上的 UISlider 和 UILabel 在第二次播放音频之前不会使用 avaudioplayer 更新