2011-04-03 32 views
2

我試圖從C(C++解決方案也可以)中的套接字接收文件(audio,.CAF)。我有套接字通信工作,用串測試過。我的問題是我不知道什麼要提供給recv(socket,buffer,buffer_size,0)中的第二個參數。我應該做什麼類型的「緩衝」?我基本上想要收到一個音頻文件,然後播放它。但不知道如何接收音頻文件本身。通過套接字接收音頻文件

有什麼想法?

感謝,

羅賓

回答

4

通常情況下,你必須以某種格式編碼的音頻。爲了簡單起見,我們假設它是Wave格式。

做事情的一種方法是封裝音頻塊(比如說50 ms塊)以通過網絡發送。

但是,你不能盲目地通過網絡發送數據,並期望它工作。在您的計算機上,數據可能以一種方式(小端或大端)組織,並且可能在另一臺計算機上以相反方式組織。

在這種情況下,客戶將獲得他認爲與您的目標完全不同的數據。所以,你需要正確地序列化它。一旦你正確地序列化了數據(或者不是,如果兩臺計算機使用相同的endianess!),你可以發送()它和rcev()它,然後把它傳遞給解碼器來處理。

我想提供更多的信息,但這是關於我在這個問題上的知識程度。這實際上取決於你在做什麼,所以很難提供更多的信息,而沒有關於你在做什麼的更多細節(關於音頻格式)。

一些詳細信息:

http://en.wikipedia.org/wiki/Serialization

http://en.wikipedia.org/wiki/Endianness

編輯:正如這個答案的評論中指出的,你應該不必擔心序列化可言,如果您使用的是標準格式。只需將它通過網絡以解碼器可用的塊傳送(例如,一次發送一幀),然後在客戶端解碼這些單獨的幀(或可能是多個幀)。

+0

我相信序列化/字節順序問題應該由文件格式本身來處理,除非它不是跨平臺文件格式。 – user470379 2011-04-03 23:47:50

+0

因此,假設如果我通過網絡傳輸了一些波形幀,我可以合理地預期它會在另一端以正確的方式出現嗎?我從來沒有真正處理過這個問題,因爲我只做過基本的網絡連接。 – 2011-04-03 23:49:43

+0

您可以預期字節序保持與文件格式中指定的相同。這允許您使用不同於字節順序的平臺的任何方法來傳輸文件。文件格式的字節順序可能與目標平臺的字節順序不同,但解碼器應處理該問題。 – user470379 2011-04-03 23:52:24

2

buffer將會是一個指向您分配的數組的指針,用於存儲穿過線路的數據。

它取決於你正在使用的套接字庫,但通常它期望void*(這只是一個通用的指針類型)。

你可能會做這樣的事情:

uint8[1000] myBuffer; 
recv(sock,myBuffer,1000,0); 

它變得非常棘手,因爲這只是給你足夠的空間,8,000bytes,這可能不是足以容納你的音頻文件,所以你必須處理多次recv()調用,直到您獲得整個音頻文件。