2022年2022年录音小程序 .pdf
《2022年2022年录音小程序 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年录音小程序 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、EVC 录音详解语音采集默认分类2007-10-02 23:11:24 阅读 20 评论 0字号: 大中小= /TITLE: / EVC 录音详解/AUTHOR: / norains /DATE: / Friday 9-June-2006 /= 借助 evc 在 wince 下实现录音不是一件难事.恩,的确不是一件难事.本文主要解释如何使用wavein, 并且把声音以wave 文件形式保存到储存器中. 最先 ,我们要分配两个缓冲区.因为数据首先要保存到内存中,两个内存缓存区间可以较快进行切换 ,可以避免录音有断断续续的现象.#define INP_BUFFER_SIZE 16*1024 /输入
2、的缓冲区长度PBYTE pBuffer1,pBuffer2; /保存输入数据的两个缓冲区pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE); pBuffer2=(PBYTE)malloc(INP_BUFFER_SIZE); if (!pBuffer1 | !pBuffer2) if (pBuffer1) free(pBuffer1); if (pBuffer2) free(pBuffer2); AfxMessageBox(LMemory erro!); return ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
3、 - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 接下来需要设置录音的方式,需要用到 WAVEFORMATEX结构 .声道数 ,采样位和采样率都可以在这结构中设置.WAVEFORMATEX waveform; waveform.wFormatTag=WAVE_FORMAT_PCM; /录音的格式waveform.cbSize=0; /方式为 WAVE_FORMAT_PCM时此参数可以忽略waveform.nChannels=1; /声道数 ,数值可为 1或2 waveform.nSamplesPerSec=11025; /
4、采样率 ,数值有 :11025,22050,44100 waveform.wBitsPerSample=8; /采样位 ,数值有 :8,16 waveform.nBlockAlign=waveform.nChannels * waveform.wBitsPerSample / 8; waveform.nAvgBytesPerSec=waveform.nBlockAlign * waveform.nSamplesPerSec; 设置完毕之后,就可以用waveInOpen函数打开输入设备.HWAVEIN hWaveIn; /输入设备句柄if (waveInOpen(&hWaveIn,WAVE_MA
5、PPER,&waveform,(DWORD)this-m_hWnd,NULL,CALLBACK_WINDOW) free(pBuffer1); free(pBuffer2); AfxMessageBox(L无法打开录音设备); return; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 设备可以打开后,就需要 初始化两个输入缓存区的声音文件头了.声音文件头主要是在录音时 ,记录相关的数据,以方便后期的处理.PWAVEHDR
6、 pWaveHdr1,pWaveHdr2; pWaveHdr1-lpData=(LPSTR)pBuffer1; /缓冲区地址pWaveHdr1-dwBufferLength=INP_BUFFER_SIZE; /缓冲区长度pWaveHdr1-dwBytesRecorded=0; pWaveHdr1-dwUser=0; pWaveHdr1-dwFlags=0; pWaveHdr1-dwLoops=1; pWaveHdr1-lpNext=NULL; pWaveHdr1-reserved=0; waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR);
7、 /将缓冲区信息和输入设备相关联waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR) ; /将缓冲区地址和输入设备相关联在对 PWAVEHDR进行赋值时 ,本程序中需要设置的其实只有lpData 和 dwBufferLength.接下来将pWaveHdr2 同 pWaveHdr1 进行相关处理 (略). 由于我们是要将录音数据以文件形式保存到非易失性存储器上,所以在开始录音之前我们需要先建立文件,并且把相关的文件头信息写入(WriteWaveFileHeader是自写函数 ,代码附在文章最后 ). /先写文件头MMRESULT mr; mr
8、=WriteWaveFileHeader(strSavePath,&waveform,0,TRUE); if(mr != MMSYSERR_NOERROR) AfxMessageBox(L文件保存失败 !); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - /停止录音 ,关闭设备waveInReset(hWaveIn); return; /获取文件句柄,方便之后对其添加数据. m_fh = CreateFile(strSave
9、Path, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if( m_fh = INVALID_HANDLE_VALUE ) AfxMessageBox(L添加数据音频数据错误); return ; 一切准备就绪之后,就可以调用函数waveInStart() 来进行真正的录音了:waveInStart(hWaveIn); 在录音过程中,有三个回调函数系统会自动调用,分别是:OnMM_WIM_OPEN(),OnMM_WIM_DATA()和 OnMM_WIM_CLOSE().顾名思义 ,这三个函数分别在这三种情况下调用
10、:开始录音时 ;缓冲区用完时;录音关闭时 .其中OnMM_WIM_OPEN()和 OnMM_WIM_CLOSE()只调用一次 . 本程序最重要是对OnMM_WIM_DATA()函数进行处理 . 相关代码如下: void OnMM_WIM_DATA(UINT wParam, LONG lParam) /bEnding是一个外部定义的BOOL 变量 ,用来判断外部是否按下停止 按钮 ;是则不分配内存 ,直接返回 . if (bEnding) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
11、 4 页,共 12 页 - - - - - - - - - /关闭录音waveInClose (hWaveIn) ; return ; /dwDataLength是一个外部定义的DWORD变量 ,用来记录录音数据的长度. dwDataLength += (PWAVEHDR) lParam)-dwBytesRecorded ; /将内存数据写到文件中/pSaveBuffer是外部定义的一个临时缓存pSaveBuffer=(PBYTE)realloc (pSaveBuffer, (PWAVEHDR) lParam)-dwBytesRecorded); CopyMemory (pSaveBuffer
12、, (PWAVEHDR) lParam)-lpData,(PWAVEHDR) lParam)-dwBytesRecorded) ; m_bAddSuc=AddWaveFileDate(m_fh,pSaveBuffer,(PWAVEHDR) lParam)-dwBytesRecorded); if(m_bAddSuc=FALSE) /加入不成功waveInClose (hWaveIn) ; return ; /加入新的内存waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR) ; 录音完毕则调用OnMM_WIM_CLOSE(),
13、我们在此函数体里进行相关的收尾清除工作名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - void CRecordDlg:OnMM_WIM_CLOSE(UINT wParam, LONG lParam) /关闭文件句柄CloseHandle(m_fh); if (0=dwDataLength) /长度为 0,可能录音失败return; /重写一次文件头,将文件长度写入文件中MMRESULT mr; mr=WriteWaveFile
14、Header(strSavePath,&waveform,dwDataLength,FALSE); if(mr != MMSYSERR_NOERROR) AfxMessageBox(L重写文件头失败!); return; waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR) ; waveInUnprepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR) ; free (pBuffer1) ; free (pBuffer2) ; 至此 ,整个录音程序结束. 附录 :相关文件函数/* 名师
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年录音小程序 2022 录音 程序
限制150内