AVPlayer SeekToTime 不工作。每次从头开始

Posted

技术标签:

【中文标题】AVPlayer SeekToTime 不工作。每次从头开始【英文标题】:AVPlayer SeekToTime not working. Starting from beginning everytime 【发布时间】:2015-07-29 21:59:30 【问题描述】:

我在使用 UISliderAVPlayer 清理方法时遇到问题。每次调用该方法时,播放器都会从 0 重新启动。我尝试调试,似乎滑块值是正确的,但是当我 Step Over 时,它设置为 0,因此播放器重新启动。这是我尝试过的:

    var desiredTime = CMTimeMake(Int64(self.progressSlider.value), 1)

    AudioManager.sharedInstance.audioPlayer.seekToTime(desiredTime)

我也尝试过查看类似的问题,发现当我尝试他们的解决方案时也是如此。

感谢您的帮助。

【问题讨论】:

您是否将滑块的最小值设置为 0 并将最大值设置为您正在播放的 AVAsset 的持续时间? 谢谢@MichaelL。这行得通!但是如何将progressSlider.value 更新为desiredTime?现在它停留在我拖动它的位置。 【参考方案1】:

方法的使用不正确。您可以在图书馆中查找。

var desiredTime = CMTimeMake(self.progressSlider.value *1000, 1000);
AudioManager.sharedInstance.audioPlayer.seekToTime(desiredTime)

【讨论】:

【参考方案2】:

正如我在评论中指出的,您需要将滑块的最小值设置为 0,并将其最大值设置为正在播放的资产的持续时间。

要让滑块在播放器播放时移动,请为播放器添加一个周期性观察者。例如:

CMTime interval = CMTimeMakeWithSeconds(.25,1000); [_player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock:
    (CMTime time)) NSTimeInterval t = CMTimeGetSeconds(time);
         mySlider.value = t; ];

(您可能需要对 self 的弱引用才能访问 mySlider。) 方块的时间参数是玩家的当前时间。

当用户滑动时,使用 seekToTime 设置玩家位置。

一个警告:虽然这可行,但滑块的增量将显示为拇指的小跳跃。我还没有想出让滑块连续移动的简单方法——可能值得自己提出一个问题。

【讨论】:

这个例子中的(.25,1000)是什么意思?这是我从您在评论中所说的内容中尝试的:let duration = Float(CMTimeGetSeconds(AudioManager.sharedInstance.audioPlayer.currentItem.asset.duration)) progressSlider.minimumValue = 0 progressSlider.maximumValue = duration var desiredTime = CMTimeMake(Int64(self.progressSlider.value), 1) AudioManager.sharedInstance.audioPlayer.seekToTime(desiredTime)。这是可行的,但是我应该在哪里实施您的示例? 查看 CMTime 的文档 - 它解释了参数的含义。 1000 是任意的 - 我使用它只是因为它使调试更容易。在处理时间时,最好使用 60 的倍数。至于你的其他问题,这取决于你的整体设计,所以我无法回答。我觉得我已经完全回答了你原来的问题。如果您还有其他问题,请作为新问题提出。

以上是关于AVPlayer SeekToTime 不工作。每次从头开始的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer seekToTime 不正确使用 UISlider

AVPlayer seekToTime:循环播放短视频时性能不佳

AVPlayer seektotime with Pangesturerecognizer

AvPlayer seekToTime 问题

AVPlayer seekToTime 导致播放器停止播放

iOS AVPlayer seektotime 锁定在某些点