2015-05-12 82 views
1

任何人都可以告訴我如何將音頻數據分組併發送給客戶端,以便客戶端可以播放已接收的音頻?這是怎樣的程序,從麥克風開始錄製音頻:使用C++中的套接字通過網絡發送音頻數據

{ 
     waveOutReset (hWaveOut) ; 
     waveInReset (hWaveIn) ; 
     pBuffer1=reinterpret_cast <PBYTE> (malloc(INP_BUFFER_SIZE)); 
     pBuffer2= reinterpret_cast <PBYTE> (malloc(INP_BUFFER_SIZE)); 

     if (!pBuffer1 || !pBuffer2) 
     { 
      if (pBuffer1) free (pBuffer1); 
      if (pBuffer2) free (pBuffer2); 
      MessageBox (hWnd, szMemError, NULL, 
         MB_ICONEXCLAMATION|MB_OK) ; 
      return TRUE ; 
     } 
     // Open waveform audio for input 
     waveform.wFormatTag  = WAVE_FORMAT_PCM ; 
     waveform.nChannels  = 1; 
     waveform.nSamplesPerSec = 11025 ; 
     waveform.nAvgBytesPerSec = 11025 ; 
     waveform.nBlockAlign  = 1 ; 
     waveform.wBitsPerSample = 8 ; 
     waveform.cbSize   = 0 ; 

     if (waveInOpen (&hWaveIn, WAVE_MAPPER, &waveform, 
         (DWORD) hWnd, 0, CALLBACK_WINDOW)) 
     { 
      free (pBuffer1) ; 
      free (pBuffer2) ; 
     } 
     // Set up headers and prepare them 
     pWaveHdr1->lpData   = reinterpret_cast <CHAR*>(pBuffer1) ; 
     pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE ; 
     pWaveHdr1->dwBytesRecorded = 0 ; 
     pWaveHdr1->dwUser   = 0 ; 
     pWaveHdr1->dwFlags   = 0 ; 
     pWaveHdr1->dwLoops   = 1 ; 
     pWaveHdr1->lpNext   = NULL ; 
     pWaveHdr1->reserved  = 0 ; 
     waveInPrepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ; 

     pWaveHdr2->lpData   = reinterpret_cast <CHAR*>(pBuffer2) ;    pWaveHdr2->dwBufferLength = INP_BUFFER_SIZE ; 
     pWaveHdr2->dwBytesRecorded = 0 ; 
     pWaveHdr2->dwUser   = 0 ; 
     pWaveHdr2->dwFlags   = 0 ; 
     pWaveHdr2->dwLoops   = 1 ; 
     pWaveHdr2->lpNext   = NULL ; 
     pWaveHdr2->reserved  = 0 ; 
     waveInPrepareHeader (hWaveIn, pWaveHdr2, sizeof(WAVEHDR)); 
     } 
     break; 

這是插座的版本在那裏接受,接收和發送數據:

switch(WSAGETSELECTEVENT(lParam)) 
{ 
    case FD_ACCEPT: 
    if((new_socket = accept(wParam, NULL, NULL)) == -1){ 
    MessageBox(NULL, L"Error while accepting connection", L"Error", MB_OK); 
    break; 
    } 
     // Prepare accepted socket for read, write, and close notification 
    if(WSAAsyncSelect(new_socket,hWnd, WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE) == -1){ 
    MessageBox(NULL, L"Error while intialization", L"Error", MB_OK); 
    break; 
    } 
       break; 

    case FD_READ: // Receive data from the socket in wParam 

       break; 

    case FD_WRITE: // The socket in wParam is ready for sending data 
    break; 

    case FD_CLOSE: 
      // The connection is now closed 
      closesocket((SOCKET)wParam); 
      break; 
} 

的問題是,我不能打包音頻數據,並將其發送到客戶端和客戶端如何將再次解壓和播放音頻

所有答覆都讚賞 感謝

+1

爲什麼不使用像gstreamer這樣的流媒體庫? http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-integration-win32.html – HappyCactus

回答

1

你可能正在學習C++,並試圖一次採取太多步驟。嘗試錄製到文件,並播放文件。這會給你聲音到字節和字節到聲音的部分。不要嘗試使用特定的文件格式,只需寫入和讀取原始音頻數據。

相關問題