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
- waveout 播放流媒体
- WaveOut播放音乐
- waveout 播放声音
- WaveOut播放音频
- waveout**实现音频播放
- win32 音频播放|WaveOut|缓冲区
- waveout播放pcm文件总结
- 使用WaveOut接口播放WAV文件
- vc中用WaveOut写音乐播放器
- vc中用WaveOut写音乐播放器
- 音频播放处理(openal、dsound、waveout)
- 使用WaveOut接口播放WAV文件
- WaveOut播放声音死锁问题原因
- c# 利用WaveOut播放音频流
- 播放流媒体
- 使用waveOut接口在Windows中播放声音
- 使用waveOut接口在Windows中播放声音
- 使用waveOut接口在Windows中播放声音
- C++ 虚函数表解析
- 类加载机制:全盘负责和双亲委托
- 静or动态库中的全局变量被不同的dll调用修改,其值是否独立
- C编译器剖析_1.3 由文法到分析器_表达式Expression
- Java-Factorial Trailing Zeroes
- waveout 播放流媒体
- C++中const、volatile、mutable的用法
- compass sass 中文 错误的问题
- Java绘制验证码
- Java web----HttpSession
- 将一个十六进制字符串转换为十进制数值
- 十七、运算符重载(一) 成员函数重载、友元函数重载、运算符重载规则
- tcp/ip 上,丢包重传机制
- 设计模式-适配器模式