我在做音频解码,格式为PCM,在编码器静音时,解出的声音为嘟嘟声,按道理应该没有声音,在有声音时,有杂音,我不知道是为什么。具体实现如下:
       LPWAVEFORMATEX    lpFormat;
    LONG cbFormat;
cbFormat = 50000;
lpFormat = (LPWAVEFORMATEX)malloc(cbFormat); 
lpFormat->wFormatTag = WAVE_FORMAT_PCM;
    lpFormat->nChannels = 1;
    lpFormat->nSamplesPerSec = 8000;
    lpFormat->nAvgBytesPerSec = 8000*1*2;
    lpFormat->nBlockAlign = 2;
    lpFormat->wBitsPerSample = 16;
    w = waveOutOpen(&shWaveOut, WAVE_MAPPER, lpFormat,
0, 0L, CALLBACK_NULL);//打开音频设备
   for (swBuffers = 0; swBuffers < MAX_AUDIO_BUFFERS; swBuffers++) {
if (!(salpAudioBuf[swBuffers] =(LPWAVEHDR)malloc((DWORD)(sizeof(WAVEHDR) + AUDIO_BUFFER_SIZE*4 ))))//申请buffer
    break
salpAudioBuf[swBuffers]->dwFlags = WHDR_DONE;
salpAudioBuf[swBuffers]->lpData = (char*) salpAudioBuf[swBuffers] + sizeof(WAVEHDR);
salpAudioBuf[swBuffers]->dwBufferLength = AUDIO_BUFFER_SIZE;
if (!waveOutPrepareHeader(shWaveOut, salpAudioBuf[swBuffers],sizeof(WAVEHDR)))
    continue;
free((LPBYTE) salpAudioBuf[swBuffers]);
break;
    }
salpAudioBuf[swNextBuffer]->lpData = (char*) salpAudioBuf[swNextBuffer]
   + sizeof(WAVEHDR);
memcpy((salpAudioBuf[swNextBuffer]->lpData)+bufferNo,  s, wParam);//写buffer
waveOutWrite(shWaveOut, salpAudioBuf[swNextBuffer],sizeof(WAVEHDR));//播放音频

解决方案 »

  1.   

    程序有错导致主板上的speaker产生的嘟嘟声
      

  2.   

    如果你的输出缓冲不够大,且缓冲区个数不够多,就会出现“播放”的间断,音频设备在有无信号的切换过程中,发出轻微的噪音。
    解决的最好办法是用两个以上的缓冲区,(大于4个多余),或者增大缓冲区感觉也会好些。
    这里有个例子,可惜不是多缓冲区的:
    http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=92
      

  3.   

    修改完buffer后效果好了一些,不过还是有嘟嘟声,只不过频率低了一些,有没有完全没有杂音的办法?实时收、播是这样,可是播放文件效果极差,背景噪音极大,我是按一定的速率读取文件中的数据然后调用播放函数的。烦请再指教!
      

  4.   

    经过考察我觉得是播放的速度与实时收的的速率不匹配。不如按照8000的播放速率,每秒的数据量为64K,而实际上收的的数据量小于64K,所以在下一buffer未写满前,当前buffer的数据便被读完,造成播放过程中产生了间隙,从而产生了噪声。这一问题该如何解决呢?各位大侠帮帮忙吧!