实时语音通信的实现
2010-08-15 20:47:46 来源:WEB开发网讨论:如图所示,几个指针的相互追逐,这种机制在处理网络拥塞上应该 有普遍的应用意义
(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 ;
}
更多精彩
赞助商链接