问题在于语音延迟随着时间逐渐增大,请教各位高手是怎么回事啊?郁闷了很久了 ,哪位大虾帮忙看一下啊
#define  BUFFER_NUM 1000 
#define  INP_BUFFER_SIZE 640//640---20ms 
#define  OUTP_BUFFER_SIZE BUFFER_NUM*INP_BUFFER_SIZE 
void CRecordHWndDlg::OnRealtime() 

// filein.Open("datain.txt",CFile::modeWrite|CFile::modeCreate); 
// fileout.Open("dataout.txt",CFile::modeWrite|CFile::modeCreate); 
m_i=1; pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE); 
pBuffer2=(PBYTE)malloc(INP_BUFFER_SIZE); 
pBuffer3=(PBYTE)malloc(OUTP_BUFFER_SIZE); for(int j=0;j <OUTP_BUFFER_SIZE;j++) 
pBuffer3[j]=0;//输出buffer清零 waveform.wFormatTag=WAVE_FORMAT_PCM; 
waveform.nChannels=2; 
waveform.nSamplesPerSec=8000; 
waveform.nAvgBytesPerSec=32000; 
waveform.nBlockAlign=4; 
waveform.wBitsPerSample=16; 
waveform.cbSize=0; 
if (waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW)) 

free(pBuffer1); 
free(pBuffer2); 
MessageBeep(MB_ICONEXCLAMATION); 
AfxMessageBox("Audio can not be open!"); 

//////////////////////////////////////准备两块buffer 
pWaveHdr1->lpData=(LPTSTR)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=(LPTSTR)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)); ///////////////////////////////////////////准备两块buffer waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ; 
waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ; 
if (waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW)) { 
MessageBeep(MB_ICONEXCLAMATION); 
AfxMessageBox("Audio output erro"); 

pWaveHdr3->lpData=(LPTSTR)pBuffer3; 
pWaveHdr3->dwBufferLength=OUTP_BUFFER_SIZE; 
pWaveHdr3->dwBytesRecorded=0; 
pWaveHdr3->dwUser=0; 
pWaveHdr3->dwFlags=WHDR_BEGINLOOP | WHDR_ENDLOOP; 
pWaveHdr3->dwLoops=10000; 
pWaveHdr3->lpNext=NULL; 
pWaveHdr3->reserved=0; waveOutPrepareHeader(hWaveOut,pWaveHdr3,sizeof(WAVEHDR)); 
waveInStart (hWaveIn) ; 
waveOutWrite (hWaveOut, pWaveHdr3, sizeof (WAVEHDR)) ; return; 

void CRecordHWndDlg::OnMM_WIM_DATA(UINT wParam, LONG lParam) 

// filein.Write(((PWAVEHDR) lParam)->lpData,((PWAVEHDR) lParam)->dwBytesRecorded); m_i=(m_i+1)%BUFFER_NUM; CopyMemory (pBuffer3+INP_BUFFER_SIZE*m_i  , ((PWAVEHDR) lParam)->lpData,//可能是buffer1,buffer2 
INP_BUFFER_SIZE) ; waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;//归还系统内存 
// TRACE("done input data\n"); 
return ; }

解决方案 »

  1.   

    描述一下你要实现的功能为什么播放数据缓冲区要用录音数据缓冲区大小的1000倍?CopyMemory (pBuffer3+INP_BUFFER_SIZE*m_i  , ((PWAVEHDR) lParam)->lpData,//可能是buffer1,buffer2 
    INP_BUFFER_SIZE) ; //////////这里 是不是要置 WaveHdr 的 dwFlags=0; ??
    是不是还需要调用一次 waveInPrepareHeader ???
    waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;//归还系统内存 
      

  2.   

    描述一下你要实现的功能为什么播放数据缓冲区要用录音数据缓冲区大小的1000倍?CopyMemory (pBuffer3+INP_BUFFER_SIZE*m_i  , ((PWAVEHDR) lParam)->lpData,//可能是buffer1,buffer2 
    INP_BUFFER_SIZE) ; //////////这里 是不是要置 WaveHdr 的 dwFlags=0; ??
    是不是还需要调用一次 waveInPrepareHeader ???
    waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;//归还系统内存 
      

  3.   

    多少次播放以后waveOutReset 一下或者你接受到数据,直接在 WIM_DATA 里面waveOutWrite 播放出来...不要存在缓冲了
      

  4.   

    我用waveOutWrite (hWaveOut, pWaveHdr3, sizeof (WAVEHDR)) ; 近似无限次播放输出缓冲区,然后每次输入缓冲区满了再拷贝到输出缓冲区CopyMemory (pBuffer3+INP_BUFFER_SIZE*m_i  , ((PWAVEHDR) lParam)->lpData,//可能是buffer1,buffer2 
    INP_BUFFER_SIZE) ; 
    这样可以么,会不会因为输出缓冲区使用权归操作系统而现在却在写入,导致了播放延迟越来越大呢 ?