2012-03-28 1 views
1

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

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

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

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

ответ

0

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

я получал только 1/2 данных обратно, потому что я только отправку 1/2 с XD данных

Вместо зацикливания до mData.maxFrameIndex, как я был выше, я должен был циклом по количеству образцы I, которые будут 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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^