通过网络同步视频播放

Posted

技术标签:

【中文标题】通过网络同步视频播放【英文标题】:Sync video play over network 【发布时间】:2011-03-11 07:22:51 【问题描述】:

我制作了一个媒体播放器,它基本上可以播放通过文本文件安排的任何内容。播放器还可以在多台机器(PC)上播放完全相同的剪辑。问题是同步。相同的视频开始在每台机器上播放,但它们在大约 400 毫秒后播放,这看起来很糟糕,如果有声音那就更糟了。

我现在做的是:

一台机器被设置为主机,所有其他机器被设置为从机。主人决定播放什么项目。它等待来自每个从站的消息,一旦所有从站都连接(或超时后),它会广播需要播放的文件的项目 ID。然后所有机器开始播放该文件。

我也尝试过:

我认为文件加载时间可能是同步不匹配的主要驱动因素,因此我更改了代码以执行以下操作。

主人仍然决定播放什么文件。它等待来自每个从属设备的连接消息(或超时)并传输要播放的文件的项目 ID。所有机器都开始播放该文件,但立即暂停。然后主机再次等待来自每个从机的就绪消息。一旦所有从机响应,主机就会向所有从机发送播放消息。然后所有机器继续该文件。

不幸的是,这并没有改善问题。我现在很确定同步不匹配是由于网络延迟造成的。我该如何弥补这一点?或者也许确定每个从站的延迟?

所有网络通讯都是用winsock完成的。

非常感谢任何想法或想法。

【问题讨论】:

【参考方案1】:

据我所知,最接近完美同步它们的是这个。

部分解决方案:

Master:向客户端发送带有时间戳的播放消息。 客户端:收到播放消息后,以 acknowledgment 响应。读取时间戳,计算消息到达所用的时间,并通过该时间差延迟开始播放。 师父:收到确认消息后,立即播放。

问题是您仍然会有多个确认,因此如果往返时间的平均偏差太高,您仍然会有很大的去同步。对此的一种解决方案可能是跟踪每个客户端的某种平滑往返时间估计器。

替代解决方案:

Master:当您发送播放消息时,发送一个开始时间(所有客户端中最长的往返时间)让客户端开始播放,并应在提供的时间安排播放。 客户端:当收到播放消息时,他们应该在提供的时间安排播放。

【讨论】:

也考虑过这个问题。为此,必须同步所有机器的时间(小于 100 毫秒),但通常情况并非如此。但是,Windows 时间服务无法比大约 1-2 秒范围更准确地维护系统时间。【参考方案2】:

您可以使用已知的流式传输协议,例如 RTP(或其他)来完成这项工作。通过网络读取文件(这似乎是您正在做的事情)很容易出现网络延迟,如果所需的精度以毫秒为单位 - 您会受到实时限制。

【讨论】:

我没有流式传输。播放的文件本地存储在每台机器上。主机只是通知从机播放哪个文件以及何时播放。只有消息通过网络发送。我可以忍受 100 毫秒或更短的延迟。 @Nemesis - 这样就更容易了。使用 NTP 同步时钟,一切顺利。 Windows 时间服务无法比大约 1-2 秒范围更准确地维护系统时间。 我说的是“Windows 时间服务”吗?抱歉,我的意思是“NTP”。 谢谢@littleadv。但是我真的不想实现一个完整的 NTP。 Windows 时间服务同步到 NTP 服务器,我认为这就是您的意思。【参考方案3】:

您可以从主机 ping 从机以获取延迟偏移量...如果都是本地的,则可能没有区别。

此外,您可能会循环播放您的消息来播放文件,因此这也会引入延迟,具体取决于您首先与哪些机器交谈。

您可以同时向所有监听机器广播以避免这种情况。

【讨论】:

如果它始终是相同顺序的同一台电脑,只需在取消暂停时间之前向每个客户端发送一个睡眠,这会影响到

以上是关于通过网络同步视频播放的主要内容,如果未能解决你的问题,请参考以下文章

即时通讯——详解音视频同步技术

MPMoviePlayerController 音频/视频不同步

用stm32控制摄像头,把视频同步传到电脑上,给一个大概的设计思路就可以了,谢谢大家

带有时间戳的音频和视频同步

音视频同步

流媒体开发3封装格式+音视频同步