2012-03-28 81 views
1

正如標題所暗示的,我使用PortAudio庫來記錄音頻輸入,以便通過網絡將數據發送到其他音頻將播放的機器。這是創建基本語音聊天程序的先決條件。使用PortAudio通過網絡發送音頻

此刻我正在正確捕獲音頻&數據正在發送到一個「服務器」程序(當前運行在同一臺機器上(但結果是相同的,否則)。然後服務器程序只是回聲的數據回到它的來源,以便它可以播放。

我遇到的問題是,從服務器收到的數據似乎是發送到數據的長度的1/2服務器即數據回放時,音頻(正確的)只有1秒而不是2秒

這就是數據從記錄位置發送的方式,每條數據都發送,並應收回馬上進行存儲,以便以後可以回放:

floatData outData; 
for (int i = 0; i < mData.maxFrameIndex; i++) 
{ 
    outData.dataSample = mData.recordedSamples[i]; 
    send(mConnectSocket, (char*)&outData, sizeof(floatData), NULL); 

    //Receive the data send, which is echo'd back from the server straight away. 
    Receive(i); 
} 

closesocket(mConnectSocket); 
WSACleanup(); 

這裏是它是如何發送接收&從服務器發回:

int iRecvResult = 0; 
floatData inData; 

do 
{ 
    iRecvResult = recv(mConnectSocket, (char*)&inData, sizeof(floatData), NULL); 

    if (iRecvResult > 0) 
    { 
     // Send the data straight back again. 
     iRecvResult = send(mConnectSocket, (char*)&inData, sizeof(floatData), NULL); 
     if(iRecvResult < 0) 
     { 
      break; 
     } 
    } 

} while (iRecvResult > 0); 

closesocket(mConnectSocket); 
WSACleanup(); 

這是數據是如何處接收回的原始發件人:

int iRecvResult = 0; 
floatData inData; 

iRecvResult = recv(mConnectSocket, (char*)&inData, sizeof(floatData), NULL); 

mRecvData.recordedSamples[index] = inData.dataSample; 

我不知道爲什麼被接收僅1/2的數據傳回,這一切都沒有任何問題被髮送。我想我可以在服務器端回放數據,以確保所有數據都達到100%,但我想知道是否有人可以闡明任何可能的理論。

在此先感謝。

回答

0

過去幾天把我的頭髮撕掉後解決了我自己的問題。結果是一個愚蠢的錯誤。

我只是得到1/2的數據傳回,因爲我只發送1/2的數據的xD

而不是通過循環來mData.maxFrameIndex像我上面的是,我應該已經通過循環來的數我有的樣品是mData.maxFrameIndex * NUM_CHANNELS,通道數是2.

floatData outData; 
for (int i = 0; i < mNumSamples; i++) 
{ 
    outData.dataSample = mData.recordedSamples[i]; 
    send(mConnectSocket, (char*)&outData, sizeof(floatData), NULL); 

    //Receive the data send, which is echo'd back from the server straight away. 
    Receive(i); 
}