我在做音频解码,格式为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));//播放音频
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));//播放音频
解决方案 »
- 高分请教一个树控件异步刷新状态问题
- 用CFile类进行写文件操作
- CHtmlView::OnNewWindow2 为什么window.open的时候拦不到?
- 求一片于 直线段识别 相关的长度在15页左右的英文权威点的论文 要新点的 。。IEEE我下不了
- 关于何时使用#include
- 有谁有 FilterGraph->InfTee filter->多个视频输出的例子代码!!! 100不够可加
- 映射模式和坐标转换完全版2(本人自创)!欢迎大家多提意见,跟贴有分!
- 文件夹问题
- -------------- BSTR 与 LPSTR、LPCTSTR 之间如何互换? --------------
- 请问m_pfile=new CSocketFile(this)和m_pfile=new CSocketFile()的意思和作用都一样的吗?
- 关于ReleaseDC & DeleteObject()的问题!!!!!马上给分!
- 老大们,我老板问把算法做成函数或com组件有什么区别,我该如何回答
解决的最好办法是用两个以上的缓冲区,(大于4个多余),或者增大缓冲区感觉也会好些。
这里有个例子,可惜不是多缓冲区的:
http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=92