2010-05-08 66 views
37

我正在設計客戶端/服務器音頻系統,可以通過網絡任意流式傳輸音頻。一臺中央服務器輸出一個音頻流,x個客戶端接收音頻數據並播放。到目前爲止,還沒有魔術需要,我甚至有這種情況與VLC媒體播放器開箱即用。通過網絡同步音頻

但是,棘手的部分似乎是同步音頻播放,以便所有客戶端都可以聽到同步(只要人們聽到同步,實際延遲就可以被允許)。

我的問題是如果有任何已知的方法或算法用於這種類型的同步問題(視頻可能以相同的方式解決)。我自己最初的想法是圍繞同步物理機器之間的時鐘,從而創建一個虛擬的「主定時器」,並以某種方式對齊音頻數據包。

有些產品已經解決了這個問題(但仍然不是我的整體使用情況足夠了):

http://www.sonos.com

http://netchorus.com/

任何指針是最歡迎的。 謝謝。

PS:This related question好像早就死了。

+0

與什麼同步?你的意思是去抖或同步不同的頻道或與視頻同步或...? – KillianDS 2010-05-08 18:23:29

+8

@KillianDS:同步,以便兩個客戶端播放完全相同的音頻,就像他們是連接到同一個音響系統的兩個揚聲器一樣。 – sharkin 2010-05-08 19:16:06

+0

嘿你知道如何在Android中使用p4sync嗎? – Kaushal28 2017-02-15 14:07:33

回答

28

Ryan Barrett在his blog上寫下了他的發現。

他的解決方案涉及使用NTP作爲一種方法來保持同步的所有時鐘:

嚴重的是,雖然只有一個 招p4sync,那就是它 如何使用NTP。一臺主機充當p4sync 服務器。其他p4sync客戶端 使用SNTP將其系統時鐘同步到 服務器的時鐘。當 服務器開始播放歌曲時,它會將時間記錄到毫秒。 客戶端然後檢索該時間戳,計算當前時間與該 時間戳之間的差值 ,並且將該遠處的 查找到歌曲中。

+2

+2如果可以的話,這種材料正是我所追求的,謝謝! – sharkin 2010-05-08 19:09:18

+0

如何在android中添加這個提到的庫? – Kaushal28 2017-02-15 14:18:18

0

「......只要它被人類聽衆認爲是同步的」 - 很難做到這一點,因爲耳朵不如眼睛寬容。特別是如果你想通過無線網絡來做到這一點。

我會首先嚐試使用基於網絡的技術,由服務器通過Javascript遠程控制閃存音頻播放器 。

如果這給了不好的結果,那麼我會嘗試通過使用類似python(與pygame)來獲得更多的控制權。

如果正在取得進展,我還會嘗試使用ChucK並嘗試使用ALSA音頻庫進行一些低級編程。

如果沒有什麼令人滿意的東西出來,我會來重溫這篇文章,實際上讀一些專業的音頻編程專家明智的東西,如果我的生計依靠它,可能會最終爲商業NetChorus應用程序分配14英鎊,或者相似的東西。

+0

感謝您的回覆。如前所述,現有產品似乎可以解決令人滿意的問題,但是在我的特殊用例的其他部分卻存在缺陷。 – sharkin 2010-05-08 18:08:49

+0

我很好奇,你打算做什麼? – zaf 2010-05-08 18:18:24

9

困難的問題,但可能的。

使用NTP或tictoc爲您自己提供一個已知速率的同步時鐘,就係統時間源而言。

同時保持一個估計器運行在您的聲音時鐘的速率;這樣做的常用方法是使用與播放相同的聲音設備進行錄製,通過預裝了幻數的緩衝區錄製聲音,並查看聲卡在同步時鐘測量的時間內到達的位置(反之亦然,請參閱在同步時鐘上執行已知數量的採樣需要多長時間)。你需要繼續這樣做,時鐘會相對於網絡時間漂移。

因此,現在您可以確切知道您的聲卡時鐘每秒需要輸出多少個樣本以匹配同步時鐘的速率。因此,您可以按照該速率對從網絡接收的樣本進行插值,如果您需要趕上或退回到最後一個緩衝區的位置,可以加或減修正。您將需要非常小心地進行插值,以避免引入音頻失真;對於您需要的算法,有代碼here的例子,但在開始加速之前,它會有相當多的讀數。

如果您的源是實時錄製,當然,您必須先測量該聲卡的採樣率並在發送之前插入網絡時間採樣。

9

查看微軟研究院的Tom Blank的論文An Internet Protocol Sound System。他解決了你正在處理的確切問題。他的解決方案涉及在計算機之間同步時鐘,並使用時間戳讓它們各自同時播放。這種方法的缺點是延遲。要使所有時鐘同步,需要在網絡上以最大延遲時間戳記時間。

6

根據場地的大小和形狀,讓一切在同步是比較容易的部分,讓一切聲音正確的是一種藝術形式本身,如果可能的話。從技術方面來說,最困難的部分是找出從同步時間線到實際聲音輸出的延遲。具有相同的硬件和低延遲軟件框架(ASIO,JACK)在這裏肯定有幫助,校準也是如此。提前或主動。否則,它只是將時間線與NTP同步,並使用音頻音調的閉環反饋來將輸出與商定的時間線同步。

更大的問題是聲音需要花費相當長的時間來傳播。距離10米的距離已經有30毫秒的延遲 - 足以導致聲音定位。加倍,你進入惱人的回聲領域。專業音頻設置實際上是有目的地引入延遲,使用更多數量的高音揚聲器並與混響一起播放,以避免聽衆喧囂的回聲。

+0

如果您設法讓不同的計算機連續同步,那麼引入延遲(以及延遲其連接的揚聲器)將變得微不足道。 – puk 2013-11-08 10:15:04

+0

引入延遲確實是微不足道的,如果聆聽位置不是固定點,那麼確定延遲應該很難。 – 2013-11-09 21:03:33

+0

是的,我同意,如果它是一個固定點,你可以測試不同的值。但是,如果它是一個移動的人,或者多個人,或許最好甚至不嘗試 – puk 2013-11-09 23:26:53