waveout 播放流媒体

来源:互联网 发布:前端工程师和美工 编辑:程序博客网 时间:2024/06/04 19:59

版权所有,转载需注明出处。


我们都用过了waveout播放过本地音频,但是流媒体是个问题。要考虑到很多的问题,杂音的问题出现最为明显。下面为大家描述下waveout播放流媒体。

声音的初始化:

HWAVEOUT InitWaveEngine(){//882K  * 10nsmemset(&m_WaveFormatEx, 0, sizeof(m_WaveFormatEx));m_WaveFormatEx.wFormatTag = WAVE_FORMAT_PCM;m_WaveFormatEx.nChannels = 2; //2 1m_WaveFormatEx.wBitsPerSample = 16; //16 8 32m_WaveFormatEx.cbSize = 0;m_WaveFormatEx.nSamplesPerSec = 44100; //44100   8000 11025  22050m_WaveFormatEx.nBlockAlign = (m_WaveFormatEx.wBitsPerSample/8) * m_WaveFormatEx.nChannels;// >> 3;m_WaveFormatEx.nAvgBytesPerSec = m_WaveFormatEx.nSamplesPerSec * m_WaveFormatEx.nBlockAlign ; //44100     m_WaveFormatEx.wBitsPerSample * m_WaveFormatEx.nChannels//mmReturn = waveOutOpen( &m_hPlay, WAVE_MAPPER, &m_WaveFormatEx, ::GetCurrentThreadId(), 0, CALLBACK_THREAD);//UnitWaveEngine();mmReturn = waveOutOpen( &m_hPlay, WAVE_MAPPER, &m_WaveFormatEx, 0, 0, CALLBACK_NULL);//mmReturn = waveOutOpen( &m_hPlay, WAVE_MAPPER, &m_WaveFormatEx, (DWORD)waveOutProc, 0, CALLBACK_FUNCTION);if(mmReturn){perror("error to open the devices\n");printf("Init audio error\n");return NULL;}else{m_IsPlaying = TRUE;DWORD volume = 0xffffffff;//0xFFFF - LOWORD(volume);//0xffffffff;waveOutSetVolume(m_hPlay, volume);}lpHdr->lpData = NULL;lpHdr->dwBufferLength = 0;lpHdr->dwBytesRecorded = 0;lpHdr->dwUser = 0;lpHdr->dwFlags = 0;lpHdr->dwLoops = 0;lpHdr->lpNext = 0;lpHdr->lpNext = 0;waveOutPrepareHeader(m_hPlay, lpHdr, sizeof(WAVEHDR));return m_hPlay;}
声音的播放,这里是重点,和所以的播放相同,都是waveOutPrepareHeader, waveOutWrite, waveOutUnprepareHeader三个步骤。

我发现其中会出现嗤嗤的声音,有几种的情况:1:服务器传过来的声音有问题,可以本地保存为wav来试听下。 2:声音处理经过了多次转码,声音流损坏。3:播放时就释放资源,资源还没有播放完就调用free导致嗤嗤的声音,建立循环的缓冲区解决。4:如果还有问题可以使用waveout双缓冲区来解决。

int PlayWave(unsigned char* buffer,  int size){MMRESULT mmResult = 0;int length = size;LPARAM lParam;if(m_IsPlaying == FALSE)return -1;ZeroMemory(lpHdr, sizeof(WAVEHDR));lpHdr->lpData =(LPSTR) buffer;lpHdr->dwBufferLength = length;mmResult = waveOutPrepareHeader(m_hPlay, lpHdr, sizeof(WAVEHDR));if(mmResult){return  -1;}mmResult = waveOutWrite(m_hPlay, lpHdr, sizeof(WAVEHDR));if(mmResult){return -1;}mmResult = waveOutUnprepareHeader(m_hPlay, lpHdr, sizeof(WAVEHDR));if(mmResult){return -1;}return 0;}

资源的释放

void UnitWaveEngine(){MMRESULT mmReturn = 0;if(m_IsPlaying == FALSE)return;// FALSE;mmReturn = waveOutReset(m_hPlay);//重置输出设备,重置能够使输出设备全部buffer输出结束if(!mmReturn){m_IsPlaying = FALSE;Sleep(500); //等待所有buffer输出完成mmReturn = waveOutClose(m_hPlay);//关闭设备printf("close devices right\n");}else{printf("error \n");}}



0 0