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

时间:2013-11-08 07:18:28

标签: 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=12000ms12s左右。我认为现代计算的精确度更像是原子钟的精确度,在1000小时的镜头之后可能会损失1秒,因此我认为仅仅同步一次进给就足够了。

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

  1. 是否等到有明显的延迟和快进/快退?
  2. 只要有任何差异,它会快进/快退吗?
  3. 纠正这种差异(即套接字信号)本身会导致进一步延迟吗?
  4. 由于在视频中移动到遥远的时间需要比连续播放更长的时间,它如何预测快进/快退的秒数?
  5. 我听到很多人在谈论 ticks (不是昆虫),以及主vlc如何发送 ticks 。但是,我不明白的是这些刻度是如何被解释的:你是否暂时暂停所有其他玩家直到下一个刻度,或者你是否以某种方式调制视频的速度(如果可能的话)在飞行中)?
  6. 注意:我没有播放实际的视频文件,因为它们都是通过每个raspis上的NFS远程访问的。

1 个答案:

答案 0 :(得分:5)

对不起,我没有直接回答你的问题,而是我将如何做到这一点:

我会使用MCI(我对Windows友好,但我认为所有其他玩家必须是类似的东西)

  1. 时间必须在所有客户端上同步,这可能非常棘手
    • 在具有小延迟的快速LAN上,您可以通过服务器向所有客户端发送时间,这就是
    • 在未知延迟(如Internet)上,您无法开始多次从服务器向每个客户端发送时间。在客户端计算服务器和客户端时间之间的平均时间偏移量,之后只需将其添加到客户端时间即可。
    • 如果客户端连接延迟太不稳定,则表示运气不佳
  2. 开放流但无法开始播放
  3. 等待一段时间以确保视频已准备就绪...
  4. 以精确的服务器时间开始在每个客户端上播放

    不要指望精确同步(没有精确的时间同步)。 play命令也可以在不同的机器上以不同的速度执行,但与开放流命令的差异不大(因此对子弹#3的延迟)

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

    这通常不是真的,特别是在网络流媒体上。大多数玩家丢弃帧以进行补偿,但有时如果流未被解码较长时间,则可能导致累积偏移。在这种情况下,您可以实现播放进度(您的抽搐)

    Tics可以是:

    • 播放框架
    • 播放进度时间
    • 播放进度百分比

    抽搐同步:

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

    1. 最好是帧同步

      但需要实现自己的能够进行帧导航的播放器或播放器,这很难正确实现。

    2. 播放进度时间

      是下一个最好的事情。如果您发现偏移量大于某个阈值,则可以暂停或后退/后退。

      倒带问题是无法预测需要花费多少时间因此您可以通过应用此时间来匹配同步播放时间来测量所需的时间并以几个步骤迭代倒带有点棘手)。

    3. 播放进度百分比

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

    4. 希望它有所帮助。