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 更新

AVAudioPlayer 没有响应停止命令?

无法让 AVAudioPlayer 停止播放

在 iPhone 上振动时播放自定义声音

如何将本地通知重复间隔设置为自定义时间间隔?