WEB开发网
开发学院软件开发VC 实时语音通信的实现 阅读

实时语音通信的实现

 2010-08-15 20:47:46 来源:WEB开发网   
核心提示:讨论:如图所示,几个指针的相互追逐,实时语音通信的实现(2),这种机制在处理网络拥塞上应该 有普遍的应用意义 (1)正常网速下:nAudioIn

讨论:如图所示,几个指针的相互追逐,这种机制在处理网络拥塞上应该 有普遍的应用意义

   

(1)正常网速下:nAudioIn 在 nSend 之前, nReceive 在 nAuioOu t之前 ,周而复始的走下去。

(2)超快网速下:发送端:-->nSend追上 nAudioIn-->“空转”(绕了一圈又回来了)--〉

接收端:因为录、放音的采样频率设置为相等,故不可能出现 nReceive 在n AudioOut 之后,

即收到的声音文件太多,来不及播放的现象。

(3)超慢网速下:(极端情况,网速几乎为0也没关系)

发送端:nAudioIn 绕一圈反追上 nSend,于是将数据接在当前块的尾部 ,以待发送

接收端:nAudioOut 追上 nReceive 后,发现没有数据可播放了,就 “空转”。

综合以上情况,相关实现如下:

(二)声音的录制与播放

(1)录音处理

void CRecTestDlg::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{
   int nextBlock = (nAudioIn+1)% InBlocks;
  if(m_AudioDataIn[nextBlock].dwLength!=0)//下一“块” 没发走
  { //把PWAVEHDR(即pBUfferi)里的数据接到当前“块”的末 尾
      m_AudioDataIn[nAudioIn].lpdata 
    = (PBYTE)realloc (m_AudioDataIn[nAudioIn].lpdata ,
         (((PWAVEHDR) lParam)- >dwBytesRecorded+m_AudioDataIn[nAudioIn].dwLength)) ;
    if (m_AudioDataIn[nAudioIn].lpdata == NULL)
    {//...出错处理
      return ;
    }
      CopyMemory ((m_AudioDataIn [nAudioIn].lpdata+m_AudioDataIn[nAudioIn].dwLength),
          ((PWAVEHDR) lParam)->lpData,
          ((PWAVEHDR) lParam)->dwBytesRecorded) ;// (*destination,*resource,nLen);
    m_AudioDataIn[nAudioIn].dwLength +=((PWAVEHDR) lParam)- >dwBytesRecorded;
  }
  else //把PWAVEHDR(即pBUfferi)里的数据拷贝到下一“块” 中
  {
    nAudioIn = (nAudioIn+1)% InBlocks;
    m_AudioDataIn[nAudioIn].lpdata = (PBYTE)realloc
      (0,((PWAVEHDR) lParam)->dwBytesRecorded);
    CopyMemory(m_AudioDataIn[nAudioIn].lpdata,
        ((PWAVEHDR) lParam)->lpData,
        ((PWAVEHDR) lParam)->dwBytesRecorded) ;
    m_AudioDataIn[nAudioIn].dwLength =((PWAVEHDR) lParam)- >dwBytesRecorded;
  }
  // Send out a new buffer
  waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
  return ;
}

Tags:实时 语音 通信

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接