动机: 我目前正在尝试在两个联网的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这样的做法是什么呢?
注意:我没有播放实际的视频文件,因为它们都是通过每个raspis上的NFS远程访问的。
答案 0 :(得分:5)
对不起,我没有直接回答你的问题,而是我将如何做到这一点:
我会使用MCI(我对Windows友好,但我认为所有其他玩家必须是类似的东西)
以精确的服务器时间开始在每个客户端上播放
不要指望精确同步(没有精确的时间同步)。 play命令也可以在不同的机器上以不同的速度执行,但与开放流命令的差异不大(因此对子弹#3的延迟)
这种方法的问题在于它假设播放与时间同步
这通常不是真的,特别是在网络流媒体上。大多数玩家丢弃帧以进行补偿,但有时如果流未被解码较长时间,则可能导致累积偏移。在这种情况下,您可以实现播放进度(您的抽搐)
Tics可以是:
抽搐同步:
在所有情况下,您必须从项目符号#1或任何其他项目实施时间同步。有三种基本方法:
最好是帧同步
但需要实现自己的能够进行帧导航的播放器或播放器,这很难正确实现。
播放进度时间
是下一个最好的事情。如果您发现偏移量大于某个阈值,则可以暂停或后退/后退。
倒带问题是无法预测需要花费多少时间因此您可以通过应用此时间来匹配同步播放时间来测量所需的时间并以几个步骤迭代倒带有点棘手)。
播放进度百分比
几乎与播放进度时间相同但分辨率更差。它仅适用于非常大的时间偏移。不适用于同步本身,但仅适用于问题检测。如果检测到问题,则停止所有客户端并开始新的确切服务器时间和/或倒带+延迟再次开始播放。这很糟糕我知道,但并非所有播放器都支持播放帧/时间公告。
希望它有所帮助。