【问题标题】:Keeping a scrubber on one device in sync with a video playing on another使一台设备上的洗涤器与另一台设备上播放的视频保持同步
【发布时间】:2013-02-14 08:46:20
【问题描述】:

我有两台 iOS 设备,并且都有相同视频的副本。两台设备都通过蓝牙进行通信。视频仅在一个设备上播放,而另一个是遥控器。 “远程控制”设备需要一个显示视频在持续时间中的位置的浏览器。

让滑动条与视频播放保持同步的最佳方式是什么?

我使用 AVPlayer 播放视频,使用 Gamekit 进行蓝牙连接。

【问题讨论】:

  • 获取播放器设备发送当前位置最大值。根据所用时间更新擦洗器,并使用当前位置调整擦洗器位置。然后,您需要做的就是响应停止、暂停、重新启动等。您希望控件的粒度有多细,是否应该让scrubber 也控制视频播放位置,还是应该只指示位置?
  • 需要标明位置,也需要控制。播放视频的设备无法控制。 “远程控制”设备将启动/停止视频。我不太确定的问题是网络延迟 - 到远程控制设备说播放时,已经有时间接收消息和实际开始播放的时间了。我需要用户不要注意到任何差异。

标签: ios bluetooth gamekit avplayer


【解决方案1】:

呵呵,工作起来会很有趣。延迟是你总会得到的东西,所以你需要一些缓解策略。我建议看看人们处理滞后的某些方式。我可以建议的一件事是将您的两种消息类型分为关键和非关键。例如,停止/暂停/播放/重启命令对我来说很重要。您希望该消息通过,并且您将继续尝试直到它通过。

诸如在两个方向(玩家到遥控器,遥控器到玩家)上改变擦洗器位置的消息是非关键的。您正在发送它们,但您不应该浪费时间来确认响应或确保它们已送达。有点类似于UDP和TCP之间的区别。这些将只是通过连接发送,我基本上不会比(scrubberposition,position_as_time,identifier_number)更复杂。记录您获得的最后一个标识符号(标识符号是一个单调递增的数字)并丢弃任何低于此数字的消息,并更新到任何更高数字的位置,并更新您存储的 identifier_number。

我希望这有意义/有帮助,如果我需要进一步解释,请告诉我,祝你好运

【讨论】:

  • 我应该在播放器端使用 addPeriodicTimeObserverForInterval 并为每次更新发送 UDP 消息,还是应该在远程端使用 NSTimer 来模拟滑块移动并可能进行小的修正?使用 addPeriodicTimeObserverForInterval 时,我认为 5 秒视频大约有 1000 条消息。
  • 您可能不需要发送那么多消息。人们无法在 5 秒内分辨出 50 次更新之间的区别,更不用说 1000 次了。你可能不得不尝试什么是最好的方法。我的一句话是,除非倒带打开,否则不要让洗涤器向后移动。人们不会注意到洗涤器是否经常减速/暂停,但他们会注意到它是否在不应该倒退的时候倒退。您的解决方案必须结合使用两者。此外,蓝牙耗电,因此限制消息是个好主意。
  • 我刚刚意识到您可以自定义 addPeriodicTimeObserverForInterval 的时间间隔。我在看 AVPlayerDemo。示例代码根据滑块的宽度和视频的长度调整间隔。视频越长,间隔越长。似乎对于较短的视频,您可以获得更频繁的间隔。例如,我刚刚做了 MAX(0.25f, interval)。进一步的测试将显示该值应该是什么。
  • 啊,很高兴知道。很高兴你得到了一些结果:)
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2018-11-19
  • 1970-01-01
相关资源
最近更新 更多