高分求如何将用waveIn实现录音,保存到.wav文件中的方法.``````````````
我现在用waveIn实现了录音并用waveOut实现回放,但不知道怎么能把音频流存如文件.我也查了相关资料但好象都没用waveIn\waveOut实现文件保存,请各位大虾给点提示,资料,原码都可以`````谢谢 问题点数:100、回复次数:26Top
1 楼erdgzw(编译通过那一刻感觉真好)回复于 2006-11-07 11:55:40 得分 1
自己保存为wav文件格式。Top
2 楼SoLike(思危)回复于 2006-11-07 12:00:45 得分 1
简单啊, 构造一个wav头,然后把数据接上一存就ok了Top
3 楼wshcdr(dd)回复于 2006-11-07 12:01:57 得分 1
楼上明显不厚道Top
4 楼alvachien(白衣战神,四大绝技:C#/C++/T-SQL/ABAP)回复于 2006-11-07 12:15:36 得分 1
关注和学习...Top
5 楼wshcdr(dd)回复于 2006-11-07 12:18:00 得分 5
http://www.codeproject.com/audio/fister.aspTop
6 楼1982pc()回复于 2006-11-07 13:34:43 得分 0
先看看,厚道的分有:)
不过顶的还是先谢~~Top
7 楼1982pc()回复于 2006-11-07 13:38:32 得分 0
上面各位能说清楚点儿吗?我大概原理也知道,但不知道该怎么组织:(Top
8 楼KevinCEC(我要做人大代表(★★★★))回复于 2006-11-07 13:40:15 得分 1
呵呵,还是楼主老实....
解决了吗?都说过了Top
9 楼1982pc()回复于 2006-11-07 14:15:37 得分 0
还没有解决````头痛呀,感觉应该很简单,但总是找不到.wshcdr(dd) 的例子本身就有问题,郁闷,而且我要做到wince下,可能那个例子还有些东西用不了.Top
10 楼wshcdr(dd)回复于 2006-11-07 14:37:05 得分 5
那个例子有什么问题?Top
11 楼1982pc()回复于 2006-11-07 14:52:08 得分 0
运行时,按停止录音就有问题,而且录下来的文件没有声音:(Top
12 楼wshcdr(dd)回复于 2006-11-07 17:47:50 得分 5
我用过的,感觉没大问题Top
13 楼1982pc()回复于 2006-11-08 09:20:13 得分 0
我这里还是运行不了,郁闷.高人给点指点吧.Top
14 楼wshcdr(dd)回复于 2006-11-08 13:13:48 得分 5
录下来的文件是正常的Top
15 楼1982pc()回复于 2006-11-10 15:46:47 得分 0
是正常了可是它的实现也不是用了waveIn呀,还用了windows下其他东西:(我现在只想用waveIn并且已经实现了各个功能.主要是要在wince下运行,郁闷得很,谁能帮忙看看.放原码了,高手不要见笑,很多是找资料照着写的:)
BOOL CRecordTest1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
pwavehdr1=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
pwavehdr2=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
psavebuffer = reinterpret_cast<PBYTE>(malloc(1));
bRecord = FALSE;
bPlay = FALSE;
bPause = FALSE;
bEnd = FALSE;
bTerminate = FALSE;
dwDataLength = 0;
dwRepetitions = 1;
return TRUE; // return TRUE unless you set the focus to a control
}
void CRecordTest1Dlg::OnResStart()
{
// TODO: Add your control notification handler code here
if (waveInGetNumDevs() == 0)
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("No device!\n"));
exit(-1);
}
// allocate buffer memory
pbuffer1 = (PBYTE)malloc(BUFSIZE);
pbuffer2 = (PBYTE)malloc(BUFSIZE);
if(!pbuffer1 || !pbuffer2)
{
if(pbuffer1)
{
free(pbuffer1);
}
if(pbuffer2)
{
free(pbuffer2);
}
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("Memory error!\n"));
exit(-1);
}
//waveform audio input format
waveformat.wFormatTag = WAVE_FORMAT_PCM;
waveformat.nChannels = 1;
waveformat.nSamplesPerSec = 8000;
waveformat.nAvgBytesPerSec = 8000;
waveformat.nBlockAlign = 1;
waveformat.wBitsPerSample = 8;
waveformat.cbSize = 0;
// open device
if (MMSYSERR_NOERROR != waveInOpen(&wavein, WAVE_MAPPER, &waveformat,
(DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW))
{
free(pbuffer1);
free(pbuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("waveInOpen fail!\n"));
exit(-1);
}
//buffer1 format
pwavehdr1->dwBufferLength = BUFSIZE;
pwavehdr1->dwBytesRecorded = 0;
pwavehdr1->dwFlags = 0;
pwavehdr1->dwLoops = 1;
pwavehdr1->dwUser = 0;
pwavehdr1->lpData = (LPSTR)pbuffer1;
pwavehdr1->lpNext = NULL;
pwavehdr1->reserved = 0;
if (MMSYSERR_NOERROR != waveInPrepareHeader(wavein,pwavehdr1,sizeof(WAVEHDR)))
{
free(pbuffer1);
free(pbuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("buffer1 fail!\n"));
exit(-1);
}
if (MMSYSERR_NOERROR != waveInAddBuffer(wavein,pwavehdr1,sizeof(WAVEHDR)))
{
free(pbuffer1);
free(pbuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("addbuffer1 fail!\n"));
exit(-1);
}
//buffer2 format
pwavehdr2->dwBufferLength = BUFSIZE;
pwavehdr2->dwBytesRecorded = 0;
pwavehdr2->dwFlags = 0;
pwavehdr2->dwLoops = 1;
pwavehdr2->dwUser = 0;
pwavehdr2->lpData = (LPSTR)pbuffer2;
pwavehdr2->lpNext = NULL;
pwavehdr2->reserved = 0;
if (MMSYSERR_NOERROR != waveInPrepareHeader(wavein,pwavehdr2,sizeof(WAVEHDR)))
{
free(pbuffer1);
free(pbuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("buffer2 fail!\n"));
exit(-1);
}
if (MMSYSERR_NOERROR != waveInAddBuffer(wavein,pwavehdr2,sizeof(WAVEHDR)))
{
free(pbuffer1);
free(pbuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("addbuffer2 fail!\n"));
exit(-1);
}
psavebuffer = (PBYTE)realloc(psavebuffer,1);
if (!psavebuffer)
{
free(pbuffer1);
free(pbuffer2);
free(psavebuffer);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("savebuffer fail!\n"));
exit(-1);
}
//begin sample
bRecord = TRUE;
dwDataLength = 0;
if (MMSYSERR_NOERROR != waveInStart(wavein))
{
free(pbuffer1);
free(pbuffer2);
free(psavebuffer);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("start record fail!\n"));
exit(-1);
}
}
void CRecordTest1Dlg::OnRecStop()
{
// TODO: Add your control notification handler code here
if(!bRecord)
{
return;
}
TRACE(_T("record reset!\n"));
bEnd = TRUE;
bRecord = FALSE ;
if (MMSYSERR_NOERROR != waveInReset(wavein))
{
free(pbuffer1);
free(pbuffer2);
free(psavebuffer);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("waveInReset fail!\n"));
exit(-1);
}
}
Top
16 楼1982pc()回复于 2006-11-10 15:47:27 得分 0
void CRecordTest1Dlg::OnPlayStart()
{
// TODO: Add your control notification handler code here
if (bPlay)
{
waveOutReset(waveout);//play again from beginning
}
//waveform audio output format
waveformat.wFormatTag = WAVE_FORMAT_PCM;
waveformat.nChannels = 1;
waveformat.nSamplesPerSec = 8000;
waveformat.nAvgBytesPerSec = 8000;
waveformat.nBlockAlign = 1;
waveformat.wBitsPerSample = 8;
waveformat.cbSize = 0;
// open device
if (MMSYSERR_NOERROR != waveOutOpen(&waveout, WAVE_MAPPER, &waveformat,
(DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW))
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("waveOutOpen fail!\n"));
exit(-1);
}
//buffer format
pwavehdr1->dwBufferLength = dwDataLength;
pwavehdr1->dwBytesRecorded = 0;
pwavehdr1->dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
pwavehdr1->dwLoops = dwRepetitions;
pwavehdr1->dwUser = 0;
pwavehdr1->lpData = (LPSTR)psavebuffer;
pwavehdr1->lpNext = NULL;
pwavehdr1->reserved = 0;
if (MMSYSERR_NOERROR != waveOutPrepareHeader(waveout,pwavehdr1,sizeof(WAVEHDR)))
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("waveOutPrepareHeader fail!\n"));
exit(-1);
}
/*if (MMSYSERR_NOERROR != waveOutWrite(waveout,pwavehdr1,sizeof(WAVEHDR)))
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("waveOutWrite fail!\n"));
exit(-1);
}*/
bPlay = TRUE;
}
void CRecordTest1Dlg::OnPlayPause()
{
// TODO: Add your control notification handler code here
if(!bPlay)
{
return;
}
if(bPause)
{
waveOutRestart(waveout);
bPause = FALSE;
}
else
{
waveOutPause(waveout);
bPause = TRUE;
}
}
void CRecordTest1Dlg::OnPlayStop()
{
// TODO: Add your control notification handler code here
if(!bPlay)
{
return;
}
bTerminate = TRUE;
waveOutReset(waveout);
}
void CRecordTest1Dlg::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{
TRACE(_T("MM_WIM_DATA\n"));
psavebuffer = (PBYTE)realloc (psavebuffer, dwDataLength +
((PWAVEHDR) lParam)->dwBytesRecorded) ;
if (psavebuffer == NULL)
{
waveInClose (wavein) ;
MessageBeep (MB_ICONEXCLAMATION) ;
AfxMessageBox(_T("save"));
return ;
}
//////////////////////////////////////////////////////////////////////////
CopyMemory (psavebuffer + dwDataLength, ((PWAVEHDR) lParam)->lpData,
((PWAVEHDR) lParam)->dwBytesRecorded) ;//+dwDataLength 则内存指针后移
dwDataLength += ((PWAVEHDR) lParam)->dwBytesRecorded ;
if (bEnd)
{
waveInClose (wavein) ;
return ;
}
// Send out a new buffer
else
{
waveInAddBuffer (wavein, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
}
}
void CRecordTest1Dlg::OnMM_WIM_OPEN(UINT wParam,LONG lParam)
{
TRACE(_T("MM_WIM_OPEN\n"));
((CWnd *)(this->GetDlgItem(IDC_REC_START)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_REC_STOP)))->EnableWindow(TRUE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_START)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_PAUSE)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_STOP)))->EnableWindow(FALSE);
SetTimer(1,100,NULL);//????????????????
bRecord=TRUE;
}
void CRecordTest1Dlg::OnMM_WIM_CLOSE(UINT wParam,LONG lParam)
{
KillTimer(1);
TRACE(_T("MM_WIM_CLOSE\n"));
waveInUnprepareHeader(wavein,pwavehdr1,sizeof(WAVEHDR));
waveInUnprepareHeader(wavein,pwavehdr2,sizeof(WAVEHDR));
free(pbuffer1);
free(pbuffer2);
((CWnd *)(this->GetDlgItem(IDC_REC_START)))->EnableWindow(TRUE);
((CWnd *)(this->GetDlgItem(IDC_REC_STOP)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_START)))->EnableWindow(TRUE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_PAUSE)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_STOP)))->EnableWindow(FALSE);
bEnd = FALSE;
}
void CRecordTest1Dlg::OnMM_WOM_OPEN(UINT wParam,LONG lParam)
{
((CWnd *)(this->GetDlgItem(IDC_REC_START)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_REC_STOP)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_START)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_PAUSE)))->EnableWindow(TRUE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_STOP)))->EnableWindow(TRUE);
}
void CRecordTest1Dlg::OnMM_WOM_DONE(UINT wParam,LONG lParam)
{
TRACE(_T("open MM_WOM_DONE\n"));
waveOutClose(waveout);
}
void CRecordTest1Dlg::OnMM_WOM_CLOSE(UINT wParam,LONG lParam)
{
TRACE(_T("open MM_WOM_CLOSE\n"));
bPlay = FALSE;
bPause = FALSE;
bTerminate = FALSE;
waveOutUnprepareHeader(waveout,pwavehdr1,sizeof(WAVEHDR));
((CWnd *)(this->GetDlgItem(IDC_REC_START)))->EnableWindow(TRUE);
((CWnd *)(this->GetDlgItem(IDC_REC_STOP)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_START)))->EnableWindow(TRUE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_PAUSE)))->EnableWindow(FALSE);
((CWnd *)(this->GetDlgItem(IDC_PLAY_STOP)))->EnableWindow(FALSE);
}
Top
17 楼wshcdr(dd)回复于 2006-11-10 15:52:26 得分 0
LZ这个又不生成wav文件的Top
18 楼1982pc()回复于 2006-11-10 16:03:25 得分 0
嗯,这个只是实现了录音播放,能否在此基础上实现录音文件wav的保存呢?我觉得既然我已经能保存到内存中,那保存到wav文件中,只是不知道该怎么组织wav文件.不知道这个想法对不?请高手指点一二.Top
19 楼1982pc()回复于 2006-11-15 16:17:10 得分 0
自己顶~~~~~Top
20 楼zaodt(至尊宝宝:我就在你身旁,关心永远不打烊!)回复于 2006-11-16 09:24:00 得分 1
WAV 文件有标准的文件格式,你需要在网上找到它的格式定义,然后根据这个定义,用 WriteFile 写入到文件里。Top
21 楼wshcdr(dd)回复于 2006-11-16 12:42:48 得分 4
是需要自己找一下WAV文件格式,然后写文件了Top
22 楼kuron(宝抱)回复于 2006-11-16 16:34:23 得分 50
我自己写啦一个类, 在PC和PPC上都测试可以录音!而且还有保存为.WAV文件的函数, 需要的留下EMAIL, 或者给我发小纸条Top
23 楼1982pc()回复于 2006-11-16 18:07:48 得分 0
嗯,大家知道思路了:)去研究研究,希望做过的人再帮忙看看Top
24 楼1982pc()回复于 2006-11-16 18:08:54 得分 0
忘了留邮箱了,1982.pc@163.comTop
25 楼kuron(宝抱)回复于 2006-11-17 10:43:45 得分 20
已发, 请查收Top
26 楼forverlove()回复于 2006-11-25 22:31:58 得分 0
收藏先Top




