【问题标题】:Setting Slider Value to Set SeekToTime in AVPlayer在 AVPlayer 中设置 Slider 值以设置 SeekToTime
【发布时间】:2016-03-31 14:21:27
【问题描述】:

我正在使用Player 库,即使用 AVPlayer 和 AVFoundation,这对我的情况来说非常方便。我成功地播放了视频并添加了一个滑块。我将滑块的最小值设置为 0,最大值设置为视频的持续时间..

此时,为了将滑块连接到当前播放时间,我在 StackOverflow 上使用了this answer。我设置了一个协议并使用了addPeriodicTimeObserverForInterval,因此滑块链接到 currentTime 并随着视频成功移动而移动。

现在,这是我的问题。我想做相反的事情 - 当滑块移动时,设置视频的 currentTime(向前,向后)。

我做了一些研究,发现我应该链接slider.value(在我的例子中是sender.value)是seekToTime,但是我不明白如何将它应用到播放器。如何让滑块控制当前时间?


我不确定我是否正确,但据我了解,第一步应该是:

protocol UserSetsTheTimeDelegate
{
  func userSetsTheTime(result: Int)
}

class ViewController: UIViewController, PlayerDelegate {
       ...

  func sliderValueDidChange(sender:UISlider!) {
     print("value--\(sender.value)")
     self.delegate?.userSetsTheTime(sender.value)
  }
}

然后添加,我想我应该在 Player.swift 中添加 UserSetsTheTimeDelegate,但我在这里感到困惑。


更新

我意识到我可以通过在 ViewController 中使用一个实例并在 Player 类中添加一个方法来将数据发送到 Player.swift。这是第一步。但是现在,随着 currentTime 的更新(通过修改滑块)如此之快,它不允许我操纵滑块值。

【问题讨论】:

  • 有关如何使用seekToTime,请参阅以下内容:stackoverflow.com/questions/31711936/…有关如何将滑块值链接到函数(在您的情况下,是实现seekToTime的函数),请参阅我的答案(使用@ 987654334@) 这里:stackoverflow.com/questions/34459115/…
  • 我应该采取哪些步骤? 1)如我在问题中所示,在 ViewController 中设置协议。 2)添加像public class Player: UIViewController, UserSetsTheTime {这样的代表(对吗?)3)Put that正如你所说,但是放在哪里?如果您可以添加答案,我可以接受。..
  • 对不起,我只能提示你使用上面的线程来实现你当前的时间操纵器,但没有给你和详尽的答案,因此发布为 cmets。也许其他人可以帮助您提供更全面的答案。
  • 希望有人发布详细的答案,因为我很困惑将其适应播放器演示。谢谢你的cmets tho
  • @senty 您可以通过保管箱分享您的代码以便我们提供帮助吗?这里没什么好说的了。

标签: ios swift video avfoundation avplayer


【解决方案1】:

我解决了我的问题。我创建了一个 Player 实例,因此我能够将数据从视图控制器发送回 Player 类。然后我简单地申请了seekToTime()。在这一点上,从视觉上看,它看起来很糟糕,但后来我注意到我可以使用stop()setCurrentTime()play() 以使其看起来更好。

【讨论】:

    【解决方案2】:

    从用户体验的角度来看,最好在滑块上的 touchUp 之后调用 Player 上的 seek() 方法,而不是在值更改时调用。

    正如您所注意到的,您对sliderValueDidChange 的体验很差。

    相反,尝试通过在滑块上的 UIControlEvents.TouchUpInside(例如)上添加目标/动作,然后只寻找。体验应该会更好。

    变量滑块:UISlider! { 设置{ slider.addTarget(self, action: Selector("touchUp:"), forControlEvents: [UIControlEvents.TouchUpInside]) } } func touchUp(sender:AnyObject?) { // player.seek(slider.currentValue) }

    【讨论】:

    • 能否请您更详细地回答如何应用它?非常感谢
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2016-05-10
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多