采撷的WIN7录音的PCM裸数据转为g711编码后,播放有很大的 哒哒哒的声音,原录音也可以听见
采集的WIN7录音的PCM裸数据转为g711编码后,播放有很大的 哒哒哒的声音,原录音也可以听见
部分代码:
//开启音频采集
MMRESULT mmReturn = ::waveInOpen( &m_hRecord, WAVE_MAPPER, &m_WaveFormatEx, ::GetCurrentThreadId(), 0, CALLBACK_THREAD);
//打开采集失败
if(mmReturn != MMSYSERR_NOERROR )
{
displayError(mmReturn,"Open Failed!");
return ;//FALSE;
}
if(mmReturn == MMSYSERR_NOERROR )
{
//将准备好的buffer提供给音频输入设备
for(int i=0; i < MAXRECBUFFER ; i++)
{
//准备一个bufrer给输入设备
mmReturn = ::waveInPrepareHeader(m_hRecord, m_RecHead[i], sizeof(WAVEHDR));
//发送一个buffer给指定的输入设备,当buffer填满将会通知程序
mmReturn = ::waveInAddBuffer(m_hRecord, m_RecHead[i], sizeof(WAVEHDR));
}
//开启指定的输入采集设备
mmReturn = ::waveInStart(m_hRecord);
if(mmReturn!=MMSYSERR_NOERROR ) //开始采集失败
displayError(mmReturn,"Start");
else
m_IsRecoding = TRUE;
}
LPWAVEHDR lpHdr = (LPWAVEHDR) lParam;
if(lpHdr->dwBytesRecorded==0 || lpHdr==NULL)
return ;//ERROR_SUCCESS;
//使采集过程,知道此buffer已经沾满,不能再填充
::waveInUnprepareHeader(m_hRecord, lpHdr, sizeof(WAVEHDR));
//将采集到的声音发送给播放线程
if(((CVideoPlayDlg *)m_pDlg)->m_pPlaySound != NULL)
((CVideoPlayDlg *)m_pDlg)->m_pPlaySound->PostThreadMessage(WM_PLAYSOUND_PLAYBLOCK, lpHdr->dwBytesRecorded, (LPARAM)lpHdr->lpData);
if(m_IsRecoding)
{
//重新将buffer恢复到准备填充状态
::waveInPrepareHeader(m_hRecord, lpHdr, sizeof(WAVEHDR));
::waveInAddBuffer(m_hRecord, lpHdr, sizeof(WAVEHDR));
}
MMRESULT mmResult = 0;
int length=(int) wParam;
if(m_IsPlaying == FALSE)
return ; //FALSE;
m_PlayLog.WriteString(TEXT("\nplaying sound data...."));
// Prepare wave header for playing
WAVEHDR *lpHdr=new WAVEHDR;
memset(lpHdr, 0, sizeof(WAVEHDR));
lpHdr->lpData=(char *)lParam;
lpHdr->dwBufferLength=length;
char* pOutBuffer = new char[lpHdr->dwBufferLength];
memset(pOutBuffer, 0, lpHdr->dwBufferLength);
int iRet = PCM2G711a( (char *)lParam, (char *)pOutBuffer, length, 0 );
fwrite(pOutBuffer, 1, length, m_pFile);
------解决思路----------------------
建议先编译链接调试BASS库自带的相关例子代码。
部分代码:
//开启音频采集
MMRESULT mmReturn = ::waveInOpen( &m_hRecord, WAVE_MAPPER, &m_WaveFormatEx, ::GetCurrentThreadId(), 0, CALLBACK_THREAD);
//打开采集失败
if(mmReturn != MMSYSERR_NOERROR )
{
displayError(mmReturn,"Open Failed!");
return ;//FALSE;
}
if(mmReturn == MMSYSERR_NOERROR )
{
//将准备好的buffer提供给音频输入设备
for(int i=0; i < MAXRECBUFFER ; i++)
{
//准备一个bufrer给输入设备
mmReturn = ::waveInPrepareHeader(m_hRecord, m_RecHead[i], sizeof(WAVEHDR));
//发送一个buffer给指定的输入设备,当buffer填满将会通知程序
mmReturn = ::waveInAddBuffer(m_hRecord, m_RecHead[i], sizeof(WAVEHDR));
}
//开启指定的输入采集设备
mmReturn = ::waveInStart(m_hRecord);
if(mmReturn!=MMSYSERR_NOERROR ) //开始采集失败
displayError(mmReturn,"Start");
else
m_IsRecoding = TRUE;
}
LPWAVEHDR lpHdr = (LPWAVEHDR) lParam;
if(lpHdr->dwBytesRecorded==0 || lpHdr==NULL)
return ;//ERROR_SUCCESS;
//使采集过程,知道此buffer已经沾满,不能再填充
::waveInUnprepareHeader(m_hRecord, lpHdr, sizeof(WAVEHDR));
//将采集到的声音发送给播放线程
if(((CVideoPlayDlg *)m_pDlg)->m_pPlaySound != NULL)
((CVideoPlayDlg *)m_pDlg)->m_pPlaySound->PostThreadMessage(WM_PLAYSOUND_PLAYBLOCK, lpHdr->dwBytesRecorded, (LPARAM)lpHdr->lpData);
if(m_IsRecoding)
{
//重新将buffer恢复到准备填充状态
::waveInPrepareHeader(m_hRecord, lpHdr, sizeof(WAVEHDR));
::waveInAddBuffer(m_hRecord, lpHdr, sizeof(WAVEHDR));
}
MMRESULT mmResult = 0;
int length=(int) wParam;
if(m_IsPlaying == FALSE)
return ; //FALSE;
m_PlayLog.WriteString(TEXT("\nplaying sound data...."));
// Prepare wave header for playing
WAVEHDR *lpHdr=new WAVEHDR;
memset(lpHdr, 0, sizeof(WAVEHDR));
lpHdr->lpData=(char *)lParam;
lpHdr->dwBufferLength=length;
char* pOutBuffer = new char[lpHdr->dwBufferLength];
memset(pOutBuffer, 0, lpHdr->dwBufferLength);
int iRet = PCM2G711a( (char *)lParam, (char *)pOutBuffer, length, 0 );
fwrite(pOutBuffer, 1, length, m_pFile);
------解决思路----------------------
建议先编译链接调试BASS库自带的相关例子代码。