使用PortAudio在网络上发送音频

时间:2012-03-28 16:28:40

标签: c++ voice-recording 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%,但我想知道是否有人可以对任何可能的理论有所了解。

提前致谢。

1 个答案:

答案 0 :(得分: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 );
}