Отправка аудио по сети с помощью PortAudio - PullRequest
1 голос
/ 28 марта 2012

Как следует из названия, я использую библиотеку PortAudio для записи аудиовхода, чтобы передавать данные по сети на другой компьютер, где будет воспроизводиться звук. Это предшествует созданию базовой программы голосового чата.

На данный момент у меня правильно записывается звук, и данные отправляются в «серверную» программу (в настоящее время работающую на той же машине (но результаты не совпадают), тогда серверная программа просто эхо-данные возвращаются туда, откуда они пришли, чтобы их можно было воспроизвести.

Проблема, с которой я столкнулся, заключается в том, что данные, полученные обратно с сервера, по-видимому, имеют половину длины данных, отправляемых на сервер, т. Е. Когда данные воспроизводятся, аудио (это правильно) только 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;

Я не знаю, почему только половина данных возвращается, все отправляется без проблем. Я предполагал, что смогу воспроизвести данные на стороне сервера, чтобы убедиться, что все это происходит на 100%, но мне было интересно, сможет ли кто-нибудь пролить свет на любые возможные теории.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 марта 2012

Исправлена ​​моя собственная проблема после того, как я вырвал мои волосы в течение последних нескольких дней.Оказывается, глупая ошибка.

Я получал только половину данных обратно, потому что я отправлял только половину данных 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 );
}
...