录音有关问题 VC 线程 消息队列 静音检测
录音问题 VC 线程 消息队列 静音检测
各位施主大家好!最近在做语音通讯系统遇到了以下问题:录音采用的是
m_mmr=waveInOpen(&m_hIn,0,&wfx,m_dwAudioInId,s_dwInstance,CALLBACK_THREAD);
m_dwAudioInId为线程ID,
DWORD WINAPI CWaveIn::AudioInThreadProc(LPVOID lpParameter)
{
TRACE("AudioInThreadProc start.\n");
CWaveIn *pWaveIn;
pWaveIn = (CWaveIn *)lpParameter;
char buffer[1024]={0};
MSG msg;
while(GetMessage(&msg,0,0,0))
{
switch(msg.message )
{
case MM_WIM_OPEN:
TRACE("MM_WIM_OPEN \n");
break;
case MM_WIM_CLOSE:
TRACE("MM_WIM_CLOSE \n");
goto LOOPEXIT;
case MM_WIM_DATA:
WAVEHDR* pWH=(WAVEHDR*)msg.lParam;
waveInUnprepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
if(pWH->dwBytesRecorded != INP_BUFFER_SIZE)
break;
memcpy(buffer,pWH->lpData,pWH->dwBytesRecorded);
pWaveIn->GetData (buffer ,pWH->dwBytesRecorded );
waveInPrepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
waveInAddBuffer((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
break;
}
}
LOOPEXIT:
TRACE("AudioInThreadProc exit.\n");
return (DWORD)msg.wParam;
}
就这个闹心的线程函数有以下几个问题:
1.GetMessage是从线程的消息队列中取出消息进行处理不多说了,有时会出现即使对着迈克说话(这时应该产生MM_WIM_DATA消息)可死活进不去,阻塞住了,当然大部分时间都是好的。
2.GetMessage永远在运行,即使我们没人说话,听不见任何声音,它依然能够取出MM_WIM_DATA,why?有没有静音检测呀?
就是这样了,请大仙帮帮忙吧 我分少,见谅。
------解决方案--------------------
1、打印一些调试信息出来比较一下,看看出问题的时候是什么情况
2、你不说话不代表没有声音,你可以自己做一个过滤噪声的方法
------解决方案--------------------
我的MP3实时录音程序中,监听线路输入,当输入幅度超过一定值(我程序中为32000)N次(我定义了100)后,让为有输出则打开录音。幅度大小可测试后决定。
各位施主大家好!最近在做语音通讯系统遇到了以下问题:录音采用的是
m_mmr=waveInOpen(&m_hIn,0,&wfx,m_dwAudioInId,s_dwInstance,CALLBACK_THREAD);
m_dwAudioInId为线程ID,
DWORD WINAPI CWaveIn::AudioInThreadProc(LPVOID lpParameter)
{
TRACE("AudioInThreadProc start.\n");
CWaveIn *pWaveIn;
pWaveIn = (CWaveIn *)lpParameter;
char buffer[1024]={0};
MSG msg;
while(GetMessage(&msg,0,0,0))
{
switch(msg.message )
{
case MM_WIM_OPEN:
TRACE("MM_WIM_OPEN \n");
break;
case MM_WIM_CLOSE:
TRACE("MM_WIM_CLOSE \n");
goto LOOPEXIT;
case MM_WIM_DATA:
WAVEHDR* pWH=(WAVEHDR*)msg.lParam;
waveInUnprepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
if(pWH->dwBytesRecorded != INP_BUFFER_SIZE)
break;
memcpy(buffer,pWH->lpData,pWH->dwBytesRecorded);
pWaveIn->GetData (buffer ,pWH->dwBytesRecorded );
waveInPrepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
waveInAddBuffer((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
break;
}
}
LOOPEXIT:
TRACE("AudioInThreadProc exit.\n");
return (DWORD)msg.wParam;
}
就这个闹心的线程函数有以下几个问题:
1.GetMessage是从线程的消息队列中取出消息进行处理不多说了,有时会出现即使对着迈克说话(这时应该产生MM_WIM_DATA消息)可死活进不去,阻塞住了,当然大部分时间都是好的。
2.GetMessage永远在运行,即使我们没人说话,听不见任何声音,它依然能够取出MM_WIM_DATA,why?有没有静音检测呀?
就是这样了,请大仙帮帮忙吧 我分少,见谅。
------解决方案--------------------
1、打印一些调试信息出来比较一下,看看出问题的时候是什么情况
2、你不说话不代表没有声音,你可以自己做一个过滤噪声的方法
------解决方案--------------------
我的MP3实时录音程序中,监听线路输入,当输入幅度超过一定值(我程序中为32000)N次(我定义了100)后,让为有输出则打开录音。幅度大小可测试后决定。