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这样的做法是什么?
注意:我没有流式传输实际的视频文件,因为它们都是通过每个raspis上的NFS远程访问的.
抱歉,我没有直接回答您的问题,而是我将如何处理:
我会使用MCI(我对Windows友好,但我认为所有其他播放器都必须类似)
在精确的服务器时间开始在每个客户端上播放
不要期望完全同步(没有精确的时间同步)。同样,播放命令可以在不同的机器上以不同的速度执行,但与开放流命令的差别不大(因此,项目符号3的延迟)
这种方法的问题在于它假定播放与时间同步
尤其是在网络流媒体上,通常情况并非如此。大多数播放器会丢帧以进行补偿,但是有时如果长时间不对流进行解码,则可能导致累积偏移。在这种情况下,您可以实现播放进度(您的声音)
抽动可以是:
抽动同步:
在所有情况下,您都必须从项目符号1或任何其他项目实现时间同步。共有三种基本方法:
最好是帧同步
但需要实现自己的播放器或具有帧导航功能的播放器,这很难正确实现。
播放进度时间
其次是最好的东西。如果您发现偏移量大于某个阈值,请暂停或后退/快退。
倒带的问题在于,无法预测需要多少时间,因此您可以测量该时间,并应用此时间来匹配同步的播放时间,从而分几步迭代倒带(有点棘手)。
播放进度百分比
与播放进度时间几乎相同,但分辨率差很多。它仅适用于非常大的时间偏移。不适合于同步本身,仅适用于问题检测。如果检测到问题,则停止所有客户端,并以新的确切服务器时间启动,或者倒带+延迟,然后再次开始播放。我知道这很糟糕,但并非所有播放器都支持播放帧/时间通知。
希望它能有所帮助。