CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高分求如何将用waveIn实现录音,保存到.wav文件中的方法.``````````````

楼主1982pc()2006-11-07 11:27:41 在 VC/MFC / 基础类 提问

我现在用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

相关问题

关键词

得分解答快速导航

  • 帖主:1982pc
  • erdgzw
  • SoLike
  • wshcdr
  • alvachien
  • wshcdr
  • KevinCEC
  • wshcdr
  • wshcdr
  • wshcdr
  • zaodt
  • wshcdr
  • kuron
  • kuron

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo