2012-02-14 37 views
0

我正在開發基於java的IP語音系統。音頻可以通過發送者和接收者使用線程發回。但是,使用不同的數據報包時,它們會造成一些數據包丟失。因此,我試圖爲發送的每個數據包添加一個標題,以便在接收時更容易識別丟失了哪個確切的數據包,因此我們可以開發一些補償方法。向數據包添加序號(標頭) - VoIP - Java

我已經開始的東西,但我不知道它的豐富思想,總體思路是,以2個字節添加到陣列,並分配這些2個額外的字節的報頭信息,這是一個序列號每個數據包...

Vector<byte[]> voiceVector = new Vector<byte[]>(); 

int recordTime = 30; 

System.out.println("Recording Audio..."); 

for (int i = 0; i < Math.ceil(recordTime/0.032); i++) 

byte[] block = recorder.getBlock(); 

DatagramPacket packet = new DatagramPacket(fPacket, fPacket.length, clientIP, PORT); 

//Send it 
sending_socket.send(packet); 
voiceVector.add(block); 

任何人有任何想法?我知道生病齋創建一個包含語音向量和2個額外的字節一個新的數組,但我不確定如何做到這一點,因爲我havnt在一段時間內使用的Java ...

乾杯

+0

排序和丟失由更高級別的TCP協議覆蓋。另外,我認爲有一箇中介(在TCP和UDP之間)用於VOIP協議的工作,但我不記得這個名字。 – DwB 2012-02-14 19:23:23

回答

0

我建議你首先使用TCP來實現這一點,並且只有在這個工作正在嘗試使用UDP時才能實現。可靠的UDP是一個複雜的主題,檢測丟棄的數據包只是一個開始。

即使你必須發送相同的音頻到多個接收者,它仍然是簡單的使用TCP。 (也許更快的網絡卡,如果你有)

0

不要使用TCP - 它會在延遲,因爲它確認添加開銷。 您應該做的是使用RTP的實現作爲您的數據包傳輸。它通過UDP運行並添加時間戳和其他您會發現有用和需要的東西。

檢查了這一點:http://en.wikipedia.org/wiki/Real-time_Transport_Protocol

不要執行它自己 - 發現已經在做的是一個現成的庫。