用于同步多个视频播放器的算法/方法

puk*_*puk 7 algorithm video media-player

动机: 我目前正试图在两个联网的raspis上同步两个视频.我尝试从桌面(http和udp)实时流式传输,但每个raspi仍然以明显的延迟打开流.我接下来尝试在raspi上安装vlc并与桌面vlc同步,但这也不起作用.我尝试使用shell脚本在两个raspis上几乎同时启动omxplayer,但也失败了.最后,我使用C脚本在几乎相同的时间启动两个omxplayers,这也失败了.最终,我认为无法控制omxplayer何时开始实际播放视频文件.

当前进展: 因此,现在,我正在修改omxplayer的代码以使用套接字同步两个omxplayers,但我想知道vlc在同步其视频客户端时采用的方法,以便不重新发明轮子.我可能是错的,但我注意到,通过查看详细的输出和调试语句,一个玩家将失去相对于另一个玩家的时间,这样当视频播放时,这种差异会累积,并且在2-3分钟后超过200女士.我觉得这非常令人不安.这意味着在2小时后,差异将是60*200ms=12000ms或在附近12s.我认为现代计算的精确度更像是原子钟的精确度,在1000小时的镜头之后可能会损失1秒,因此我认为只需同步一次这样就足够了.

问题: 如果不同的玩家必须进行常规同步,那么像vlc这样的做法是什么?

  1. 它会等到有明显的延迟和快进/快退吗?
  2. 只要有任何差异,它会快进/快退吗?
  3. 纠正这种差异(即套接字信号)本身会导致进一步的延迟吗?
  4. 由于在视频中移动到远处的时间比连续播放要长,它如何预测快进/快退的秒数?
  5. 我听到很多人都在谈论滴答声(不是昆虫),以及主vlc如何发出滴答声.然而,我不明白的是这些刻度是如何被解释的:你是否暂时暂停所有其他玩家直到下一个刻度,或者你是否以某种方式调制视频的速度(如果甚至可以在飞行中)?

注意:我没有流式传输实际的视频文件,因为它们都是通过每个raspis上的NFS远程访问的.

Spe*_*tre 6

抱歉,我没有直接回答您的问题,而是我将如何处理:

我会使用MCI(我对Windows友好,但我认为所有其他播放器都必须类似)

  1. 必须在所有客户端上同步时间,这确实很棘手
    • 在快速的局域网上,延迟很小,您可以通过服务器将时间发送到所有客户端,仅此而已
    • 在未知延迟(例如Internet)上,您不能相反地开始从服务器向每个客户端发送时间很多次。在客户端,计算服务器和客户端时间之间的平均时间偏移,然后将其添加到客户端时间即可。
    • 如果客户端连接延迟太不稳定,那么您就不走运了
  2. 打开流,但不开始播放
  3. 请稍等片刻,以确保视频已准备好播放...
  4. 在精确的服务器时间开始在每个客户端上播放

    不要期望完全同步(没有精确的时间同步)。同样,播放命令可以在不同的机器上以不同的速度执行,但与开放流命令的差别不大(因此,项目符号3的延迟)

这种方法的问题在于它假定播放与时间同步

尤其是在网络流媒体上,通常情况并非如此。大多数播放器会丢帧以进行补偿,但是有时如果长时间不对流进行解码,则可能导致累积偏移。在这种情况下,您可以实现播放进度(您的声音)

抽动可以是:

  • 播放的帧
  • 播放进度时间
  • 播放进度百分比

抽动同步:

在所有情况下,您都必须从项目符号1或任何其他项目实现时间同步。共有三种基本方法:

  1. 最好是帧同步

    但需要实现自己的播放器或具有帧导航功能的播放器,这很难正确实现。

  2. 播放进度时间

    其次是最好的东西。如果您发现偏移量大于某个阈值,请暂停或后退/快退。

    倒带的问题在于,无法预测需要多少时间,因此您可以测量该时间,并应用此时间来匹配同步的播放时间,从而分几步迭代倒带(有点棘手)。

  3. 播放进度百分比

    与播放进度时间几乎相同,但分辨率差很多。它仅适用于非常大的时间偏移。不适合于同步本身,仅适用于问题检测。如果检测到问题,则停止所有客户端,并以新的确切服务器时间启动,或者倒带+延迟,然后再次开始播放。我知道这很糟糕,但并非所有播放器都支持播放帧/时间通知。

希望它能有所帮助。