音乐播放器计时器

时间:2014-09-19 19:56:42

标签: swift uislider audio-player

func configurePlayer() {
  player.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1, 1), queue: dispatch_get_main_queue()) { (CMTime) -> Void in
    var timeNow = Int(self.player.currentTime().value) / Int(self.player.currentTime().timescale)
    var currentMins = timeNow / 60
    var currentSec = timeNow % 60
    var duration: NSString = "\(currentMins):\(currentSec)"
    self.durationOutlet.text = duration // <<- Green line here
    self.sliderOutlet.value = Float(timeNow)
  }
}

我正在创建一个音乐播放器并且一切正常,但是当我尝试将持续时间计时器计数或滑块设置为动画时,它会崩溃。它工作正常2秒,但随后崩溃。我在viewDidLoad中调用此方法。除了我在上面指出的绿线外,没有任何错误。

4 个答案:

答案 0 :(得分:0)

我认为durationOutlet插座存在问题。

因此,请确保从故事板正确连接durationOutlet

HERE是更多信息的示例项目。

答案 1 :(得分:0)

当您将作为Int64的CMTimeValue的time.value转换为Int时,它会崩溃。它只会在您使用32位设备时崩溃。所以我使用Int64代替Int,它对我有用。不过,我仍然不确定它为什么会起作用。所以我建议你尝试这样的事情:
let timeNow = Int64(time.value) / Int64(time.timescale)

答案 2 :(得分:0)

如果不了解播放器的设置方式,很难说清楚。我不相信您可以使用AVAudioPlayer流式传输托管在远程服务器上的文件。为此你必须使用AVPlayer。您可能希望添加一些日志记录以打印出现在的内容,以便查看它在中断时的值。如果您使用的是AVPlayer,则需要检查AVPlayerItem的状态是否为ReadyToPlay。尝试这样的事情:

player.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1, 1), queue: dispatch_get_main_queue()) { (CMTime) -> Void in

    if self.player.currentItem?.status == .ReadyToPlay {

      var timeNow = Int(self.player.currentTime().value) / Int(self.player.currentTime().timescale)

      var currentMins = timeNow / 60
      var currentSec = timeNow % 60

      var duration: NSString = "\(currentMins):\(currentSec)"

      self.durationOutlet.text = duration // <<- Green line here

      self.sliderOutlet.value = Float(timeNow)
    }

}

答案 3 :(得分:0)

以下是播放器处于播放模式时swift更新滑块的代码。

player.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1, 1), queue: dispatch_get_main_queue()) { (CMTime) -> Void in
            if self.player.currentItem?.status == .ReadyToPlay {
                let thePlayerItem : AVPlayerItem = self.player.currentItem!
                let duration : Float64 = CMTimeGetSeconds(thePlayerItem.duration);
                let time : Float64 = CMTimeGetSeconds(self.player.currentTime());
                self.sliderVideoPlayer.value = Float (time / duration);
            }
        }