【问题标题】:can AVAudioPlayer trigger events on predefined intervals?AVAudioPlayer 可以在预定义的时间间隔触发事件吗?
【发布时间】:2015-05-20 23:20:22
【问题描述】:

运行 MP3 音频时,我需要在固定时间显示视图。我正在使用斯威夫特。有什么建议吗?

【问题讨论】:

    标签: swift ipad avfoundation avaudioplayer


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多