音乐播放器计时器

问题描述:

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中称这种方法。除了上面指出的绿线外,没有任何错误。音乐播放器计时器

+0

你确定玩家和playerItem已准备好玩吗? – 2015-06-27 12:34:17

我觉得durationOutlet outlet有问题。

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

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

当您将time.value(即IntTime为IntTime的CMTimeValue)转换为Int时,它会崩溃。它只会在使用32位设备时崩溃。所以,而不是Int我使用Int64,它为我工作。不过,我仍然不确定它的工作原理。所以我建议你尝试这样的事情:
let timeNow = Int64(time.value)/Int64(time.timescale)

很难说没有看到球员是如何设置的。我不相信你可以使用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) 
    } 

} 

这里是一个快速的代码时,玩家在游戏模式来更新滑块。

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); 
      } 
     }