Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用什么算法/方法同步多个视频播放器_Algorithm_Video_Media Player - Fatal编程技术网

Algorithm 使用什么算法/方法同步多个视频播放器

Algorithm 使用什么算法/方法同步多个视频播放器,algorithm,video,media-player,Algorithm,Video,Media Player,动机: 我目前正在尝试在两个联网的Raspi上同步两个视频。我尝试从桌面(http和udp)进行实时流传输,但每个raspi仍然以明显的延迟打开流。接下来,我尝试在raspi上安装vlc并与桌面vlc同步,但也没有成功。我尝试使用shell脚本在两个raspis上几乎同时启动omxplayer,但也失败了。最后,我使用一个C脚本在几乎相同的时间启动两个OMXPlayer,但也失败了。最终,我认为不可能控制omxplayer何时开始实际播放视频文件 当前进度: 因此,现在,我正在修改omxplay

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

当前进度: 因此,现在,我正在修改omxplayer的代码,以使用套接字同步两个omxplayer,但我想知道类似vlc的东西在同步其视频客户机时采取了什么方法,从而避免重新发明轮子。我可能是错的,但我注意到,通过查看详细的输出和调试语句,一个播放器相对于另一个播放器会损失时间,例如在播放视频时,这种差异会逐渐增大,2-3分钟后超过200毫秒。我觉得这非常令人不安。这意味着2小时后,差值将为
60*200ms=12000ms
或大约
12s
。我认为现代计算的精度更像原子钟,在1000小时的镜头后可能会丢失1s,因此我认为仅仅同步一次提要就足够了

问题: 如果不同的玩家必须同步,像vlc这样的东西是如何做到的

  • 它是否会等到出现明显的延迟和快进/快退
  • 它是否会在有任何差异时快进/快退
  • 纠正这种差异(即插座信号)本身是否会导致进一步延迟
  • 由于在视频中移动到较远的时间比连续播放时间长,它如何预测快进/快退的秒数
  • 我听到很多人谈论蜱虫(不是昆虫),以及主vlc是如何发出蜱虫的。然而,我不明白的是这些滴答声是如何解释的:你是暂时暂停所有其他播放器直到下一个滴答声,还是以某种方式调节视频的速度(如果这在运行中是可能的话)

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

    很抱歉,我没有直接回答您的问题,但我会这样做:

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

  • 必须在所有客户端上同步时间,这可能非常棘手
    • 在具有较小延迟的快速局域网上,您可以通过服务器向所有客户端发送时间,就是这样
    • 在未知的延迟(如Internet)上,您不能将时间从服务器多次发送到每个客户端。在客户端,计算服务器和客户机时间之间的平均时间偏移量,然后将其添加到客户机时间,就是这样
    • 如果客户端连接延迟太不稳定,您就倒霉了
  • 打开流媒体但不开始播放
  • 等待一段时间以确保视频已准备好播放…
  • 在准确的服务器时间在每个客户端上开始播放

    不要期望精确同步(没有精确的时间同步)。此外,play命令可以在不同的机器上以不同的速度执行,但与open stream命令相差不大(因此bullet#3上的延迟)

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

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

    抽搐可以是:

    • 播放帧
    • 播放进度时间
    • 播放进度百分比
    Tics同步:

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

  • 最好的方法是帧同步

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

  • 播放进度时间

    这是次好的事情。如果您注意到偏移量大于某个treshold,请暂停或向后/向前倒带

    回放的问题在于,无法预测需要多少时间,因此您可以测量所需的时间,并通过应用此时间以匹配同步播放时间(有点棘手),在几个步骤中迭代回放

  • 播放进度百分比

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


  • 希望能有点帮助。

    是的!我希望在场的人能如此礼貌和专业。到目前为止,我接受的最佳答案之一是您是否使用
    ntp
    在主机之间同步时间?vlc提供了几个选项,允许在多台主机上同步播放。您尝试过哪些选项,哪些不起作用?@J.F.Sebastian我正在使用ntp,但使用TCP消息向服务器发送信号更容易