音乐播放器计时器
问题描述:
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
中称这种方法。除了上面指出的绿线外,没有任何错误。音乐播放器计时器
答
当您将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);
}
}
你确定玩家和playerItem已准备好玩吗? – 2015-06-27 12:34:17