2011-03-11 189 views
3

我製作了一個媒體播放器,基本上播放通過文本文件安排的任何內容。玩家還可以在多臺機器(PC)上播放完全相同的剪輯。問題是同步。每臺機器都開始播放同一個視頻,但它們出來的時間大約是400毫秒,看起來很糟糕,如果有聲音,它會更糟糕。通過網絡同步視頻播放

我目前做的是:

一體機設置爲主機和所有其他的機器都設置爲奴隸。主人決定將播放什麼項目。它等待來自每個從屬裝置的消息,一旦所有從屬裝置連接(或在超時之後),它就廣播需要播放的文件的項目ID。所有機器然後開始播放該文件。

我也試過:

我認爲,文件加載時間可能是在同步失配的主要驅動因素,所以我chankged代碼做到以下幾點。

大師仍然決定要播放什麼文件。它等待來自每個從屬設備的連接消息(或超時)並傳輸要播放的文件的項目標識。所有機器開始播放該文件,但立即暫停播放。主站然後再次等待來自每個從站的準備好的消息。一旦所有從屬響應,主設備就會向所有從設備發送播放消息。所有的機器然後繼續文件。

這不幸並沒有改善這個問題。我現在很確定同步不匹配是由於網絡延遲。我怎樣才能彌補這一點?或者,也許可以確定每個奴隸的延遲?

所有網絡通信都使用winsock完成。

任何想法或想法,非常感謝。

回答

1

您可以使用已知的流協議,如RTP(或其他)來完成這項工作。通過網絡讀取文件(這看起來像是在做什麼)很容易出現網絡延遲,並且如果精度要求在毫秒級以內 - 那麼您就會遇到實時限制。

+0

我不是流媒體。播放的文件本地存儲在每臺機器上。主人只是通知奴隸要播放哪個文件以及何時播放。只有消息通過網絡發送。我可以延遲100ms或更短的時間。 – Nemesis 2011-03-11 09:45:34

+0

@Nenesis - 那就更簡單了。使用NTP同步時鐘,你很好。 – littleadv 2011-03-11 19:41:05

+0

Windows時間服務無法比大約1-2秒範圍更準確地維護系統時間。 – Nemesis 2011-03-14 08:27:34

2

就我而言,最接近完美同步它們的就是這個。

部分解決:

站長:發送播放消息時間戳給客戶。
客戶端:收到播放消息時,回覆確認。閱讀時間戳,計算消息到達的時間長度,並延遲以該時間差開始播放。
主人:當收到確認消息時,立即播放。

問題是您仍然有多個確認,所以如果往返時間的平均偏差過高,您仍然會有很大的不同步。一個解決方案可能是爲每個客戶跟蹤某種平滑的往返時間估算器。

替代解決方案:

站長:當您發送播放消息,發送到客戶手中開始播放的開始時間(最高的所有客戶端之間的往返時間),並應安排回放提供的時間。
客戶端:當收到播放信息時,他們應該安排播放時間。

+0

+1替代解決方案。迄今爲止最簡單。 – MSalters 2011-03-11 08:37:13

+0

也想過這個。爲此,所有機器的時間必須同步(小於100毫秒),通常情況並非如此。但是,Windows時間服務不能比大約1-2秒範圍更準確地維護系統時間。 – Nemesis 2011-03-11 11:11:01

1

你可以ping從主機的奴隸機器獲得延遲抵消...如果它是所有本地它可能沒有什麼差異。

此外,您可能要循環播放您的消息來播放該文件,因此會引入延遲,具體取決於您首先與哪個機器通話。

您可能可能會同時向所有聽音機廣播以避免這種情況。

+1

如果它始終是同一個訂單中的同一臺電腦,只是在未暫停時間之前向每個客戶發送一個睡眠因素, – TonyM 2011-06-15 16:39:03