2

正如标题所暗示的,我正在使用 PortAudio 库来记录音频输入,以便通过网络将数据发送到另一台将播放音频的机器。这是创建基本语音聊天程序的前奏。

目前我已经正确捕获了音频并且数据正在发送到“服务器”程序(当前在同一台机器上运行(但结果相同)。然后服务器程序只是回显数据回到它的来源,以便可以播放它。

我遇到的问题是从服务器接收回的数据似乎是发送到服务器的数据长度的 1/2,即当播放数据时,音频(这是正确的)只有 1 秒两个。

这就是数据从记录位置发送的方式。每条数据都已发送,应立即接收并存储起来,以便以后回放:

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% 到达那里,但我想知道是否有人可以阐明任何可能的理论。

提前致谢。

4

1 回答 1

1

在过去几天把头发扯掉后,我自己的问题得到了解决。原来是一个愚蠢的错误。

我只收到了 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 );
}
于 2012-03-29T11:20:56.617 回答